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

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: Addressing comments form self-review 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 9df2141e42d0a78c368c778df1e86e674993211d..453b95681ec481e2e6c4948983ffca4230e6fabc 100644
--- a/components/offline_pages/offline_page_model_impl.cc
+++ b/components/offline_pages/offline_page_model_impl.cc
@@ -647,7 +647,6 @@ void OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone(
}
void OfflinePageModelImpl::CheckMetadataConsistency() {
- DCHECK(is_loaded_);
archive_manager_->GetAllArchives(
base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths,
weak_ptr_factory_.GetWeakPtr()));
@@ -792,7 +791,7 @@ void OfflinePageModelImpl::OnAddOfflinePageDone(
if (result == SavePageResult::SUCCESS) {
DeleteExistingPagesWithSameURL(offline_page);
} else {
- PostClearStorageIfNeededTask();
+ PostClearStorageIfNeededTask(false /* delayed */);
}
DeletePendingArchiver(archiver);
@@ -816,6 +815,24 @@ void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime",
base::TimeTicks::Now() - start_time);
+ store_->Initialize(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
+ weak_ptr_factory_.GetWeakPtr(), start_time));
+}
+
+void OfflinePageModelImpl::OnStoreInitialized(const base::TimeTicks& start_time,
+ StoreState state) {
+ if (state == StoreState::FAILED_RESET) {
+ CompleteLoad();
+ return;
+ }
+
+ if (state == StoreState::FAILED_LOADING) {
+ store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreInitialized,
+ weak_ptr_factory_.GetWeakPtr(), start_time));
+ return;
+ }
+
+ DCHECK_EQ(state, StoreState::LOADED);
store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone,
weak_ptr_factory_.GetWeakPtr(),
start_time));
@@ -823,39 +840,36 @@ void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
void OfflinePageModelImpl::OnLoadDone(
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);
+ CompleteLoad();
- // 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::CompleteLoad() {
+ 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,
@@ -914,7 +928,7 @@ void OfflinePageModelImpl::OnPagesFoundWithSameURL(
void OfflinePageModelImpl::OnDeleteOldPagesWithSameURL(
DeletePageResult result) {
// TODO(romax) Add UMAs for failure cases.
- PostClearStorageIfNeededTask();
+ PostClearStorageIfNeededTask(false /* delayed */);
}
void OfflinePageModelImpl::DeletePendingArchiver(
@@ -1053,6 +1067,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);
}
@@ -1067,12 +1086,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(

Powered by Google App Engine
This is Rietveld 408576698