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

Unified Diff: components/offline_pages/offline_page_model_impl.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_model_impl.cc
diff --git a/components/offline_pages/offline_page_model_impl.cc b/components/offline_pages/offline_page_model_impl.cc
index 094dab25e128153b166610e74db5f884e2a17c93..86a0994fd4216d1faae25ff83dd7ca11db253132 100644
--- a/components/offline_pages/offline_page_model_impl.cc
+++ b/components/offline_pages/offline_page_model_impl.cc
@@ -646,7 +646,6 @@ void OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone(
}
void OfflinePageModelImpl::CheckMetadataConsistency() {
- DCHECK(is_loaded_);
archive_manager_->GetAllArchives(
base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths,
weak_ptr_factory_.GetWeakPtr()));
@@ -793,7 +792,7 @@ void OfflinePageModelImpl::OnAddOfflinePageDone(
if (result == SavePageResult::SUCCESS) {
DeleteExistingPagesWithSameURL(offline_page);
} else {
- PostClearStorageIfNeededTask();
+ PostClearStorageIfNeededTask(false /* delayed */);
}
DeletePendingArchiver(archiver);
@@ -817,46 +816,83 @@ void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime",
base::TimeTicks::Now() - start_time);
- store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone,
- weak_ptr_factory_.GetWeakPtr(),
- start_time));
+ const int kResetAttemptsLeft = 1;
+ store_->Initialize(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
+ weak_ptr_factory_.GetWeakPtr(), start_time,
+ kResetAttemptsLeft));
+}
+
+void OfflinePageModelImpl::OnStoreInitialized(const base::TimeTicks& start_time,
+ int reset_attempts_left,
+ bool success) {
+ if (success) {
+ DCHECK_EQ(store_->state(), StoreState::LOADED);
+ store_->GetOfflinePages(
+ base::Bind(&OfflinePageModelImpl::OnInitialGetOfflinePagesDone,
+ weak_ptr_factory_.GetWeakPtr(), start_time));
+ return;
+ }
+
+ DCHECK_EQ(store_->state(), StoreState::FAILED_LOADING);
+ // If there are no more reset attempts left, stop here.
+ if (reset_attempts_left == 0) {
+ FinalizeModelLoad();
+ return;
+ }
+
+ // Otherwise reduce the remaining attempts counter and reset store.
+ store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreResetDone,
+ weak_ptr_factory_.GetWeakPtr(), start_time,
+ reset_attempts_left - 1));
+}
+
+void OfflinePageModelImpl::OnStoreResetDone(const base::TimeTicks& start_time,
+ int reset_attempts_left,
+ bool success) {
+ if (success) {
+ DCHECK_EQ(store_->state(), StoreState::NOT_LOADED);
+ store_->Initialize(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
+ weak_ptr_factory_.GetWeakPtr(), start_time,
+ reset_attempts_left));
+ return;
+ }
+
+ DCHECK_EQ(store_->state(), StoreState::FAILED_RESET);
+ FinalizeModelLoad();
}
-void OfflinePageModelImpl::OnLoadDone(
+void OfflinePageModelImpl::OnInitialGetOfflinePagesDone(
const base::TimeTicks& start_time,
- OfflinePageMetadataStore::LoadStatus load_status,
const std::vector<OfflinePageItem>& offline_pages) {
DCHECK(!is_loaded_);
- is_loaded_ = true;
-
- // TODO(jianli): rebuild the store upon failure.
-
- if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED)
- CacheLoadedData(offline_pages);
UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime",
base::TimeTicks::Now() - start_time);
- // Create Storage Manager.
- storage_manager_.reset(new OfflinePageStorageManager(
- this, GetPolicyController(), archive_manager_.get()));
+ CacheLoadedData(offline_pages);
+ FinalizeModelLoad();
- // Run all the delayed tasks.
- for (const auto& delayed_task : delayed_tasks_)
- delayed_task.Run();
- delayed_tasks_.clear();
+ // Ensure necessary cleanup operations are started.
+ CheckMetadataConsistency();
+}
+
+void OfflinePageModelImpl::FinalizeModelLoad() {
+ is_loaded_ = true;
+ // All actions below are meant to be taken regardless of successful load of
+ // the store.
+
+ // Inform observers the load is done.
for (Observer& observer : observers_)
observer.OfflinePageModelLoaded(this);
- CheckMetadataConsistency();
+ // Run all the delayed tasks.
+ for (const auto& delayed_task : delayed_tasks_)
+ delayed_task.Run();
+ delayed_tasks_.clear();
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
- weak_ptr_factory_.GetWeakPtr(),
- base::Bind(&OfflinePageModelImpl::OnStorageCleared,
- weak_ptr_factory_.GetWeakPtr())),
- kStorageManagerStartingDelay);
+ // Clear storage.
+ PostClearStorageIfNeededTask(true /* delayed */);
}
void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback,
@@ -915,7 +951,7 @@ void OfflinePageModelImpl::OnPagesFoundWithSameURL(
void OfflinePageModelImpl::OnDeleteOldPagesWithSameURL(
DeletePageResult result) {
// TODO(romax) Add UMAs for failure cases.
- PostClearStorageIfNeededTask();
+ PostClearStorageIfNeededTask(false /* delayed */);
}
void OfflinePageModelImpl::DeletePendingArchiver(
@@ -1054,6 +1090,11 @@ void OfflinePageModelImpl::CacheLoadedData(
void OfflinePageModelImpl::ClearStorageIfNeeded(
const ClearStorageCallback& callback) {
+ // Create Storage Manager if necessary.
+ if (!storage_manager_) {
+ storage_manager_.reset(new OfflinePageStorageManager(
+ this, GetPolicyController(), archive_manager_.get()));
+ }
storage_manager_->ClearPagesIfNeeded(callback);
}
@@ -1068,12 +1109,15 @@ void OfflinePageModelImpl::OnStorageCleared(size_t expired_page_count,
}
}
-void OfflinePageModelImpl::PostClearStorageIfNeededTask() {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
+void OfflinePageModelImpl::PostClearStorageIfNeededTask(bool delayed) {
+ base::TimeDelta delay =
+ delayed ? kStorageManagerStartingDelay : base::TimeDelta();
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
weak_ptr_factory_.GetWeakPtr(),
base::Bind(&OfflinePageModelImpl::OnStorageCleared,
- weak_ptr_factory_.GetWeakPtr())));
+ weak_ptr_factory_.GetWeakPtr())),
+ delay);
}
bool OfflinePageModelImpl::IsRemovedOnCacheReset(
« no previous file with comments | « components/offline_pages/offline_page_model_impl.h ('k') | components/offline_pages/offline_page_model_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698