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

Unified Diff: components/offline_pages/offline_page_storage_manager.cc

Issue 1986673002: [Offline Pages] Updated clearing logic in storage manager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixing trybots. Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: components/offline_pages/offline_page_storage_manager.cc
diff --git a/components/offline_pages/offline_page_storage_manager.cc b/components/offline_pages/offline_page_storage_manager.cc
index 249427d6069ea4b772fd444a940dfc20df53c7b2..1ee2a8c8803646311ff69dc698eee653166c352a 100644
--- a/components/offline_pages/offline_page_storage_manager.cc
+++ b/components/offline_pages/offline_page_storage_manager.cc
@@ -7,6 +7,7 @@
#include <algorithm>
#include "base/bind.h"
+#include "base/sys_info.h"
#include "base/time/clock.h"
#include "base/time/default_clock.h"
#include "base/time/time.h"
@@ -14,14 +15,17 @@
#include "components/offline_pages/offline_page_client_policy.h"
#include "components/offline_pages/offline_page_item.h"
#include "components/offline_pages/offline_page_types.h"
+#include "components/prefs/pref_service.h"
namespace offline_pages {
OfflinePageStorageManager::OfflinePageStorageManager(
Client* client,
- ClientPolicyController* policy_controller)
+ ClientPolicyController* policy_controller,
+ PrefService* prefs)
: client_(client),
policy_controller_(policy_controller),
+ prefs_(prefs),
in_progress_(false),
clock_(new base::DefaultClock()),
weak_ptr_factory_(this) {}
@@ -30,7 +34,7 @@ OfflinePageStorageManager::~OfflinePageStorageManager() {}
void OfflinePageStorageManager::ClearPagesIfNeeded(
const ClearPageCallback& callback) {
- if (!ShouldClearPages())
+ if (in_progress_)
return;
in_progress_ = true;
client_->GetAllPages(base::Bind(&OfflinePageStorageManager::ClearExpiredPages,
@@ -41,8 +45,28 @@ void OfflinePageStorageManager::ClearExpiredPages(
const ClearPageCallback& callback,
const MultipleOfflinePageItemResult& pages) {
DCHECK(in_progress_);
+
+ ClearMode mode = ShouldClearPages(pages);
std::vector<int64_t> offline_ids;
- GetExpiredPageIds(pages, offline_ids);
+
+ switch (mode) {
+ case ClearMode::CLEAR_ALL:
+ for (const auto& page : pages)
+ offline_ids.push_back(page.offline_id);
+ break;
+ case ClearMode::DEFAULT:
+ GetExpiredPageIds(pages, offline_ids);
+ break;
+ case ClearMode::NO_NEED:
+ in_progress_ = false;
+ if (prefs_) {
+ prefs_->SetInt64(kOfflinePageStorageLastClearedTime,
+ clock_->Now().ToInternalValue());
+ }
+ callback.Run(0, StorageClearResult::UNNECESSARY);
+ return;
+ }
+
client_->DeletePagesByOfflineId(
offline_ids,
base::Bind(&OfflinePageStorageManager::OnExpiredPagesDeleted,
@@ -97,19 +121,56 @@ void OfflinePageStorageManager::OnExpiredPagesDeleted(
const ClearPageCallback& callback,
int pages_cleared,
DeletePageResult result) {
+ if (prefs_) {
+ prefs_->SetInt64(kOfflinePageStorageLastClearedTime,
+ clock_->Now().ToInternalValue());
+ }
+ StorageClearResult clear_result = result == DeletePageResult::SUCCESS
+ ? StorageClearResult::SUCCESS
+ : StorageClearResult::DELETE_FAIL;
in_progress_ = false;
- callback.Run(pages_cleared, result);
+ callback.Run(pages_cleared, clear_result);
}
-bool OfflinePageStorageManager::ShouldClearPages() {
- return !in_progress_;
+OfflinePageStorageManager::ClearMode
+OfflinePageStorageManager::ShouldClearPages(
+ const MultipleOfflinePageItemResult& pages) {
+ if (pages.size() == 0)
+ return ClearMode::NO_NEED;
+
+ // If it's been more than the pre-defined gap since the last time we clear the
fgorski 2016/05/17 05:33:29 interval
romax 2016/05/18 02:36:19 Done.
+ // storage, we should clear pages.
+ if (prefs_) {
+ int64_t last_clear_time =
+ prefs_->GetInt64(kOfflinePageStorageLastClearedTime);
+ if (last_clear_time == 0 ||
+ clock_->Now() - base::Time::FromInternalValue(last_clear_time) >=
+ kClearStorageTimeGap) {
+ return ClearMode::DEFAULT;
+ }
+ }
+
+ // If the size of all offline pages is more than limit, or it's larger than a
+ // specified percentage of all available storage space on the disk we'll clear
+ // all offline pages.
+ int64_t total_size = 0;
+ for (const auto& page : pages)
+ total_size += page.file_size;
+
+ int64_t free_space = base::SysInfo::AmountOfFreeDiskSpace(pages[0].file_path);
fgorski 2016/05/17 05:33:29 This requires IO Thread and to my knowledge you ar
+ if (total_size > kOfflinePageStorageLimit ||
+ total_size >
+ (total_size + free_space) * kOfflinePageStorageLimitPercentage) {
+ return ClearMode::CLEAR_ALL;
fgorski 2016/05/17 05:33:29 This is too aggressive. Why would you remove every
romax 2016/05/18 02:36:19 will change per discussion
+ }
+ return ClearMode::NO_NEED;
}
bool OfflinePageStorageManager::ShouldBeExpired(const base::Time& now,
const OfflinePageItem& page) {
const LifetimePolicy& policy =
policy_controller_->GetPolicy(page.client_id.name_space).lifetime_policy;
- return now - page.last_access_time > policy.expiration_period;
+ return now - page.last_access_time >= policy.expiration_period;
}
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698