Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(422)

Unified Diff: components/offline_pages/offline_page_metadata_store_sql.cc

Issue 2384423003: [Offline pages] Resetting offline page metadata store if initial load fails (Closed)
Patch Set: Rebased and comments addressed Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/offline_pages/offline_page_metadata_store_sql.cc
diff --git a/components/offline_pages/offline_page_metadata_store_sql.cc b/components/offline_pages/offline_page_metadata_store_sql.cc
index 7e22cd176398c354bfed36fb277db12db2c5cb2c..af45bb16c8735c728e0fc4c5741a3b6527b9b4fb 100644
--- a/components/offline_pages/offline_page_metadata_store_sql.cc
+++ b/components/offline_pages/offline_page_metadata_store_sql.cc
@@ -254,22 +254,6 @@ bool InitDatabase(sql::Connection* db, base::FilePath path) {
return CreateSchema(db);
}
-void NotifyLoadResult(scoped_refptr<base::SingleThreadTaskRunner> runner,
- const OfflinePageMetadataStore::LoadCallback& callback,
- OfflinePageMetadataStore::LoadStatus status,
- const std::vector<OfflinePageItem>& result) {
- // TODO(bburns): Switch to SQL specific UMA metrics.
- UMA_HISTOGRAM_ENUMERATION("OfflinePages.LoadStatus", status,
- OfflinePageMetadataStore::LOAD_STATUS_COUNT);
- if (status == OfflinePageMetadataStore::LOAD_SUCCEEDED) {
- UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount",
- static_cast<int32_t>(result.size()));
- } else {
- DVLOG(1) << "Offline pages database loading failed: " << status;
- }
- runner->PostTask(FROM_HERE, base::Bind(callback, status, result));
-}
-
void OpenConnectionSync(sql::Connection* db,
scoped_refptr<base::SingleThreadTaskRunner> runner,
const base::FilePath& path,
@@ -298,7 +282,7 @@ bool GetPageByOfflineIdSync(sql::Connection* db,
void GetOfflinePagesSync(
sql::Connection* db,
scoped_refptr<base::SingleThreadTaskRunner> runner,
- const OfflinePageMetadataStore::LoadCallback& callback) {
+ const OfflinePageMetadataStore::GetOfflinePagesCallback& callback) {
const char kSql[] = "SELECT * FROM " OFFLINE_PAGES_TABLE_NAME;
sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
@@ -307,14 +291,12 @@ void GetOfflinePagesSync(
while (statement.Step())
result.push_back(MakeOfflinePageItem(&statement));
- if (statement.Succeeded()) {
- NotifyLoadResult(runner, callback, OfflinePageMetadataStore::LOAD_SUCCEEDED,
- result);
- } else {
+ StoreState store_state =
+ statement.Succeeded() ? StoreState::LOADED : StoreState::FAILED_OPERATION;
+ if (!statement.Succeeded())
result.clear();
- NotifyLoadResult(runner, callback,
- OfflinePageMetadataStore::STORE_LOAD_FAILED, result);
- }
+
+ runner->PostTask(FROM_HERE, base::Bind(callback, store_state, result));
}
void AddOfflinePageSync(sql::Connection* db,
@@ -437,12 +419,13 @@ void ResetSync(sql::Connection* db,
bool success = db->Raze();
db->Close();
StoreState state;
- if (success) {
- state = InitDatabase(db, db_file_path) ? StoreState::LOADED
- : StoreState::FAILED_LOADING;
- } else {
+ if (!success)
state = StoreState::FAILED_RESET;
- }
+ else if (InitDatabase(db, db_file_path))
+ state = StoreState::LOADED;
+ else
+ state = StoreState::FAILED_RESET;
+
runner->PostTask(FROM_HERE, base::Bind(callback, state));
}
@@ -466,9 +449,11 @@ OfflinePageMetadataStoreSQL::~OfflinePageMetadataStoreSQL() {
}
void OfflinePageMetadataStoreSQL::GetOfflinePages(
- const LoadCallback& callback) {
- if (!CheckDb(base::Bind(
- callback, STORE_INIT_FAILED, std::vector<OfflinePageItem>()))) {
+ const GetOfflinePagesCallback& callback) {
+ if (!CheckStoreState()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::Bind(callback, state(), std::vector<OfflinePageItem>()));
return;
}
@@ -480,8 +465,11 @@ void OfflinePageMetadataStoreSQL::GetOfflinePages(
void OfflinePageMetadataStoreSQL::AddOfflinePage(
const OfflinePageItem& offline_page,
const AddCallback& callback) {
- if (!CheckDb(base::Bind(callback, ItemActionStatus::STORE_ERROR)))
+ if (!CheckStoreState()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(callback, ItemActionStatus::STORE_ERROR));
return;
+ }
background_task_runner_->PostTask(
FROM_HERE,
@@ -524,8 +512,11 @@ void OfflinePageMetadataStoreSQL::RemoveOfflinePages(
}
void OfflinePageMetadataStoreSQL::Reset(const ResetCallback& callback) {
- if (!CheckDb(base::Bind(callback, false)))
+ if (!CheckStoreState()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ base::Bind(callback, false));
return;
+ }
background_task_runner_->PostTask(
FROM_HERE,
@@ -535,17 +526,6 @@ void OfflinePageMetadataStoreSQL::Reset(const ResetCallback& callback) {
weak_ptr_factory_.GetWeakPtr(), callback)));
}
-StoreState OfflinePageMetadataStoreSQL::state() const {
- return state_;
-}
-
-void OfflinePageMetadataStoreSQL::SetStateForTesting(StoreState state,
- bool reset_db) {
- state_ = state;
- if (reset_db)
- db_.reset(nullptr);
-}
-
void OfflinePageMetadataStoreSQL::OpenConnection() {
DCHECK(!db_);
db_.reset(new sql::Connection());
@@ -565,9 +545,6 @@ void OfflinePageMetadataStoreSQL::OnOpenConnectionDone(StoreState state) {
// Unfortunately we were not able to open DB connection.
if (state != StoreState::LOADED)
db_.reset();
-
- // TODO(fgorski): This might be a place to start store recovery. Alternatively
- // that can be attempted in the OfflinePageModel.
}
void OfflinePageMetadataStoreSQL::OnResetDone(const ResetCallback& callback,
@@ -576,12 +553,21 @@ void OfflinePageMetadataStoreSQL::OnResetDone(const ResetCallback& callback,
callback.Run(state == StoreState::LOADED);
}
-bool OfflinePageMetadataStoreSQL::CheckDb(const base::Closure& callback) {
- if (!db_.get() || state_ != StoreState::LOADED) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback);
- return false;
- }
- return true;
+bool OfflinePageMetadataStoreSQL::CheckStoreState() {
+ // If db is null, store cannot be loaded.
+ DCHECK(db_.get() || state_ != StoreState::LOADED);
+ return db_.get() && state_ == StoreState::LOADED;
+}
+
+StoreState OfflinePageMetadataStoreSQL::state() const {
+ return state_;
+}
+
+void OfflinePageMetadataStoreSQL::SetStateForTesting(StoreState state,
+ bool reset_db) {
+ state_ = state;
+ if (reset_db)
+ db_.reset(nullptr);
}
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698