Skip to content

Commit

Permalink
ServiceWorker: Check liveness of ServiceWorkerDatabase before deletin…
Browse files Browse the repository at this point in the history
…g an old diskcache

After diskcache migration, ServiceWorkerStorage posts a delayed task to delete
an old diskcache and to record the result in ServiceWorkerDatabase. This task
accesses the database without any liveness check, so the task possibly crashes
if the database is closed before that.

This CL makes the task to confirm the liveness before accessing the database.

BUG=487482,505333

Review URL: https://codereview.chromium.org/1210073009

Cr-Commit-Position: refs/heads/master@{#336951}
  • Loading branch information
nhiroki authored and Commit bot committed Jul 1, 2015
1 parent c319c2e commit 95d516e
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
21 changes: 15 additions & 6 deletions content/browser/service_worker/service_worker_storage.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1434,9 +1434,9 @@ ServiceWorkerDiskCache* ServiceWorkerStorage::disk_cache() {
if (old_disk_cache_deletion_needed_) {
// Lazily delete the old diskcache.
BrowserThread::PostAfterStartupTask(
FROM_HERE, database_task_manager_->GetTaskRunner(),
base::Bind(&DeleteOldDiskCacheInDB, database_.get(),
GetOldDiskCachePath()));
FROM_HERE, base::ThreadTaskRunnerHandle::Get(),
base::Bind(&ServiceWorkerStorage::DeleteOldDiskCache,
weak_factory_.GetWeakPtr()));
}

ServiceWorkerMetrics::RecordDiskCacheMigrationResult(
Expand Down Expand Up @@ -1470,9 +1470,9 @@ void ServiceWorkerStorage::DidSetDiskCacheMigrationNotNeeded(

// Lazily delete the old diskcache and update the database.
BrowserThread::PostAfterStartupTask(
FROM_HERE, database_task_manager_->GetTaskRunner(),
base::Bind(&DeleteOldDiskCacheInDB, database_.get(),
GetOldDiskCachePath()));
FROM_HERE, base::ThreadTaskRunnerHandle::Get(),
base::Bind(&ServiceWorkerStorage::DeleteOldDiskCache,
weak_factory_.GetWeakPtr()));

ServiceWorkerMetrics::RecordDiskCacheMigrationResult(
ServiceWorkerMetrics::MIGRATION_OK);
Expand Down Expand Up @@ -1513,6 +1513,15 @@ void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) {
ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK);
}

void ServiceWorkerStorage::DeleteOldDiskCache() {
DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_;
if (IsDisabled())
return;
database_task_manager_->GetTaskRunner()->PostTask(
FROM_HERE, base::Bind(&ServiceWorkerStorage::DeleteOldDiskCacheInDB,
database_.get(), GetOldDiskCachePath()));
}

void ServiceWorkerStorage::StartPurgingResources(
const std::vector<int64>& ids) {
DCHECK(has_checked_for_stale_resources_);
Expand Down
2 changes: 2 additions & 0 deletions content/browser/service_worker/service_worker_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@ class CONTENT_EXPORT ServiceWorkerStorage
void InitializeDiskCache();
void OnDiskCacheInitialized(int rv);

void DeleteOldDiskCache();

void StartPurgingResources(const std::vector<int64>& ids);
void StartPurgingResources(const ResourceList& resources);
void ContinuePurgingResources();
Expand Down

0 comments on commit 95d516e

Please sign in to comment.