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

Unified Diff: components/offline_pages/offline_page_metadata_store_sql.cc

Issue 2497703002: [Offline pages] Resetting offline page metadata store to handle LOAD/INIT failures (Closed)
Patch Set: Fixing newly added test Created 4 years, 1 month 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 dea0649e81cff8c461562d55b73db83c766960fb..4fbd76519f5823d7e65fe7d19a132a6f3db15266 100644
--- a/components/offline_pages/offline_page_metadata_store_sql.cc
+++ b/components/offline_pages/offline_page_metadata_store_sql.cc
@@ -289,16 +289,15 @@ void NotifyLoadResult(scoped_refptr<base::SingleThreadTaskRunner> runner,
} else {
DVLOG(1) << "Offline pages database loading failed: " << status;
}
- runner->PostTask(FROM_HERE, base::Bind(callback, status, result));
+ runner->PostTask(FROM_HERE, base::Bind(callback, result));
}
void OpenConnectionSync(sql::Connection* db,
scoped_refptr<base::SingleThreadTaskRunner> runner,
const base::FilePath& path,
- const base::Callback<void(StoreState)>& callback) {
- StoreState state =
- InitDatabase(db, path) ? StoreState::LOADED : StoreState::FAILED_LOADING;
- runner->PostTask(FROM_HERE, base::Bind(callback, state));
+ const base::Callback<void(bool)>& callback) {
+ bool success = InitDatabase(db, path);
+ runner->PostTask(FROM_HERE, base::Bind(callback, success));
}
bool GetPageByOfflineIdSync(sql::Connection* db,
@@ -454,18 +453,15 @@ void RemoveOfflinePagesSync(
void ResetSync(sql::Connection* db,
const base::FilePath& db_file_path,
scoped_refptr<base::SingleThreadTaskRunner> runner,
- const base::Callback<void(StoreState)>& callback) {
+ const base::Callback<void(bool)>& callback) {
// This method deletes the content of the whole store and reinitializes it.
- bool success = db->Raze();
- db->Close();
- StoreState state;
- if (success) {
- state = InitDatabase(db, db_file_path) ? StoreState::LOADED
- : StoreState::FAILED_LOADING;
- } else {
- state = StoreState::FAILED_RESET;
+ bool success = true;
+ if (db) {
+ success = db->Raze();
+ db->Close();
}
- runner->PostTask(FROM_HERE, base::Bind(callback, state));
+ success = base::DeleteFile(db_file_path, true /*recursive*/) && success;
+ runner->PostTask(FROM_HERE, base::Bind(callback, success));
}
} // anonymous namespace
@@ -477,7 +473,6 @@ OfflinePageMetadataStoreSQL::OfflinePageMetadataStoreSQL(
db_file_path_(path.AppendASCII("OfflinePages.db")),
state_(StoreState::NOT_LOADED),
weak_ptr_factory_(this) {
- OpenConnection();
}
OfflinePageMetadataStoreSQL::~OfflinePageMetadataStoreSQL() {
@@ -487,10 +482,23 @@ OfflinePageMetadataStoreSQL::~OfflinePageMetadataStoreSQL() {
}
}
+void OfflinePageMetadataStoreSQL::Initialize(
+ const InitializeCallback& callback) {
+ DCHECK(!db_);
+ db_.reset(new sql::Connection());
+ background_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&OpenConnectionSync, db_.get(),
+ base::ThreadTaskRunnerHandle::Get(), db_file_path_,
+ base::Bind(&OfflinePageMetadataStoreSQL::OnOpenConnectionDone,
+ weak_ptr_factory_.GetWeakPtr(), callback)));
+}
+
void OfflinePageMetadataStoreSQL::GetOfflinePages(
const LoadCallback& callback) {
- if (!CheckDb(base::Bind(
- callback, STORE_INIT_FAILED, std::vector<OfflinePageItem>()))) {
+ if (!CheckDb()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(callback, std::vector<OfflinePageItem>()));
return;
}
@@ -502,8 +510,11 @@ void OfflinePageMetadataStoreSQL::GetOfflinePages(
void OfflinePageMetadataStoreSQL::AddOfflinePage(
const OfflinePageItem& offline_page,
const AddCallback& callback) {
- if (!CheckDb(base::Bind(callback, ItemActionStatus::STORE_ERROR)))
+ if (!CheckDb()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(callback, ItemActionStatus::STORE_ERROR));
return;
+ }
background_task_runner_->PostTask(
FROM_HERE,
@@ -514,7 +525,7 @@ void OfflinePageMetadataStoreSQL::AddOfflinePage(
void OfflinePageMetadataStoreSQL::UpdateOfflinePages(
const std::vector<OfflinePageItem>& pages,
const UpdateCallback& callback) {
- if (!db_.get()) {
+ if (!CheckDb()) {
PostStoreErrorForAllPages(base::ThreadTaskRunnerHandle::Get(), pages,
callback);
return;
@@ -529,7 +540,11 @@ void OfflinePageMetadataStoreSQL::UpdateOfflinePages(
void OfflinePageMetadataStoreSQL::RemoveOfflinePages(
const std::vector<int64_t>& offline_ids,
const UpdateCallback& callback) {
- DCHECK(db_.get());
+ if (!CheckDb()) {
+ PostStoreErrorForAllIds(base::ThreadTaskRunnerHandle::Get(), offline_ids,
+ callback);
+ return;
+ }
if (offline_ids.empty()) {
// Nothing to do, but post a callback instead of calling directly
@@ -546,9 +561,6 @@ void OfflinePageMetadataStoreSQL::RemoveOfflinePages(
}
void OfflinePageMetadataStoreSQL::Reset(const ResetCallback& callback) {
- if (!CheckDb(base::Bind(callback, false)))
- return;
-
background_task_runner_->PostTask(
FROM_HERE,
base::Bind(&ResetSync, db_.get(), db_file_path_,
@@ -568,42 +580,24 @@ void OfflinePageMetadataStoreSQL::SetStateForTesting(StoreState state,
db_.reset(nullptr);
}
-void OfflinePageMetadataStoreSQL::OpenConnection() {
- DCHECK(!db_);
- db_.reset(new sql::Connection());
- background_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&OpenConnectionSync, db_.get(),
- base::ThreadTaskRunnerHandle::Get(), db_file_path_,
- base::Bind(&OfflinePageMetadataStoreSQL::OnOpenConnectionDone,
- weak_ptr_factory_.GetWeakPtr())));
-}
-
-void OfflinePageMetadataStoreSQL::OnOpenConnectionDone(StoreState state) {
+void OfflinePageMetadataStoreSQL::OnOpenConnectionDone(
+ const InitializeCallback& callback,
+ bool success) {
DCHECK(db_.get());
-
- state_ = 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.
+ state_ = success ? StoreState::LOADED : StoreState::FAILED_LOADING;
+ callback.Run(success);
}
void OfflinePageMetadataStoreSQL::OnResetDone(const ResetCallback& callback,
- StoreState state) {
- OnOpenConnectionDone(state);
- callback.Run(state == StoreState::LOADED);
+ bool success) {
+ state_ = success ? StoreState::NOT_LOADED : StoreState::FAILED_RESET;
+ db_.reset();
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ base::Bind(callback, success));
}
-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::CheckDb() {
+ return db_ && state_ == StoreState::LOADED;
}
} // namespace offline_pages
« no previous file with comments | « components/offline_pages/offline_page_metadata_store_sql.h ('k') | components/offline_pages/offline_page_model_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698