| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 int percentage_of_free = static_cast<int>( | 128 int percentage_of_free = static_cast<int>( |
| 129 1.0 * storage_stats.total_archives_size / | 129 1.0 * storage_stats.total_archives_size / |
| 130 (storage_stats.total_archives_size + storage_stats.free_disk_space) * | 130 (storage_stats.total_archives_size + storage_stats.free_disk_space) * |
| 131 100); | 131 100); |
| 132 UMA_HISTOGRAM_PERCENTAGE( | 132 UMA_HISTOGRAM_PERCENTAGE( |
| 133 "OfflinePages.DeletePage.TotalPageSizeAsPercentageOfFreeSpace", | 133 "OfflinePages.DeletePage.TotalPageSizeAsPercentageOfFreeSpace", |
| 134 percentage_of_free); | 134 percentage_of_free); |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 | 137 |
| 138 void ReportSavePageResultHistogramAfterSave(const ClientId& client_id, | |
| 139 SavePageResult result) { | |
| 140 // The histogram below is an expansion of the UMA_HISTOGRAM_ENUMERATION | |
| 141 // macro adapted to allow for a dynamically suffixed histogram name. | |
| 142 // Note: The factory creates and owns the histogram. | |
| 143 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( | |
| 144 AddHistogramSuffix(client_id, "OfflinePages.SavePageResult"), | |
| 145 1, | |
| 146 static_cast<int>(SavePageResult::RESULT_COUNT), | |
| 147 static_cast<int>(SavePageResult::RESULT_COUNT) + 1, | |
| 148 base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 149 histogram->Add(static_cast<int>(result)); | |
| 150 } | |
| 151 | |
| 152 void ReportPageHistogramAfterSave(const OfflinePageItem& offline_page) { | |
| 153 // The histogram below is an expansion of the UMA_HISTOGRAM_TIMES | |
| 154 // macro adapted to allow for a dynamically suffixed histogram name. | |
| 155 // Note: The factory creates and owns the histogram. | |
| 156 base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( | |
| 157 AddHistogramSuffix(offline_page.client_id, "OfflinePages.SavePageTime"), | |
| 158 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(10), | |
| 159 50, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 160 histogram->AddTime(base::Time::Now() - offline_page.creation_time); | |
| 161 | |
| 162 // The histogram below is an expansion of the UMA_HISTOGRAM_CUSTOM_COUNTS | |
| 163 // macro adapted to allow for a dynamically suffixed histogram name. | |
| 164 // Note: The factory creates and owns the histogram. | |
| 165 // Reported as Kb between 1Kb and 10Mb. | |
| 166 histogram = base::Histogram::FactoryGet( | |
| 167 AddHistogramSuffix(offline_page.client_id, "OfflinePages.PageSize"), | |
| 168 1, 10000, 50, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 169 histogram->Add(offline_page.file_size / 1024); | |
| 170 } | |
| 171 | |
| 172 void ReportPageHistogramsAfterDelete( | |
| 173 const std::map<int64_t, OfflinePageItem>& offline_pages, | |
| 174 const std::vector<int64_t>& deleted_offline_ids) { | |
| 175 const int max_minutes = base::TimeDelta::FromDays(365).InMinutes(); | |
| 176 base::Time now = base::Time::Now(); | |
| 177 int64_t total_size = 0; | |
| 178 for (int64_t offline_id : deleted_offline_ids) { | |
| 179 auto iter = offline_pages.find(offline_id); | |
| 180 if (iter == offline_pages.end()) | |
| 181 continue; | |
| 182 total_size += iter->second.file_size; | |
| 183 ClientId client_id = iter->second.client_id; | |
| 184 | |
| 185 // The histograms below are an expansion of the UMA_HISTOGRAM_CUSTOM_COUNTS | |
| 186 // macro adapted to allow for a dynamically suffixed histogram name. | |
| 187 // Note: The factory creates and owns the histogram. | |
| 188 base::HistogramBase* histogram = base::Histogram::FactoryGet( | |
| 189 AddHistogramSuffix(client_id, "OfflinePages.PageLifetime"), | |
| 190 1, max_minutes, 100, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 191 histogram->Add((now - iter->second.creation_time).InMinutes()); | |
| 192 | |
| 193 histogram = base::Histogram::FactoryGet( | |
| 194 AddHistogramSuffix( | |
| 195 client_id, "OfflinePages.DeletePage.TimeSinceLastOpen"), | |
| 196 1, max_minutes, 100, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 197 histogram->Add((now - iter->second.last_access_time).InMinutes()); | |
| 198 | |
| 199 histogram = base::Histogram::FactoryGet( | |
| 200 AddHistogramSuffix( | |
| 201 client_id, "OfflinePages.DeletePage.LastOpenToCreated"), | |
| 202 1, max_minutes, 100, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 203 histogram->Add( | |
| 204 (iter->second.last_access_time - iter->second.creation_time). | |
| 205 InMinutes()); | |
| 206 | |
| 207 // Reported as Kb between 1Kb and 10Mb. | |
| 208 histogram = base::Histogram::FactoryGet( | |
| 209 AddHistogramSuffix(client_id, "OfflinePages.DeletePage.PageSize"), | |
| 210 1, 10000, 50, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 211 histogram->Add(iter->second.file_size / 1024); | |
| 212 | |
| 213 histogram = base::Histogram::FactoryGet( | |
| 214 AddHistogramSuffix(client_id, "OfflinePages.DeletePage.AccessCount"), | |
| 215 1, 1000000, 50, base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 216 histogram->Add(iter->second.access_count); | |
| 217 } | |
| 218 | |
| 219 if (deleted_offline_ids.size() > 1) { | |
| 220 UMA_HISTOGRAM_COUNTS("OfflinePages.BatchDelete.Count", | |
| 221 static_cast<int32_t>(deleted_offline_ids.size())); | |
| 222 UMA_HISTOGRAM_MEMORY_KB( | |
| 223 "OfflinePages.BatchDelete.TotalPageSize", total_size / 1024); | |
| 224 } | |
| 225 } | |
| 226 | |
| 227 void ReportPageHistogramsAfterAccess(const OfflinePageItem& offline_page_item) { | |
| 228 // The histogram below is an expansion of the UMA_HISTOGRAM_CUSTOM_COUNTS | |
| 229 // macro adapted to allow for a dynamically suffixed histogram name. | |
| 230 // Note: The factory creates and owns the histogram. | |
| 231 base::HistogramBase* histogram = base::Histogram::FactoryGet( | |
| 232 AddHistogramSuffix( | |
| 233 offline_page_item.client_id, | |
| 234 offline_page_item.access_count == 0 ? | |
| 235 "OfflinePages.FirstOpenSinceCreated" : | |
| 236 "OfflinePages.OpenSinceLastOpen"), | |
| 237 1, kMaxOpenedPageHistogramBucket.InMinutes(), 50, | |
| 238 base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 239 histogram->Add( | |
| 240 (base::Time::Now() - offline_page_item.last_access_time).InMinutes()); | |
| 241 } | |
| 242 | |
| 243 } // namespace | 138 } // namespace |
| 244 | 139 |
| 245 // protected | 140 // protected |
| 246 OfflinePageModelImpl::OfflinePageModelImpl() | 141 OfflinePageModelImpl::OfflinePageModelImpl() |
| 247 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} | 142 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} |
| 248 | 143 |
| 249 OfflinePageModelImpl::OfflinePageModelImpl( | 144 OfflinePageModelImpl::OfflinePageModelImpl( |
| 250 std::unique_ptr<OfflinePageMetadataStore> store, | 145 std::unique_ptr<OfflinePageMetadataStore> store, |
| 251 const base::FilePath& archives_dir, | 146 const base::FilePath& archives_dir, |
| 252 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 147 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { | 201 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { |
| 307 DCHECK(is_loaded_); | 202 DCHECK(is_loaded_); |
| 308 auto iter = offline_pages_.find(offline_id); | 203 auto iter = offline_pages_.find(offline_id); |
| 309 if (iter == offline_pages_.end()) | 204 if (iter == offline_pages_.end()) |
| 310 return; | 205 return; |
| 311 | 206 |
| 312 // Make a copy of the cached item and update it. The cached item should only | 207 // Make a copy of the cached item and update it. The cached item should only |
| 313 // be updated upon the successful store operation. | 208 // be updated upon the successful store operation. |
| 314 OfflinePageItem offline_page_item = iter->second; | 209 OfflinePageItem offline_page_item = iter->second; |
| 315 | 210 |
| 316 ReportPageHistogramsAfterAccess(offline_page_item); | 211 base::Time now = base::Time::Now(); |
| 212 base::TimeDelta time_since_last_accessed = |
| 213 now - offline_page_item.last_access_time; |
| 317 | 214 |
| 318 offline_page_item.last_access_time = base::Time::Now(); | 215 // When the access account is still zero, the page is opened for the first |
| 216 // time since its creation. |
| 217 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 218 AddHistogramSuffix(offline_page_item.client_id, |
| 219 (offline_page_item.access_count == 0) |
| 220 ? "OfflinePages.FirstOpenSinceCreated" |
| 221 : "OfflinePages.OpenSinceLastOpen") |
| 222 .c_str(), |
| 223 time_since_last_accessed.InMinutes(), 1, |
| 224 kMaxOpenedPageHistogramBucket.InMinutes(), 50); |
| 225 |
| 226 offline_page_item.last_access_time = now; |
| 319 offline_page_item.access_count++; | 227 offline_page_item.access_count++; |
| 320 | 228 |
| 321 store_->AddOrUpdateOfflinePage( | 229 store_->AddOrUpdateOfflinePage( |
| 322 offline_page_item, | 230 offline_page_item, |
| 323 base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, | 231 base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, |
| 324 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); | 232 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); |
| 325 } | 233 } |
| 326 | 234 |
| 327 void OfflinePageModelImpl::DeletePagesByOfflineId( | 235 void OfflinePageModelImpl::DeletePagesByOfflineId( |
| 328 const std::vector<int64_t>& offline_ids, | 236 const std::vector<int64_t>& offline_ids, |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 | 616 |
| 709 void OfflinePageModelImpl::OnAddOfflinePageDone( | 617 void OfflinePageModelImpl::OnAddOfflinePageDone( |
| 710 OfflinePageArchiver* archiver, | 618 OfflinePageArchiver* archiver, |
| 711 const SavePageCallback& callback, | 619 const SavePageCallback& callback, |
| 712 const OfflinePageItem& offline_page, | 620 const OfflinePageItem& offline_page, |
| 713 bool success) { | 621 bool success) { |
| 714 SavePageResult result; | 622 SavePageResult result; |
| 715 if (success) { | 623 if (success) { |
| 716 offline_pages_[offline_page.offline_id] = offline_page; | 624 offline_pages_[offline_page.offline_id] = offline_page; |
| 717 result = SavePageResult::SUCCESS; | 625 result = SavePageResult::SUCCESS; |
| 718 ReportPageHistogramAfterSave(offline_page); | 626 UMA_HISTOGRAM_TIMES( |
| 627 AddHistogramSuffix(offline_page.client_id, "OfflinePages.SavePageTime") |
| 628 .c_str(), |
| 629 base::Time::Now() - offline_page.creation_time); |
| 630 // 50 buckets capped between 1Kb and 10Mb. |
| 631 UMA_HISTOGRAM_COUNTS_10000( |
| 632 AddHistogramSuffix(offline_page.client_id, "OfflinePages.PageSize") |
| 633 .c_str(), |
| 634 offline_page.file_size / 1024); |
| 719 } else { | 635 } else { |
| 720 result = SavePageResult::STORE_FAILURE; | 636 result = SavePageResult::STORE_FAILURE; |
| 721 } | 637 } |
| 722 InformSavePageDone(callback, result, offline_page.client_id, | 638 InformSavePageDone(callback, result, offline_page.client_id, |
| 723 offline_page.offline_id); | 639 offline_page.offline_id); |
| 724 DeletePendingArchiver(archiver); | 640 DeletePendingArchiver(archiver); |
| 725 | 641 |
| 726 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this)); | 642 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this)); |
| 727 } | 643 } |
| 728 | 644 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 weak_ptr_factory_.GetWeakPtr(), | 695 weak_ptr_factory_.GetWeakPtr(), |
| 780 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 696 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 781 weak_ptr_factory_.GetWeakPtr())), | 697 weak_ptr_factory_.GetWeakPtr())), |
| 782 kStorageManagerStartingDelay); | 698 kStorageManagerStartingDelay); |
| 783 } | 699 } |
| 784 | 700 |
| 785 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, | 701 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| 786 SavePageResult result, | 702 SavePageResult result, |
| 787 const ClientId& client_id, | 703 const ClientId& client_id, |
| 788 int64_t offline_id) { | 704 int64_t offline_id) { |
| 789 ReportSavePageResultHistogramAfterSave(client_id, result); | 705 UMA_HISTOGRAM_ENUMERATION( |
| 706 AddHistogramSuffix(client_id, "OfflinePages.SavePageResult").c_str(), |
| 707 static_cast<int>(result), static_cast<int>(SavePageResult::RESULT_COUNT)); |
| 790 archive_manager_->GetStorageStats( | 708 archive_manager_->GetStorageStats( |
| 791 base::Bind(&ReportStorageHistogramsAfterSave)); | 709 base::Bind(&ReportStorageHistogramsAfterSave)); |
| 792 base::ThreadTaskRunnerHandle::Get()->PostTask( | 710 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 793 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, | 711 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| 794 weak_ptr_factory_.GetWeakPtr(), | 712 weak_ptr_factory_.GetWeakPtr(), |
| 795 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 713 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 796 weak_ptr_factory_.GetWeakPtr()))); | 714 weak_ptr_factory_.GetWeakPtr()))); |
| 797 callback.Run(result, offline_id); | 715 callback.Run(result, offline_id); |
| 798 } | 716 } |
| 799 | 717 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 815 store_->RemoveOfflinePages( | 733 store_->RemoveOfflinePages( |
| 816 offline_ids, | 734 offline_ids, |
| 817 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone, | 735 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone, |
| 818 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); | 736 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); |
| 819 } | 737 } |
| 820 | 738 |
| 821 void OfflinePageModelImpl::OnRemoveOfflinePagesDone( | 739 void OfflinePageModelImpl::OnRemoveOfflinePagesDone( |
| 822 const std::vector<int64_t>& offline_ids, | 740 const std::vector<int64_t>& offline_ids, |
| 823 const DeletePageCallback& callback, | 741 const DeletePageCallback& callback, |
| 824 bool success) { | 742 bool success) { |
| 825 ReportPageHistogramsAfterDelete(offline_pages_, offline_ids); | |
| 826 | |
| 827 // Delete the offline page from the in memory cache regardless of success in | 743 // Delete the offline page from the in memory cache regardless of success in |
| 828 // store. | 744 // store. |
| 745 base::Time now = base::Time::Now(); |
| 746 int64_t total_size = 0; |
| 829 for (int64_t offline_id : offline_ids) { | 747 for (int64_t offline_id : offline_ids) { |
| 830 auto iter = offline_pages_.find(offline_id); | 748 auto iter = offline_pages_.find(offline_id); |
| 831 if (iter == offline_pages_.end()) | 749 if (iter == offline_pages_.end()) |
| 832 continue; | 750 continue; |
| 751 total_size += iter->second.file_size; |
| 752 ClientId client_id = iter->second.client_id; |
| 753 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 754 AddHistogramSuffix(client_id, "OfflinePages.PageLifetime").c_str(), |
| 755 (now - iter->second.creation_time).InMinutes(), 1, |
| 756 base::TimeDelta::FromDays(365).InMinutes(), 100); |
| 757 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 758 AddHistogramSuffix(client_id, |
| 759 "OfflinePages.DeletePage.TimeSinceLastOpen") |
| 760 .c_str(), |
| 761 (now - iter->second.last_access_time).InMinutes(), 1, |
| 762 base::TimeDelta::FromDays(365).InMinutes(), 100); |
| 763 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 764 AddHistogramSuffix(client_id, |
| 765 "OfflinePages.DeletePage.LastOpenToCreated") |
| 766 .c_str(), |
| 767 (iter->second.last_access_time - iter->second.creation_time) |
| 768 .InMinutes(), |
| 769 1, base::TimeDelta::FromDays(365).InMinutes(), 100); |
| 770 UMA_HISTOGRAM_MEMORY_KB( |
| 771 AddHistogramSuffix(client_id, "OfflinePages.DeletePage.PageSize") |
| 772 .c_str(), |
| 773 iter->second.file_size / 1024); |
| 774 UMA_HISTOGRAM_COUNTS( |
| 775 AddHistogramSuffix(client_id, "OfflinePages.DeletePage.AccessCount") |
| 776 .c_str(), |
| 777 iter->second.access_count); |
| 833 FOR_EACH_OBSERVER( | 778 FOR_EACH_OBSERVER( |
| 834 Observer, observers_, | 779 Observer, observers_, |
| 835 OfflinePageDeleted(iter->second.offline_id, iter->second.client_id)); | 780 OfflinePageDeleted(iter->second.offline_id, iter->second.client_id)); |
| 836 offline_pages_.erase(iter); | 781 offline_pages_.erase(iter); |
| 837 } | 782 } |
| 783 if (offline_ids.size() > 1) { |
| 784 UMA_HISTOGRAM_COUNTS("OfflinePages.BatchDelete.Count", |
| 785 static_cast<int32_t>(offline_ids.size())); |
| 786 UMA_HISTOGRAM_MEMORY_KB("OfflinePages.BatchDelete.TotalPageSize", |
| 787 total_size / 1024); |
| 788 } |
| 838 // Deleting multiple pages always succeeds when it gets to this point. | 789 // Deleting multiple pages always succeeds when it gets to this point. |
| 839 InformDeletePageDone(callback, (success || offline_ids.size() > 1) | 790 InformDeletePageDone(callback, (success || offline_ids.size() > 1) |
| 840 ? DeletePageResult::SUCCESS | 791 ? DeletePageResult::SUCCESS |
| 841 : DeletePageResult::STORE_FAILURE); | 792 : DeletePageResult::STORE_FAILURE); |
| 842 } | 793 } |
| 843 | 794 |
| 844 void OfflinePageModelImpl::InformDeletePageDone( | 795 void OfflinePageModelImpl::InformDeletePageDone( |
| 845 const DeletePageCallback& callback, | 796 const DeletePageCallback& callback, |
| 846 DeletePageResult result) { | 797 DeletePageResult result) { |
| 847 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", | 798 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { | 904 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { |
| 954 if (!is_loaded_) { | 905 if (!is_loaded_) { |
| 955 delayed_tasks_.push_back(task); | 906 delayed_tasks_.push_back(task); |
| 956 return; | 907 return; |
| 957 } | 908 } |
| 958 | 909 |
| 959 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); | 910 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); |
| 960 } | 911 } |
| 961 | 912 |
| 962 } // namespace offline_pages | 913 } // namespace offline_pages |
| OLD | NEW |