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

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

Issue 2512073002: [Offline Pages] Removes two-step expiration related. (Closed)
Patch Set: Created 4 years, 1 month 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_storage_manager.h" 5 #include "components/offline_pages/offline_page_storage_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/time/clock.h" 10 #include "base/time/clock.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 } 57 }
58 model_->GetAllPages( 58 model_->GetAllPages(
59 base::Bind(&OfflinePageStorageManager::OnGetAllPagesDoneForClearingPages, 59 base::Bind(&OfflinePageStorageManager::OnGetAllPagesDoneForClearingPages,
60 weak_ptr_factory_.GetWeakPtr(), callback, stats)); 60 weak_ptr_factory_.GetWeakPtr(), callback, stats));
61 } 61 }
62 62
63 void OfflinePageStorageManager::OnGetAllPagesDoneForClearingPages( 63 void OfflinePageStorageManager::OnGetAllPagesDoneForClearingPages(
64 const ClearStorageCallback& callback, 64 const ClearStorageCallback& callback,
65 const ArchiveManager::StorageStats& stats, 65 const ArchiveManager::StorageStats& stats,
66 const MultipleOfflinePageItemResult& pages) { 66 const MultipleOfflinePageItemResult& pages) {
67 std::vector<int64_t> page_ids_to_expire; 67 std::vector<int64_t> page_ids_to_clear;
68 std::vector<int64_t> page_ids_to_remove; 68 GetPageIdsToClear(pages, stats, &page_ids_to_clear);
69 GetPageIdsToClear(pages, stats, &page_ids_to_expire, &page_ids_to_remove); 69 model_->DeletePagesByOfflineId(
70 model_->ExpirePages( 70 page_ids_to_clear,
71 page_ids_to_expire, clear_time_, 71 base::Bind(&OfflinePageStorageManager::OnExpiredPagesCleared,
72 base::Bind(&OfflinePageStorageManager::OnPagesExpired,
73 weak_ptr_factory_.GetWeakPtr(), callback, 72 weak_ptr_factory_.GetWeakPtr(), callback,
74 page_ids_to_expire.size(), page_ids_to_remove)); 73 page_ids_to_clear.size()));
75 } 74 }
76 75
77 void OfflinePageStorageManager::OnPagesExpired( 76 void OfflinePageStorageManager::OnExpiredPagesCleared(
78 const ClearStorageCallback& callback,
79 size_t pages_expired,
80 const std::vector<int64_t>& page_ids_to_remove,
81 bool expiration_succeeded) {
82 // We want to delete the outdated page records regardless the expiration
83 // succeeded or not.
84 model_->DeletePagesByOfflineId(
85 page_ids_to_remove,
86 base::Bind(&OfflinePageStorageManager::OnOutdatedPagesCleared,
87 weak_ptr_factory_.GetWeakPtr(), callback, pages_expired,
88 expiration_succeeded));
89 }
90
91 void OfflinePageStorageManager::OnOutdatedPagesCleared(
92 const ClearStorageCallback& callback, 77 const ClearStorageCallback& callback,
93 size_t pages_cleared, 78 size_t pages_cleared,
94 bool expiration_succeeded,
95 DeletePageResult result) { 79 DeletePageResult result) {
80 last_clear_time_ = clear_time_;
96 ClearStorageResult clear_result = ClearStorageResult::SUCCESS; 81 ClearStorageResult clear_result = ClearStorageResult::SUCCESS;
97 if (!expiration_succeeded) { 82 if (result != DeletePageResult::SUCCESS)
98 clear_result = ClearStorageResult::EXPIRE_FAILURE; 83 clear_result = ClearStorageResult::CLEAR_FAILURE;
99 if (result != DeletePageResult::SUCCESS)
100 clear_result = ClearStorageResult::EXPIRE_AND_DELETE_FAILURES;
101 } else if (result != DeletePageResult::SUCCESS) {
102 clear_result = ClearStorageResult::DELETE_FAILURE;
103 }
104 last_clear_time_ = clear_time_;
105 callback.Run(pages_cleared, clear_result); 84 callback.Run(pages_cleared, clear_result);
106 } 85 }
107 86
108 void OfflinePageStorageManager::GetPageIdsToClear( 87 void OfflinePageStorageManager::GetPageIdsToClear(
109 const MultipleOfflinePageItemResult& pages, 88 const MultipleOfflinePageItemResult& pages,
110 const ArchiveManager::StorageStats& stats, 89 const ArchiveManager::StorageStats& stats,
111 std::vector<int64_t>* page_ids_to_expire, 90 std::vector<int64_t>* page_ids_to_clear) {
112 std::vector<int64_t>* page_ids_to_remove) {
113 // TODO(romax): See how persistent should be considered here. 91 // TODO(romax): See how persistent should be considered here.
114 // Creating a map from namespace to a vector of page items. 92 // Creating a map from namespace to a vector of page items.
115 // Sort each vector based on last accessed time and all pages after index 93 // Sort each vector based on last accessed time and all pages after index
116 // min{size(), page_limit} should be expired. And then start iterating 94 // min{size(), page_limit} should be deleted.
117 // backwards to expire pages.
118 std::map<std::string, std::vector<OfflinePageItem>> pages_map; 95 std::map<std::string, std::vector<OfflinePageItem>> pages_map;
119 std::vector<OfflinePageItem> kept_pages; 96 std::vector<OfflinePageItem> kept_pages;
120 int64_t kept_pages_size = 0; 97 int64_t kept_pages_size = 0;
121 98
122 for (const auto& page : pages) { 99 for (const auto& page : pages) {
123 if (!page.IsExpired()) { 100 if (!IsExpired(page)) {
124 pages_map[page.client_id.name_space].push_back(page); 101 pages_map[page.client_id.name_space].push_back(page);
125 } else if (clear_time_ - page.expiration_time >= kRemovePageItemInterval) { 102 } else {
126 page_ids_to_remove->push_back(page.offline_id); 103 page_ids_to_clear->push_back(page.offline_id);
127 } 104 }
128 } 105 }
129 106
130 for (auto& iter : pages_map) { 107 for (auto& iter : pages_map) {
131 std::string name_space = iter.first; 108 std::string name_space = iter.first;
132 std::vector<OfflinePageItem>& page_list = iter.second; 109 std::vector<OfflinePageItem>& page_list = iter.second;
133 110
134 LifetimePolicy policy = 111 LifetimePolicy policy =
135 policy_controller_->GetPolicy(name_space).lifetime_policy; 112 policy_controller_->GetPolicy(name_space).lifetime_policy;
136 113
137 std::sort(page_list.begin(), page_list.end(), 114 std::sort(page_list.begin(), page_list.end(),
138 [](const OfflinePageItem& a, const OfflinePageItem& b) -> bool { 115 [](const OfflinePageItem& a, const OfflinePageItem& b) -> bool {
139 return a.last_access_time > b.last_access_time; 116 return a.last_access_time > b.last_access_time;
140 }); 117 });
141 118
142 size_t page_list_size = page_list.size(); 119 size_t page_list_size = page_list.size();
143 size_t pos = 0; 120 size_t pos = 0;
144 while (pos < page_list_size && 121 while (pos < page_list_size &&
145 (policy.page_limit == kUnlimitedPages || pos < policy.page_limit) && 122 (policy.page_limit == kUnlimitedPages || pos < policy.page_limit) &&
146 !ShouldBeExpired(page_list.at(pos))) { 123 !IsExpired(page_list.at(pos))) {
147 kept_pages_size += page_list.at(pos).file_size; 124 kept_pages_size += page_list.at(pos).file_size;
148 kept_pages.push_back(page_list.at(pos)); 125 kept_pages.push_back(page_list.at(pos));
149 pos++; 126 pos++;
150 } 127 }
151 128
152 for (; pos < page_list_size; pos++) 129 for (; pos < page_list_size; pos++)
153 page_ids_to_expire->push_back(page_list.at(pos).offline_id); 130 page_ids_to_clear->push_back(page_list.at(pos).offline_id);
154 } 131 }
155 132
156 // If we're still over the clear threshold, we're going to clear remaining 133 // If we're still over the clear threshold, we're going to clear remaining
157 // pages from oldest last access time. 134 // pages from oldest last access time.
158 int64_t free_space = stats.free_disk_space; 135 int64_t free_space = stats.free_disk_space;
159 int64_t total_size = stats.total_archives_size; 136 int64_t total_size = stats.total_archives_size;
160 int64_t space_to_release = 137 int64_t space_to_release =
161 kept_pages_size - 138 kept_pages_size -
162 (total_size + free_space) * kOfflinePageStorageClearThreshold; 139 (total_size + free_space) * kOfflinePageStorageClearThreshold;
163 if (space_to_release > 0) { 140 if (space_to_release > 0) {
164 // Here we're sorting the |kept_pages| with oldest first. 141 // Here we're sorting the |kept_pages| with oldest first.
165 std::sort(kept_pages.begin(), kept_pages.end(), 142 std::sort(kept_pages.begin(), kept_pages.end(),
166 [](const OfflinePageItem& a, const OfflinePageItem& b) -> bool { 143 [](const OfflinePageItem& a, const OfflinePageItem& b) -> bool {
167 return a.last_access_time < b.last_access_time; 144 return a.last_access_time < b.last_access_time;
168 }); 145 });
169 size_t kept_pages_size = kept_pages.size(); 146 size_t kept_pages_size = kept_pages.size();
170 size_t pos = 0; 147 size_t pos = 0;
171 while (pos < kept_pages_size && space_to_release > 0) { 148 while (pos < kept_pages_size && space_to_release > 0) {
172 space_to_release -= kept_pages.at(pos).file_size; 149 space_to_release -= kept_pages.at(pos).file_size;
173 page_ids_to_expire->push_back(kept_pages.at(pos).offline_id); 150 page_ids_to_clear->push_back(kept_pages.at(pos).offline_id);
174 pos++; 151 pos++;
175 } 152 }
176 } 153 }
177 } 154 }
178 155
179 OfflinePageStorageManager::ClearMode 156 OfflinePageStorageManager::ClearMode
180 OfflinePageStorageManager::ShouldClearPages( 157 OfflinePageStorageManager::ShouldClearPages(
181 const ArchiveManager::StorageStats& storage_stats) { 158 const ArchiveManager::StorageStats& storage_stats) {
182 int64_t total_size = storage_stats.total_archives_size; 159 int64_t total_size = storage_stats.total_archives_size;
183 int64_t free_space = storage_stats.free_disk_space; 160 int64_t free_space = storage_stats.free_disk_space;
184 if (total_size == 0) 161 if (total_size == 0)
185 return ClearMode::NOT_NEEDED; 162 return ClearMode::NOT_NEEDED;
186 163
187 // If the size of all offline pages is more than limit, or it's larger than a 164 // If the size of all offline pages is more than limit, or it's larger than a
188 // specified percentage of all available storage space on the disk we'll clear 165 // specified percentage of all available storage space on the disk we'll clear
189 // all offline pages. 166 // all offline pages.
190 if (total_size >= (total_size + free_space) * kOfflinePageStorageLimit) 167 if (total_size >= (total_size + free_space) * kOfflinePageStorageLimit)
191 return ClearMode::DEFAULT; 168 return ClearMode::DEFAULT;
192 // If it's been more than the pre-defined interval since the last time we 169 // If it's been more than the pre-defined interval since the last time we
193 // clear the storage, we should clear pages. 170 // clear the storage, we should clear pages.
194 if (last_clear_time_ == base::Time() || 171 if (last_clear_time_ == base::Time() ||
195 clear_time_ - last_clear_time_ >= kClearStorageInterval) { 172 clear_time_ - last_clear_time_ >= kClearStorageInterval) {
196 return ClearMode::DEFAULT; 173 return ClearMode::DEFAULT;
197 } 174 }
198 // Otherwise there's no need to clear storage right now. 175 // Otherwise there's no need to clear storage right now.
199 return ClearMode::NOT_NEEDED; 176 return ClearMode::NOT_NEEDED;
200 } 177 }
201 178
202 bool OfflinePageStorageManager::ShouldBeExpired( 179 bool OfflinePageStorageManager::IsExpired(const OfflinePageItem& page) const {
jianli 2016/11/18 00:15:48 Do we really need this?
romax 2016/11/18 20:50:49 Yes it's still a helper function to return if the
203 const OfflinePageItem& page) const {
204 const LifetimePolicy& policy = 180 const LifetimePolicy& policy =
205 policy_controller_->GetPolicy(page.client_id.name_space).lifetime_policy; 181 policy_controller_->GetPolicy(page.client_id.name_space).lifetime_policy;
206 return policy.lifetime_type == LifetimeType::TEMPORARY && 182 return policy.lifetime_type == LifetimeType::TEMPORARY &&
207 clear_time_ - page.last_access_time >= policy.expiration_period; 183 clear_time_ - page.last_access_time >= policy.expiration_period;
jianli 2016/11/18 00:15:48 Do you also want to update the policy to remove th
romax 2016/11/18 20:50:49 No, there should still be a expiration_period for
208 } 184 }
209 185
210 bool OfflinePageStorageManager::IsInProgress() const { 186 bool OfflinePageStorageManager::IsInProgress() const {
211 return clear_time_ > last_clear_time_; 187 return clear_time_ > last_clear_time_;
212 } 188 }
213 189
214 } // namespace offline_pages 190 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698