Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |