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

Unified Diff: content/browser/service_worker/service_worker_storage.cc

Issue 374873002: Service Worker: Delay stale resource cleanup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: patch for landing Created 6 years, 5 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: content/browser/service_worker/service_worker_storage.cc
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index 05e65323ca88818b8e574aa08c3cc9ff314d22c1..bc5a82aef2e091fa80aaafa7a67264334eb64ad2 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -271,8 +271,8 @@ void ServiceWorkerStorage::StoreRegistration(
DCHECK(registration);
DCHECK(version);
- DCHECK(state_ == INITIALIZED || state_ == DISABLED);
- if (state_ != INITIALIZED || !context_) {
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_;
+ if (IsDisabled() || !context_) {
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
return;
}
@@ -289,6 +289,9 @@ void ServiceWorkerStorage::StoreRegistration(
ResourceList resources;
version->script_cache_map()->GetResources(&resources);
+ if (!has_checked_for_stale_resources_)
+ DeleteStaleResources();
+
database_task_runner_->PostTask(
FROM_HERE,
base::Bind(&WriteRegistrationInDB,
@@ -305,8 +308,8 @@ void ServiceWorkerStorage::UpdateToActiveState(
const StatusCallback& callback) {
DCHECK(registration);
- DCHECK(state_ == INITIALIZED || state_ == DISABLED);
- if (state_ != INITIALIZED || !context_) {
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_;
+ if (IsDisabled() || !context_) {
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
return;
}
@@ -327,12 +330,15 @@ void ServiceWorkerStorage::DeleteRegistration(
int64 registration_id,
const GURL& origin,
const StatusCallback& callback) {
- DCHECK(state_ == INITIALIZED || state_ == DISABLED);
- if (state_ != INITIALIZED || !context_) {
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_;
+ if (IsDisabled() || !context_) {
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
return;
}
+ if (!has_checked_for_stale_resources_)
+ DeleteStaleResources();
+
database_task_runner_->PostTask(
FROM_HERE,
base::Bind(&DeleteRegistrationFromDB,
@@ -360,8 +366,13 @@ ServiceWorkerStorage::CreateResponseWriter(int64 response_id) {
new ServiceWorkerResponseWriter(response_id, disk_cache()));
}
-void ServiceWorkerStorage::StoreUncommittedReponseId(int64 id) {
+void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) {
DCHECK_NE(kInvalidServiceWorkerResponseId, id);
+ DCHECK_EQ(INITIALIZED, state_);
+
+ if (!has_checked_for_stale_resources_)
+ DeleteStaleResources();
+
database_task_runner_->PostTask(
FROM_HERE,
base::Bind(base::IgnoreResult(
@@ -470,6 +481,7 @@ ServiceWorkerStorage::ServiceWorkerStorage(
disk_cache_thread_(disk_cache_thread),
quota_manager_proxy_(quota_manager_proxy),
is_purge_pending_(false),
+ has_checked_for_stale_resources_(false),
weak_factory_(this) {
database_.reset(new ServiceWorkerDatabase(GetDatabasePath()));
}
@@ -526,9 +538,6 @@ void ServiceWorkerStorage::DidReadInitialData(
next_resource_id_ = data->next_resource_id;
registered_origins_.swap(data->origins);
state_ = INITIALIZED;
- StartPurgingResources(
- std::vector<int64>(data->purgeable_resource_ids.begin(),
- data->purgeable_resource_ids.end()));
} else {
// TODO(nhiroki): Stringify |status| using StatusToString() defined in
// service_worker_database.cc.
@@ -863,6 +872,7 @@ void ServiceWorkerStorage::SchedulePurgeResources(
void ServiceWorkerStorage::StartPurgingResources(
const std::vector<int64>& ids) {
+ DCHECK(has_checked_for_stale_resources_);
for (size_t i = 0; i < ids.size(); ++i)
purgeable_resource_ids_.push_back(ids[i]);
ContinuePurgingResources();
@@ -870,6 +880,7 @@ void ServiceWorkerStorage::StartPurgingResources(
void ServiceWorkerStorage::StartPurgingResources(
const ResourceList& resources) {
+ DCHECK(has_checked_for_stale_resources_);
for (size_t i = 0; i < resources.size(); ++i)
purgeable_resource_ids_.push_back(resources[i].resource_id);
ContinuePurgingResources();
@@ -912,6 +923,58 @@ void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) {
ContinuePurgingResources();
}
+void ServiceWorkerStorage::DeleteStaleResources() {
+ DCHECK(!has_checked_for_stale_resources_);
+ has_checked_for_stale_resources_ = true;
+ database_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB,
+ database_.get(),
+ base::MessageLoopProxy::current(),
+ base::Bind(&ServiceWorkerStorage::DidCollectStaleResources,
+ weak_factory_.GetWeakPtr())));
+}
+
+void ServiceWorkerStorage::DidCollectStaleResources(
+ const std::vector<int64>& stale_resource_ids,
+ ServiceWorkerDatabase::Status status) {
+ DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status);
+ if (status != ServiceWorkerDatabase::STATUS_OK)
+ return;
+ StartPurgingResources(stale_resource_ids);
+}
+
+void ServiceWorkerStorage::CollectStaleResourcesFromDB(
+ ServiceWorkerDatabase* database,
+ scoped_refptr<base::SequencedTaskRunner> original_task_runner,
+ const GetResourcesCallback& callback) {
+ std::set<int64> ids;
+ ServiceWorkerDatabase::Status status =
+ database->GetUncommittedResourceIds(&ids);
+ if (status != ServiceWorkerDatabase::STATUS_OK) {
+ original_task_runner->PostTask(
+ FROM_HERE,
+ base::Bind(
+ callback, std::vector<int64>(ids.begin(), ids.end()), status));
+ return;
+ }
+
+ status = database->PurgeUncommittedResourceIds(ids);
+ if (status != ServiceWorkerDatabase::STATUS_OK) {
+ original_task_runner->PostTask(
+ FROM_HERE,
+ base::Bind(
+ callback, std::vector<int64>(ids.begin(), ids.end()), status));
+ return;
+ }
+
+ ids.clear();
+ status = database->GetPurgeableResourceIds(&ids);
+ original_task_runner->PostTask(
+ FROM_HERE,
+ base::Bind(callback, std::vector<int64>(ids.begin(), ids.end()), status));
+}
+
void ServiceWorkerStorage::ReadInitialDataFromDB(
ServiceWorkerDatabase* database,
scoped_refptr<base::SequencedTaskRunner> original_task_runner,
@@ -931,14 +994,6 @@ void ServiceWorkerStorage::ReadInitialDataFromDB(
}
status = database->GetOriginsWithRegistrations(&data->origins);
- if (status != ServiceWorkerDatabase::STATUS_OK) {
- original_task_runner->PostTask(
- FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
- return;
- }
-
- // TODO: Also purge uncommitted resources.
- status = database->GetPurgeableResourceIds(&data->purgeable_resource_ids);
original_task_runner->PostTask(
FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
}

Powered by Google App Engine
This is Rietveld 408576698