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

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: Rebased and comments addressed 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 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 774
771 // No need to fire OfflinePageModelChanged event since updating access info 775 // No need to fire OfflinePageModelChanged event since updating access info
772 // should not have any impact to the UI. 776 // should not have any impact to the UI.
773 } 777 }
774 778
775 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone( 779 void OfflinePageModelImpl::OnEnsureArchivesDirCreatedDone(
776 const base::TimeTicks& start_time) { 780 const base::TimeTicks& start_time) {
777 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime", 781 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ArchiveDirCreationTime",
778 base::TimeTicks::Now() - start_time); 782 base::TimeTicks::Now() - start_time);
779 783
780 store_->GetOfflinePages(base::Bind(&OfflinePageModelImpl::OnLoadDone, 784 store_->GetOfflinePages(
781 weak_ptr_factory_.GetWeakPtr(), 785 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit,
782 start_time)); 786 weak_ptr_factory_.GetWeakPtr(), start_time));
783 } 787 }
784 788
785 void OfflinePageModelImpl::OnLoadDone( 789 void OfflinePageModelImpl::OnGetOfflinePagesDoneForInit(
786 const base::TimeTicks& start_time, 790 const base::TimeTicks& start_time,
787 OfflinePageMetadataStore::LoadStatus load_status, 791 StoreState store_state,
788 const std::vector<OfflinePageItem>& offline_pages) { 792 const std::vector<OfflinePageItem>& offline_pages) {
789 DCHECK(!is_loaded_); 793 DCHECK(!is_loaded_);
790 is_loaded_ = true; 794 UMA_HISTOGRAM_ENUMERATION(
795 "OfflinePages.StoreState", static_cast<int32_t>(store_state),
796 static_cast<int32_t>(StoreState::STORE_STATE_COUNT));
791 797
792 // TODO(jianli): rebuild the store upon failure. 798 if (store_state != StoreState::LOADED) {
799 DVLOG(1) << "Offline pages database loading failed: "
800 << static_cast<int32_t>(store_state);
801 }
793 802
794 if (load_status == OfflinePageMetadataStore::LOAD_SUCCEEDED) 803 if (store_state == StoreState::FAILED_LOADING && MaybeResetStore(start_time))
795 CacheLoadedData(offline_pages); 804 return;
796 805
797 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime", 806 UMA_HISTOGRAM_TIMES("OfflinePages.Model.ConstructionToLoadedEventTime",
798 base::TimeTicks::Now() - start_time); 807 base::TimeTicks::Now() - start_time);
808 UMA_HISTOGRAM_COUNTS("OfflinePages.SavedPageCount",
809 static_cast<int32_t>(offline_pages.size()));
810
811 CacheLoadedData(offline_pages);
812 is_loaded_ = true;
799 813
800 // Create Storage Manager. 814 // Create Storage Manager.
801 storage_manager_.reset(new OfflinePageStorageManager( 815 storage_manager_.reset(new OfflinePageStorageManager(
802 this, GetPolicyController(), archive_manager_.get())); 816 this, GetPolicyController(), archive_manager_.get()));
803 817
804 // Run all the delayed tasks. 818 // Run all the delayed tasks.
805 for (const auto& delayed_task : delayed_tasks_) 819 for (const auto& delayed_task : delayed_tasks_)
806 delayed_task.Run(); 820 delayed_task.Run();
807 delayed_tasks_.clear(); 821 delayed_tasks_.clear();
808 822
809 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); 823 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this));
810 824
811 CheckMetadataConsistency(); 825 CheckMetadataConsistency();
812 826
813 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 827 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
814 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, 828 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
815 weak_ptr_factory_.GetWeakPtr(), 829 weak_ptr_factory_.GetWeakPtr(),
816 base::Bind(&OfflinePageModelImpl::OnStorageCleared, 830 base::Bind(&OfflinePageModelImpl::OnStorageCleared,
817 weak_ptr_factory_.GetWeakPtr())), 831 weak_ptr_factory_.GetWeakPtr())),
818 kStorageManagerStartingDelay); 832 kStorageManagerStartingDelay);
819 } 833 }
820 834
835 bool OfflinePageModelImpl::MaybeResetStore(const base::TimeTicks& start_time) {
836 if (store_reset_attempts_left_ <= 0)
837 return false;
838
839 store_reset_attempts_left_--;
840 store_->Reset(base::Bind(&OfflinePageModelImpl::OnStoreResetDone,
841 weak_ptr_factory_.GetWeakPtr(), start_time));
842 return true;
843 }
844
845 void OfflinePageModelImpl::OnStoreResetDone(const base::TimeTicks& start_time,
846 bool reset_success) {
847 UMA_HISTOGRAM_ENUMERATION(
848 "OfflinePages.StoreState", static_cast<int32_t>(store_->state()),
Dmitry Titov 2016/11/15 20:23:46 There is also another point of logging same UMA in
849 static_cast<int32_t>(StoreState::STORE_STATE_COUNT));
850
851 if (reset_success) {
852 store_->GetOfflinePages(
853 base::Bind(&OfflinePageModelImpl::OnGetOfflinePagesDoneForInit,
854 weak_ptr_factory_.GetWeakPtr(), start_time));
855 return;
856 }
857
858 if (store_->state() == StoreState::FAILED_RESET &&
859 MaybeResetStore(start_time)) {
860 return;
861 }
862
863 // Reset failed enough times. Simply initialize the model with no items.
864 OnGetOfflinePagesDoneForInit(start_time, store_->state(),
865 std::vector<OfflinePageItem>());
866 }
867
821 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, 868 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback,
822 SavePageResult result, 869 SavePageResult result,
823 const ClientId& client_id, 870 const ClientId& client_id,
824 int64_t offline_id) { 871 int64_t offline_id) {
825 ReportSavePageResultHistogramAfterSave(client_id, result); 872 ReportSavePageResultHistogramAfterSave(client_id, result);
826 archive_manager_->GetStorageStats( 873 archive_manager_->GetStorageStats(
827 base::Bind(&ReportStorageHistogramsAfterSave)); 874 base::Bind(&ReportStorageHistogramsAfterSave));
828 callback.Run(result, offline_id); 875 callback.Run(result, offline_id);
829 } 876 }
830 877
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 } 1095 }
1049 1096
1050 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); 1097 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task);
1051 } 1098 }
1052 1099
1053 base::Time OfflinePageModelImpl::GetCurrentTime() const { 1100 base::Time OfflinePageModelImpl::GetCurrentTime() const {
1054 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); 1101 return testing_clock_ ? testing_clock_->Now() : base::Time::Now();
1055 } 1102 }
1056 1103
1057 } // namespace offline_pages 1104 } // namespace offline_pages
OLDNEW
« 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