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

Side by Side Diff: components/offline_pages/offline_page_model_impl.cc

Issue 2384423003: [Offline pages] Resetting offline page metadata store if initial load fails (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/offline_pages/offline_page_model_impl.h" 5 #include "components/offline_pages/offline_page_model_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 1, kMaxOpenedPageHistogramBucket.InMinutes(), 50, 298 1, kMaxOpenedPageHistogramBucket.InMinutes(), 50,
299 base::HistogramBase::kUmaTargetedHistogramFlag); 299 base::HistogramBase::kUmaTargetedHistogramFlag);
300 histogram->Add( 300 histogram->Add(
301 (access_time - offline_page_item.last_access_time).InMinutes()); 301 (access_time - offline_page_item.last_access_time).InMinutes());
302 } 302 }
303 303
304 } // namespace 304 } // namespace
305 305
306 // protected 306 // protected
307 OfflinePageModelImpl::OfflinePageModelImpl() 307 OfflinePageModelImpl::OfflinePageModelImpl()
308 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} 308 : OfflinePageModel(),
309 is_loaded_(false),
310 store_reset_attempts_left_(3),
311 weak_ptr_factory_(this) {}
309 312
310 OfflinePageModelImpl::OfflinePageModelImpl( 313 OfflinePageModelImpl::OfflinePageModelImpl(
311 std::unique_ptr<OfflinePageMetadataStore> store, 314 std::unique_ptr<OfflinePageMetadataStore> store,
312 const base::FilePath& archives_dir, 315 const base::FilePath& archives_dir,
313 const scoped_refptr<base::SequencedTaskRunner>& task_runner) 316 const scoped_refptr<base::SequencedTaskRunner>& task_runner)
314 : store_(std::move(store)), 317 : store_(std::move(store)),
315 archives_dir_(archives_dir), 318 archives_dir_(archives_dir),
316 is_loaded_(false), 319 is_loaded_(false),
317 policy_controller_(new ClientPolicyController()), 320 policy_controller_(new ClientPolicyController()),
318 archive_manager_(new ArchiveManager(archives_dir, task_runner)), 321 archive_manager_(new ArchiveManager(archives_dir, task_runner)),
322 store_reset_attempts_left_(3),
319 testing_clock_(nullptr), 323 testing_clock_(nullptr),
320 weak_ptr_factory_(this) { 324 weak_ptr_factory_(this) {
321 archive_manager_->EnsureArchivesDirCreated( 325 archive_manager_->EnsureArchivesDirCreated(
322 base::Bind(&OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone, 326 base::Bind(&OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone,
323 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now())); 327 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()));
324 } 328 }
325 329
326 OfflinePageModelImpl::~OfflinePageModelImpl() {} 330 OfflinePageModelImpl::~OfflinePageModelImpl() {}
327 331
328 void OfflinePageModelImpl::AddObserver(Observer* observer) { 332 void OfflinePageModelImpl::AddObserver(Observer* observer) {
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 797
794 // No need to fire OfflinePageModelChanged event since updating access info 798 // No need to fire OfflinePageModelChanged event since updating access info
795 // should not have any impact to the UI. 799 // should not have any impact to the UI.
796 } 800 }
797 801
798 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone( 802 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
799 const base::TimeTicks& start_time) { 803 const base::TimeTicks& start_time) {
800 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime", 804 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime",
801 base::TimeTicks::Now() - start_time); 805 base::TimeTicks::Now() - start_time);
802 806
803 store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone, 807 store_->GetOfflinePages(
804 weak_ptr_factory_.GetWeakPtr(), 808 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit,
805 start_time)); 809 weak_ptr_factory_.GetWeakPtr(), start_time));
806 } 810 }
807 811
808 void OfflinePageModelImpl::OnLoadDone( 812 void OfflinePageModelImpl::OnGetOfflinePagesDoneForInit(
809 const base::TimeTicks& start_time, 813 const base::TimeTicks& start_time,
810 OfflinePageMetadataStore::LoadStatus load_status, 814 StoreState store_state,
811 const std::vector<OfflinePageItem>& offline_pages) { 815 const std::vector<OfflinePageItem>& offline_pages) {
812 DCHECK(!is_loaded_); 816 DCHECK(!is_loaded_);
813 is_loaded_ = true; 817 UMA_HISTOGRAM_ENUMERATION(
818 "OfflinePages.StoreState", static_cast<int32_t>(store_state),
819 static_cast<int32_t>(StoreState::STORE_STATE_COUNT));
814 820
815 // TODO(jianli): rebuild the store upon failure. 821 if (store_state != StoreState::LOADED) {
822 DVLOG(1) << "Offline pages database loading failed: "
823 << static_cast<int32_t>(store_state);
824 }
816 825
817 if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED) 826 if (store_state == StoreState::FAILED_LOADING && MaybeResetStore(start_time))
818 CacheLoadedData(offline_pages); 827 return;
819 828
820 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime", 829 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime",
821 base::TimeTicks::Now() - start_time); 830 base::TimeTicks::Now() - start_time);
831 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.
832 static_cast<int32_t>(offline_pages.size()));
833
834 CacheLoadedData(offline_pages);
835 is_loaded_ = true;
822 836
823 // Create Storage Manager. 837 // Create Storage Manager.
824 storage_manager_.reset(new OfflinePageStorageManager( 838 storage_manager_.reset(new OfflinePageStorageManager(
825 this, GetPolicyController(), archive_manager_.get())); 839 this, GetPolicyController(), archive_manager_.get()));
826 840
827 // Run all the delayed tasks. 841 // Run all the delayed tasks.
828 for (const auto& delayed_task : delayed_tasks_) 842 for (const auto& delayed_task : delayed_tasks_)
829 delayed_task.Run(); 843 delayed_task.Run();
830 delayed_tasks_.clear(); 844 delayed_tasks_.clear();
831 845
832 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); 846 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this));
833 847
834 CheckMetadataConsistency(); 848 CheckMetadataConsistency();
835 849
836 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 850 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
837 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, 851 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
838 weak_ptr_factory_.GetWeakPtr(), 852 weak_ptr_factory_.GetWeakPtr(),
839 base::Bind(&OfflinePageModelImpl::OnStorageCleared, 853 base::Bind(&OfflinePageModelImpl::OnStorageCleared,
840 weak_ptr_factory_.GetWeakPtr())), 854 weak_ptr_factory_.GetWeakPtr())),
841 kStorageManagerStartingDelay); 855 kStorageManagerStartingDelay);
842 } 856 }
843 857
858 bool OfflinePageModelImpl::MaybeResetStore(const base::TimeTicks& start_time) {
859 if (store_reset_attempts_left_ <= 0)
860 return false;
861
862 store_reset_attempts_left_--;
863 store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreResetDone,
864 weak_ptr_factory_.GetWeakPtr(), start_time));
865 return true;
866 }
867
868 void OfflinePageModelImpl::OnStoreResetDone(const base::TimeTicks& start_time,
869 bool reset_success) {
870 UMA_HISTOGRAM_ENUMERATION(
871 "OfflinePages.StoreState", static_cast<int32_t>(store_->state()),
872 static_cast<int32_t>(StoreState::STORE_STATE_COUNT));
873
874 if (reset_success) {
875 store_->GetOfflinePages(
876 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit,
877 weak_ptr_factory_.GetWeakPtr(), start_time));
878 return;
879 }
880
881 if (store_->state() == StoreState::FAILED_RESET &&
882 MaybeResetStore(start_time)) {
883 return;
884 }
885
886 // Reset failed enough times. Simply initialize the model with no items.
887 OnGetOfflinePagesDoneForInit(start_time, store_->state(),
888 std::vector<OfflinePageItem>());
889 }
890
844 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, 891 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback,
845 SavePageResult result, 892 SavePageResult result,
846 const ClientId& client_id, 893 const ClientId& client_id,
847 int64_t offline_id) { 894 int64_t offline_id) {
848 ReportSavePageResultHistogramAfterSave(client_id, result); 895 ReportSavePageResultHistogramAfterSave(client_id, result);
849 archive_manager_->GetStorageStats( 896 archive_manager_->GetStorageStats(
850 base::Bind(&ReportStorageHistogramsAfterSave)); 897 base::Bind(&ReportStorageHistogramsAfterSave));
851 callback.Run(result, offline_id); 898 callback.Run(result, offline_id);
852 } 899 }
853 900
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 } 1118 }
1072 1119
1073 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); 1120 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task);
1074 } 1121 }
1075 1122
1076 base::Time OfflinePageModelImpl::GetCurrentTime() const { 1123 base::Time OfflinePageModelImpl::GetCurrentTime() const {
1077 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); 1124 return testing_clock_ ? testing_clock_->Now() : base::Time::Now();
1078 } 1125 }
1079 1126
1080 } // namespace offline_pages 1127 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698