| 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 |
| 138 } // namespace | 243 } // namespace |
| 139 | 244 |
| 140 // protected | 245 // protected |
| 141 OfflinePageModelImpl::OfflinePageModelImpl() | 246 OfflinePageModelImpl::OfflinePageModelImpl() |
| 142 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} | 247 : OfflinePageModel(), is_loaded_(false), weak_ptr_factory_(this) {} |
| 143 | 248 |
| 144 OfflinePageModelImpl::OfflinePageModelImpl( | 249 OfflinePageModelImpl::OfflinePageModelImpl( |
| 145 std::unique_ptr<OfflinePageMetadataStore> store, | 250 std::unique_ptr<OfflinePageMetadataStore> store, |
| 146 const base::FilePath& archives_dir, | 251 const base::FilePath& archives_dir, |
| 147 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 252 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { | 306 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { |
| 202 DCHECK(is_loaded_); | 307 DCHECK(is_loaded_); |
| 203 auto iter = offline_pages_.find(offline_id); | 308 auto iter = offline_pages_.find(offline_id); |
| 204 if (iter == offline_pages_.end()) | 309 if (iter == offline_pages_.end()) |
| 205 return; | 310 return; |
| 206 | 311 |
| 207 // Make a copy of the cached item and update it. The cached item should only | 312 // Make a copy of the cached item and update it. The cached item should only |
| 208 // be updated upon the successful store operation. | 313 // be updated upon the successful store operation. |
| 209 OfflinePageItem offline_page_item = iter->second; | 314 OfflinePageItem offline_page_item = iter->second; |
| 210 | 315 |
| 211 base::Time now = base::Time::Now(); | 316 ReportPageHistogramsAfterAccess(offline_page_item); |
| 212 base::TimeDelta time_since_last_accessed = | |
| 213 now - offline_page_item.last_access_time; | |
| 214 | 317 |
| 215 // When the access account is still zero, the page is opened for the first | 318 offline_page_item.last_access_time = base::Time::Now(); |
| 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; | |
| 227 offline_page_item.access_count++; | 319 offline_page_item.access_count++; |
| 228 | 320 |
| 229 store_->AddOrUpdateOfflinePage( | 321 store_->AddOrUpdateOfflinePage( |
| 230 offline_page_item, | 322 offline_page_item, |
| 231 base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, | 323 base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, |
| 232 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); | 324 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); |
| 233 } | 325 } |
| 234 | 326 |
| 235 void OfflinePageModelImpl::DeletePagesByOfflineId( | 327 void OfflinePageModelImpl::DeletePagesByOfflineId( |
| 236 const std::vector<int64_t>& offline_ids, | 328 const std::vector<int64_t>& offline_ids, |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 | 708 |
| 617 void OfflinePageModelImpl::OnAddOfflinePageDone( | 709 void OfflinePageModelImpl::OnAddOfflinePageDone( |
| 618 OfflinePageArchiver* archiver, | 710 OfflinePageArchiver* archiver, |
| 619 const SavePageCallback& callback, | 711 const SavePageCallback& callback, |
| 620 const OfflinePageItem& offline_page, | 712 const OfflinePageItem& offline_page, |
| 621 bool success) { | 713 bool success) { |
| 622 SavePageResult result; | 714 SavePageResult result; |
| 623 if (success) { | 715 if (success) { |
| 624 offline_pages_[offline_page.offline_id] = offline_page; | 716 offline_pages_[offline_page.offline_id] = offline_page; |
| 625 result = SavePageResult::SUCCESS; | 717 result = SavePageResult::SUCCESS; |
| 626 UMA_HISTOGRAM_TIMES( | 718 ReportPageHistogramAfterSave(offline_page); |
| 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); | |
| 635 } else { | 719 } else { |
| 636 result = SavePageResult::STORE_FAILURE; | 720 result = SavePageResult::STORE_FAILURE; |
| 637 } | 721 } |
| 638 InformSavePageDone(callback, result, offline_page.client_id, | 722 InformSavePageDone(callback, result, offline_page.client_id, |
| 639 offline_page.offline_id); | 723 offline_page.offline_id); |
| 640 DeletePendingArchiver(archiver); | 724 DeletePendingArchiver(archiver); |
| 641 | 725 |
| 642 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this)); | 726 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelChanged(this)); |
| 643 } | 727 } |
| 644 | 728 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 weak_ptr_factory_.GetWeakPtr(), | 779 weak_ptr_factory_.GetWeakPtr(), |
| 696 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 780 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 697 weak_ptr_factory_.GetWeakPtr())), | 781 weak_ptr_factory_.GetWeakPtr())), |
| 698 kStorageManagerStartingDelay); | 782 kStorageManagerStartingDelay); |
| 699 } | 783 } |
| 700 | 784 |
| 701 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, | 785 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| 702 SavePageResult result, | 786 SavePageResult result, |
| 703 const ClientId& client_id, | 787 const ClientId& client_id, |
| 704 int64_t offline_id) { | 788 int64_t offline_id) { |
| 705 UMA_HISTOGRAM_ENUMERATION( | 789 ReportSavePageResultHistogramAfterSave(client_id, result); |
| 706 AddHistogramSuffix(client_id, "OfflinePages.SavePageResult").c_str(), | |
| 707 static_cast<int>(result), static_cast<int>(SavePageResult::RESULT_COUNT)); | |
| 708 archive_manager_->GetStorageStats( | 790 archive_manager_->GetStorageStats( |
| 709 base::Bind(&ReportStorageHistogramsAfterSave)); | 791 base::Bind(&ReportStorageHistogramsAfterSave)); |
| 710 base::ThreadTaskRunnerHandle::Get()->PostTask( | 792 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 711 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, | 793 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| 712 weak_ptr_factory_.GetWeakPtr(), | 794 weak_ptr_factory_.GetWeakPtr(), |
| 713 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 795 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 714 weak_ptr_factory_.GetWeakPtr()))); | 796 weak_ptr_factory_.GetWeakPtr()))); |
| 715 callback.Run(result, offline_id); | 797 callback.Run(result, offline_id); |
| 716 } | 798 } |
| 717 | 799 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 733 store_->RemoveOfflinePages( | 815 store_->RemoveOfflinePages( |
| 734 offline_ids, | 816 offline_ids, |
| 735 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone, | 817 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone, |
| 736 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); | 818 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); |
| 737 } | 819 } |
| 738 | 820 |
| 739 void OfflinePageModelImpl::OnRemoveOfflinePagesDone( | 821 void OfflinePageModelImpl::OnRemoveOfflinePagesDone( |
| 740 const std::vector<int64_t>& offline_ids, | 822 const std::vector<int64_t>& offline_ids, |
| 741 const DeletePageCallback& callback, | 823 const DeletePageCallback& callback, |
| 742 bool success) { | 824 bool success) { |
| 825 ReportPageHistogramsAfterDelete(offline_pages_, offline_ids); |
| 826 |
| 743 // Delete the offline page from the in memory cache regardless of success in | 827 // Delete the offline page from the in memory cache regardless of success in |
| 744 // store. | 828 // store. |
| 745 base::Time now = base::Time::Now(); | |
| 746 int64_t total_size = 0; | |
| 747 for (int64_t offline_id : offline_ids) { | 829 for (int64_t offline_id : offline_ids) { |
| 748 auto iter = offline_pages_.find(offline_id); | 830 auto iter = offline_pages_.find(offline_id); |
| 749 if (iter == offline_pages_.end()) | 831 if (iter == offline_pages_.end()) |
| 750 continue; | 832 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); | |
| 778 FOR_EACH_OBSERVER( | 833 FOR_EACH_OBSERVER( |
| 779 Observer, observers_, | 834 Observer, observers_, |
| 780 OfflinePageDeleted(iter->second.offline_id, iter->second.client_id)); | 835 OfflinePageDeleted(iter->second.offline_id, iter->second.client_id)); |
| 781 offline_pages_.erase(iter); | 836 offline_pages_.erase(iter); |
| 782 } | 837 } |
| 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 } | |
| 789 // Deleting multiple pages always succeeds when it gets to this point. | 838 // Deleting multiple pages always succeeds when it gets to this point. |
| 790 InformDeletePageDone(callback, (success || offline_ids.size() > 1) | 839 InformDeletePageDone(callback, (success || offline_ids.size() > 1) |
| 791 ? DeletePageResult::SUCCESS | 840 ? DeletePageResult::SUCCESS |
| 792 : DeletePageResult::STORE_FAILURE); | 841 : DeletePageResult::STORE_FAILURE); |
| 793 } | 842 } |
| 794 | 843 |
| 795 void OfflinePageModelImpl::InformDeletePageDone( | 844 void OfflinePageModelImpl::InformDeletePageDone( |
| 796 const DeletePageCallback& callback, | 845 const DeletePageCallback& callback, |
| 797 DeletePageResult result) { | 846 DeletePageResult result) { |
| 798 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", | 847 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { | 953 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { |
| 905 if (!is_loaded_) { | 954 if (!is_loaded_) { |
| 906 delayed_tasks_.push_back(task); | 955 delayed_tasks_.push_back(task); |
| 907 return; | 956 return; |
| 908 } | 957 } |
| 909 | 958 |
| 910 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); | 959 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); |
| 911 } | 960 } |
| 912 | 961 |
| 913 } // namespace offline_pages | 962 } // namespace offline_pages |
| OLD | NEW |