Chromium Code Reviews| 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 ce697958ec33545ca0a7f7cfafcfcdca441cddc1..92c4b7b8fbd882140263d37da82a38fc49406948 100644 |
| --- a/components/offline_pages/offline_page_model_impl.cc |
| +++ b/components/offline_pages/offline_page_model_impl.cc |
| @@ -305,7 +305,10 @@ void ReportPageHistogramsAfterAccess(const OfflinePageItem& offline_page_item, |
| // protected |
| OfflinePageModelImpl::OfflinePageModelImpl() |
| - : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} |
| + : OfflinePageModel(), |
| + is_loaded_(false), |
| + store_reset_attempts_left_(3), |
| + weak_ptr_factory_(this) {} |
| OfflinePageModelImpl::OfflinePageModelImpl( |
| std::unique_ptr<OfflinePageMetadataStore> store, |
| @@ -316,6 +319,7 @@ OfflinePageModelImpl::OfflinePageModelImpl( |
| is_loaded_(false), |
| policy_controller_(new ClientPolicyController()), |
| archive_manager_(new ArchiveManager(archives_dir, task_runner)), |
| + store_reset_attempts_left_(3), |
| testing_clock_(nullptr), |
| weak_ptr_factory_(this) { |
| archive_manager_->EnsureArchivesDirCreated( |
| @@ -800,25 +804,35 @@ 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)); |
| + store_->GetOfflinePages( |
| + base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit, |
| + weak_ptr_factory_.GetWeakPtr(), start_time)); |
| } |
| -void OfflinePageModelImpl::OnLoadDone( |
| +void OfflinePageModelImpl::OnGetOfflinePagesDoneForInit( |
| const base::TimeTicks& start_time, |
| - OfflinePageMetadataStore::LoadStatus load_status, |
| + StoreState store_state, |
| const std::vector<OfflinePageItem>& offline_pages) { |
| DCHECK(!is_loaded_); |
| - is_loaded_ = true; |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "OfflinePages.StoreState", static_cast<int32_t>(store_state), |
| + static_cast<int32_t>(StoreState::STORE_STATE_COUNT)); |
| - // TODO(jianli): rebuild the store upon failure. |
| + if (store_state != StoreState::LOADED) { |
| + DVLOG(1) << "Offline pages database loading failed: " |
| + << static_cast<int32_t>(store_state); |
| + } |
| - if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED) |
| - CacheLoadedData(offline_pages); |
| + if (store_state == StoreState::FAILED_LOADING && MaybeResetStore(start_time)) |
| + return; |
| UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime", |
| base::TimeTicks::Now() - start_time); |
| + UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount", |
|
Mark P
2016/10/12 16:04:12
I notice this moved from offline_page_metadata_sto
fgorski
2016/10/12 20:44:09
Yes, because we are going to be calling the other
Mark P
2016/10/12 22:12:15
Acknowledged.
|
| + static_cast<int32_t>(offline_pages.size())); |
| + |
| + CacheLoadedData(offline_pages); |
| + is_loaded_ = true; |
| // Create Storage Manager. |
| storage_manager_.reset(new OfflinePageStorageManager( |
| @@ -841,6 +855,39 @@ void OfflinePageModelImpl::OnLoadDone( |
| kStorageManagerStartingDelay); |
| } |
| +bool OfflinePageModelImpl::MaybeResetStore(const base::TimeTicks& start_time) { |
| + if (store_reset_attempts_left_ <= 0) |
| + return false; |
| + |
| + store_reset_attempts_left_--; |
| + store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreResetDone, |
| + weak_ptr_factory_.GetWeakPtr(), start_time)); |
| + return true; |
| +} |
| + |
| +void OfflinePageModelImpl::OnStoreResetDone(const base::TimeTicks& start_time, |
| + bool reset_success) { |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "OfflinePages.StoreState", static_cast<int32_t>(store_->state()), |
| + static_cast<int32_t>(StoreState::STORE_STATE_COUNT)); |
| + |
| + if (reset_success) { |
| + store_->GetOfflinePages( |
| + base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit, |
| + weak_ptr_factory_.GetWeakPtr(), start_time)); |
| + return; |
| + } |
| + |
| + if (store_->state() == StoreState::FAILED_RESET && |
| + MaybeResetStore(start_time)) { |
| + return; |
| + } |
| + |
| + // Reset failed enough times. Simply initialize the model with no items. |
| + OnGetOfflinePagesDoneForInit(start_time, store_->state(), |
| + std::vector<OfflinePageItem>()); |
| +} |
| + |
| void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| SavePageResult result, |
| const ClientId& client_id, |