| Index: content/browser/service_worker/service_worker_database.cc
|
| diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc
|
| index 842080ac0bb624840707d4b0ef28cac5beb3f94f..d328e9689afd2f7485c19c01f71c9a28bced02f1 100644
|
| --- a/content/browser/service_worker/service_worker_database.cc
|
| +++ b/content/browser/service_worker/service_worker_database.cc
|
| @@ -73,6 +73,16 @@
|
| //
|
| // key: "REGID_TO_ORIGIN:" + <int64 'registration_id'>
|
| // value: <GURL 'origin'>
|
| +//
|
| +// key: "INITDATA_DISKCACHE_MIGRATED"
|
| +// value: <empty>
|
| +// - This entry represents that the diskcache was migrated from BlockFile
|
| +// backend to Simple backend (http://crbug.com/487482).
|
| +//
|
| +// key: "INITDATA_OLD_DISKCACHE_EXISTS"
|
| +// value: <empty>
|
| +// - This entry represents that the diskcahes was migrate, but the old
|
| +// BlockFile diskcache still exists (http://crbug.com/487482).
|
| namespace content {
|
|
|
| namespace {
|
| @@ -82,6 +92,8 @@ const char kNextRegIdKey[] = "INITDATA_NEXT_REGISTRATION_ID";
|
| const char kNextResIdKey[] = "INITDATA_NEXT_RESOURCE_ID";
|
| const char kNextVerIdKey[] = "INITDATA_NEXT_VERSION_ID";
|
| const char kUniqueOriginKey[] = "INITDATA_UNIQUE_ORIGIN:";
|
| +const char kDiskCacheMigratedKey[] = "INITDATA_DISKCACHE_MIGRATED";
|
| +const char kOldDiskCacheExistsKey[] = "INITDATA_OLD_DISKCACHE_EXISTS";
|
|
|
| const char kRegKeyPrefix[] = "REG:";
|
| const char kRegUserDataKeyPrefix[] = "REG_USER_DATA:";
|
| @@ -89,6 +101,7 @@ const char kRegHasUserDataKeyPrefix[] = "REG_HAS_USER_DATA:";
|
| const char kRegIdToOriginKeyPrefix[] = "REGID_TO_ORIGIN:";
|
| const char kResKeyPrefix[] = "RES:";
|
| const char kKeySeparator = '\x00';
|
| +const char kEmptyValue[] = "";
|
|
|
| const char kUncommittedResIdKeyPrefix[] = "URES:";
|
| const char kPurgeableResIdKeyPrefix[] = "PRES:";
|
| @@ -419,6 +432,65 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetNextAvailableIds(
|
| }
|
|
|
| ServiceWorkerDatabase::Status
|
| +ServiceWorkerDatabase::ReadDiskCacheMigrationState(
|
| + DiskCacheMigrationState* state) {
|
| + DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| +
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status)) {
|
| + *state = DISKCACHE_NOT_USED;
|
| + return STATUS_OK;
|
| + }
|
| + if (status != STATUS_OK)
|
| + return status;
|
| +
|
| + std::string value;
|
| + status = LevelDBStatusToStatus(
|
| + db_->Get(leveldb::ReadOptions(), kDiskCacheMigratedKey, &value));
|
| + if (status != STATUS_ERROR_NOT_FOUND) {
|
| + if (status == STATUS_OK)
|
| + *state = DISKCACHE_MIGRATED;
|
| + HandleReadResult(FROM_HERE, status);
|
| + return status;
|
| + }
|
| + HandleReadResult(FROM_HERE, STATUS_OK);
|
| +
|
| + status = LevelDBStatusToStatus(
|
| + db_->Get(leveldb::ReadOptions(), kOldDiskCacheExistsKey, &value));
|
| + if (status != STATUS_ERROR_NOT_FOUND) {
|
| + if (status == STATUS_OK)
|
| + *state = DISKCACHE_NEEDS_TO_DELETE_OLD;
|
| + HandleReadResult(FROM_HERE, status);
|
| + return status;
|
| + }
|
| +
|
| + *state = DISKCACHE_NEEDS_TO_MIGRATE;
|
| + HandleReadResult(FROM_HERE, STATUS_OK);
|
| + return STATUS_OK;
|
| +}
|
| +
|
| +ServiceWorkerDatabase::Status
|
| +ServiceWorkerDatabase::WriteDiskCacheMigrationState(
|
| + DiskCacheMigrationState state) {
|
| + DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| + DCHECK(state == DISKCACHE_MIGRATED || state == DISKCACHE_NEEDS_TO_DELETE_OLD)
|
| + << state;
|
| +
|
| + Status status = LazyOpen(true);
|
| + if (status != STATUS_OK)
|
| + return status;
|
| +
|
| + leveldb::WriteBatch batch;
|
| + if (state == DISKCACHE_MIGRATED) {
|
| + batch.Put(kDiskCacheMigratedKey, kEmptyValue);
|
| + batch.Delete(kOldDiskCacheExistsKey);
|
| + } else if (state == DISKCACHE_NEEDS_TO_DELETE_OLD) {
|
| + batch.Put(kOldDiskCacheExistsKey, kEmptyValue);
|
| + }
|
| + return WriteBatch(&batch);
|
| +}
|
| +
|
| +ServiceWorkerDatabase::Status
|
| ServiceWorkerDatabase::GetOriginsWithRegistrations(std::set<GURL>* origins) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(origins->empty());
|
|
|