OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/browser/service_worker/service_worker_storage.h" | 5 #include "content/browser/service_worker/service_worker_storage.h" |
6 | 6 |
7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/sequenced_task_runner.h" | 10 #include "base/sequenced_task_runner.h" |
11 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
12 #include "base/task_runner_util.h" | 12 #include "base/task_runner_util.h" |
13 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
14 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" |
15 #include "content/browser/service_worker/service_worker_context_core.h" | 15 #include "content/browser/service_worker/service_worker_context_core.h" |
16 #include "content/browser/service_worker/service_worker_disk_cache.h" | 16 #include "content/browser/service_worker/service_worker_disk_cache.h" |
17 #include "content/browser/service_worker/service_worker_disk_cache_migrator.h" | |
17 #include "content/browser/service_worker/service_worker_info.h" | 18 #include "content/browser/service_worker/service_worker_info.h" |
18 #include "content/browser/service_worker/service_worker_metrics.h" | |
19 #include "content/browser/service_worker/service_worker_registration.h" | 19 #include "content/browser/service_worker/service_worker_registration.h" |
20 #include "content/browser/service_worker/service_worker_utils.h" | 20 #include "content/browser/service_worker/service_worker_utils.h" |
21 #include "content/browser/service_worker/service_worker_version.h" | 21 #include "content/browser/service_worker/service_worker_version.h" |
22 #include "content/common/service_worker/service_worker_types.h" | 22 #include "content/common/service_worker/service_worker_types.h" |
23 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
24 #include "net/base/completion_callback.h" | 24 #include "net/base/completion_callback.h" |
25 #include "net/base/io_buffer.h" | 25 #include "net/base/io_buffer.h" |
26 #include "net/base/net_errors.h" | 26 #include "net/base/net_errors.h" |
27 #include "storage/browser/quota/quota_manager_proxy.h" | 27 #include "storage/browser/quota/quota_manager_proxy.h" |
28 #include "storage/browser/quota/special_storage_policy.h" | 28 #include "storage/browser/quota/special_storage_policy.h" |
(...skipping 24 matching lines...) Expand all Loading... | |
53 const scoped_refptr<ServiceWorkerRegistration>& registration, | 53 const scoped_refptr<ServiceWorkerRegistration>& registration, |
54 ServiceWorkerStatusCode status, | 54 ServiceWorkerStatusCode status, |
55 const ServiceWorkerStorage::FindRegistrationCallback& callback) { | 55 const ServiceWorkerStorage::FindRegistrationCallback& callback) { |
56 RunSoon(from_here, | 56 RunSoon(from_here, |
57 base::Bind(&CompleteFindNow, registration, status, callback)); | 57 base::Bind(&CompleteFindNow, registration, status, callback)); |
58 } | 58 } |
59 | 59 |
60 const base::FilePath::CharType kDatabaseName[] = | 60 const base::FilePath::CharType kDatabaseName[] = |
61 FILE_PATH_LITERAL("Database"); | 61 FILE_PATH_LITERAL("Database"); |
62 const base::FilePath::CharType kDiskCacheName[] = | 62 const base::FilePath::CharType kDiskCacheName[] = |
63 FILE_PATH_LITERAL("Cache"); | 63 FILE_PATH_LITERAL("ScriptCache"); |
64 const base::FilePath::CharType kOldDiskCacheName[] = FILE_PATH_LITERAL("Cache"); | |
64 | 65 |
65 const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; | 66 const int kMaxMemDiskCacheSize = 10 * 1024 * 1024; |
66 const int kMaxDiskCacheSize = 250 * 1024 * 1024; | 67 const int kMaxDiskCacheSize = 250 * 1024 * 1024; |
67 | 68 |
68 ServiceWorkerStatusCode DatabaseStatusToStatusCode( | 69 ServiceWorkerStatusCode DatabaseStatusToStatusCode( |
69 ServiceWorkerDatabase::Status status) { | 70 ServiceWorkerDatabase::Status status) { |
70 switch (status) { | 71 switch (status) { |
71 case ServiceWorkerDatabase::STATUS_OK: | 72 case ServiceWorkerDatabase::STATUS_OK: |
72 return SERVICE_WORKER_OK; | 73 return SERVICE_WORKER_OK; |
73 case ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND: | 74 case ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND: |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
200 } | 201 } |
201 | 202 |
202 ReadSomeData(); | 203 ReadSomeData(); |
203 } | 204 } |
204 | 205 |
205 } // namespace | 206 } // namespace |
206 | 207 |
207 ServiceWorkerStorage::InitialData::InitialData() | 208 ServiceWorkerStorage::InitialData::InitialData() |
208 : next_registration_id(kInvalidServiceWorkerRegistrationId), | 209 : next_registration_id(kInvalidServiceWorkerRegistrationId), |
209 next_version_id(kInvalidServiceWorkerVersionId), | 210 next_version_id(kInvalidServiceWorkerVersionId), |
210 next_resource_id(kInvalidServiceWorkerResourceId) { | 211 next_resource_id(kInvalidServiceWorkerResourceId), |
212 migration_state(ServiceWorkerDatabase::DISKCACHE_UNKNOWN_STATE) { | |
211 } | 213 } |
212 | 214 |
213 ServiceWorkerStorage::InitialData::~InitialData() { | 215 ServiceWorkerStorage::InitialData::~InitialData() { |
214 } | 216 } |
215 | 217 |
216 ServiceWorkerStorage:: | 218 ServiceWorkerStorage:: |
217 DidDeleteRegistrationParams::DidDeleteRegistrationParams() | 219 DidDeleteRegistrationParams::DidDeleteRegistrationParams() |
218 : registration_id(kInvalidServiceWorkerRegistrationId) { | 220 : registration_id(kInvalidServiceWorkerRegistrationId) { |
219 } | 221 } |
220 | 222 |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
921 : next_registration_id_(kInvalidServiceWorkerRegistrationId), | 923 : next_registration_id_(kInvalidServiceWorkerRegistrationId), |
922 next_version_id_(kInvalidServiceWorkerVersionId), | 924 next_version_id_(kInvalidServiceWorkerVersionId), |
923 next_resource_id_(kInvalidServiceWorkerResourceId), | 925 next_resource_id_(kInvalidServiceWorkerResourceId), |
924 state_(UNINITIALIZED), | 926 state_(UNINITIALIZED), |
925 path_(path), | 927 path_(path), |
926 context_(context), | 928 context_(context), |
927 database_task_manager_(database_task_manager.Pass()), | 929 database_task_manager_(database_task_manager.Pass()), |
928 disk_cache_thread_(disk_cache_thread), | 930 disk_cache_thread_(disk_cache_thread), |
929 quota_manager_proxy_(quota_manager_proxy), | 931 quota_manager_proxy_(quota_manager_proxy), |
930 special_storage_policy_(special_storage_policy), | 932 special_storage_policy_(special_storage_policy), |
933 disk_cache_migration_state_( | |
934 ServiceWorkerDatabase::DISKCACHE_UNKNOWN_STATE), | |
931 is_purge_pending_(false), | 935 is_purge_pending_(false), |
932 has_checked_for_stale_resources_(false), | 936 has_checked_for_stale_resources_(false), |
933 weak_factory_(this) { | 937 weak_factory_(this) { |
934 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); | 938 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); |
935 } | 939 } |
936 | 940 |
937 base::FilePath ServiceWorkerStorage::GetDatabasePath() { | 941 base::FilePath ServiceWorkerStorage::GetDatabasePath() { |
938 if (path_.empty()) | 942 if (path_.empty()) |
939 return base::FilePath(); | 943 return base::FilePath(); |
940 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) | 944 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) |
941 .Append(kDatabaseName); | 945 .Append(kDatabaseName); |
942 } | 946 } |
943 | 947 |
944 base::FilePath ServiceWorkerStorage::GetDiskCachePath() { | 948 base::FilePath ServiceWorkerStorage::GetDiskCachePath() { |
945 if (path_.empty()) | 949 if (path_.empty()) |
946 return base::FilePath(); | 950 return base::FilePath(); |
947 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) | 951 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) |
948 .Append(kDiskCacheName); | 952 .Append(kDiskCacheName); |
949 } | 953 } |
950 | 954 |
955 base::FilePath ServiceWorkerStorage::GetOldDiskCachePath() { | |
956 if (path_.empty()) | |
957 return base::FilePath(); | |
958 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) | |
959 .Append(kOldDiskCacheName); | |
960 } | |
961 | |
951 bool ServiceWorkerStorage::LazyInitialize(const base::Closure& callback) { | 962 bool ServiceWorkerStorage::LazyInitialize(const base::Closure& callback) { |
952 if (!context_) | 963 if (!context_) |
953 return false; | 964 return false; |
954 | 965 |
955 switch (state_) { | 966 switch (state_) { |
956 case INITIALIZED: | 967 case INITIALIZED: |
957 return true; | 968 return true; |
958 case DISABLED: | 969 case DISABLED: |
959 return false; | 970 return false; |
960 case INITIALIZING: | 971 case INITIALIZING: |
(...skipping 19 matching lines...) Expand all Loading... | |
980 InitialData* data, | 991 InitialData* data, |
981 ServiceWorkerDatabase::Status status) { | 992 ServiceWorkerDatabase::Status status) { |
982 DCHECK(data); | 993 DCHECK(data); |
983 DCHECK_EQ(INITIALIZING, state_); | 994 DCHECK_EQ(INITIALIZING, state_); |
984 | 995 |
985 if (status == ServiceWorkerDatabase::STATUS_OK) { | 996 if (status == ServiceWorkerDatabase::STATUS_OK) { |
986 next_registration_id_ = data->next_registration_id; | 997 next_registration_id_ = data->next_registration_id; |
987 next_version_id_ = data->next_version_id; | 998 next_version_id_ = data->next_version_id; |
988 next_resource_id_ = data->next_resource_id; | 999 next_resource_id_ = data->next_resource_id; |
989 registered_origins_.swap(data->origins); | 1000 registered_origins_.swap(data->origins); |
1001 disk_cache_migration_state_ = data->migration_state; | |
990 state_ = INITIALIZED; | 1002 state_ = INITIALIZED; |
991 } else { | 1003 } else { |
992 DVLOG(2) << "Failed to initialize: " | 1004 DVLOG(2) << "Failed to initialize: " |
993 << ServiceWorkerDatabase::StatusToString(status); | 1005 << ServiceWorkerDatabase::StatusToString(status); |
994 ScheduleDeleteAndStartOver(); | 1006 ScheduleDeleteAndStartOver(); |
995 } | 1007 } |
996 | 1008 |
997 for (std::vector<base::Closure>::const_iterator it = pending_tasks_.begin(); | 1009 for (std::vector<base::Closure>::const_iterator it = pending_tasks_.begin(); |
998 it != pending_tasks_.end(); ++it) { | 1010 it != pending_tasks_.end(); ++it) { |
999 RunSoon(FROM_HERE, *it); | 1011 RunSoon(FROM_HERE, *it); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1097 void ServiceWorkerStorage::ReturnFoundRegistration( | 1109 void ServiceWorkerStorage::ReturnFoundRegistration( |
1098 const FindRegistrationCallback& callback, | 1110 const FindRegistrationCallback& callback, |
1099 const ServiceWorkerDatabase::RegistrationData& data, | 1111 const ServiceWorkerDatabase::RegistrationData& data, |
1100 const ResourceList& resources) { | 1112 const ResourceList& resources) { |
1101 DCHECK(!resources.empty()); | 1113 DCHECK(!resources.empty()); |
1102 scoped_refptr<ServiceWorkerRegistration> registration = | 1114 scoped_refptr<ServiceWorkerRegistration> registration = |
1103 GetOrCreateRegistration(data, resources); | 1115 GetOrCreateRegistration(data, resources); |
1104 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); | 1116 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); |
1105 } | 1117 } |
1106 | 1118 |
1119 void ServiceWorkerStorage::DidWriteDatabase( | |
1120 const base::Closure& continuation, | |
1121 ServiceWorkerDatabase::Status status) { | |
1122 if (status != ServiceWorkerDatabase::STATUS_OK) { | |
1123 ScheduleDeleteAndStartOver(); | |
1124 return; | |
1125 } | |
1126 continuation.Run(); | |
1127 } | |
1128 | |
1107 void ServiceWorkerStorage::DidGetRegistrations( | 1129 void ServiceWorkerStorage::DidGetRegistrations( |
1108 const GetRegistrationsCallback& callback, | 1130 const GetRegistrationsCallback& callback, |
1109 RegistrationList* registration_data_list, | 1131 RegistrationList* registration_data_list, |
1110 std::vector<ResourceList>* resources_list, | 1132 std::vector<ResourceList>* resources_list, |
1111 const GURL& origin_filter, | 1133 const GURL& origin_filter, |
1112 ServiceWorkerDatabase::Status status) { | 1134 ServiceWorkerDatabase::Status status) { |
1113 DCHECK(registration_data_list); | 1135 DCHECK(registration_data_list); |
1114 DCHECK(resources_list); | 1136 DCHECK(resources_list); |
1115 | 1137 |
1116 if (status != ServiceWorkerDatabase::STATUS_OK && | 1138 if (status != ServiceWorkerDatabase::STATUS_OK && |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1400 ServiceWorkerStorage::FindInstallingRegistrationForId( | 1422 ServiceWorkerStorage::FindInstallingRegistrationForId( |
1401 int64 registration_id) { | 1423 int64 registration_id) { |
1402 RegistrationRefsById::const_iterator found = | 1424 RegistrationRefsById::const_iterator found = |
1403 installing_registrations_.find(registration_id); | 1425 installing_registrations_.find(registration_id); |
1404 if (found == installing_registrations_.end()) | 1426 if (found == installing_registrations_.end()) |
1405 return NULL; | 1427 return NULL; |
1406 return found->second.get(); | 1428 return found->second.get(); |
1407 } | 1429 } |
1408 | 1430 |
1409 ServiceWorkerDiskCache* ServiceWorkerStorage::disk_cache() { | 1431 ServiceWorkerDiskCache* ServiceWorkerStorage::disk_cache() { |
1432 DCHECK_EQ(INITIALIZED, state_); | |
1410 if (disk_cache_) | 1433 if (disk_cache_) |
1411 return disk_cache_.get(); | 1434 return disk_cache_.get(); |
1412 | 1435 |
1413 disk_cache_ = ServiceWorkerDiskCache::CreateWithBlockFileBackend(); | 1436 disk_cache_ = ServiceWorkerDiskCache::CreateWithSimpleBackend(); |
1414 | 1437 |
1415 base::FilePath path = GetDiskCachePath(); | 1438 base::FilePath path = GetDiskCachePath(); |
1416 if (path.empty()) { | 1439 if (path.empty()) { |
1417 int rv = disk_cache_->InitWithMemBackend(kMaxMemDiskCacheSize, | 1440 int rv = disk_cache_->InitWithMemBackend(kMaxMemDiskCacheSize, |
1418 net::CompletionCallback()); | 1441 net::CompletionCallback()); |
1419 DCHECK_EQ(net::OK, rv); | 1442 DCHECK_EQ(net::OK, rv); |
1420 return disk_cache_.get(); | 1443 return disk_cache_.get(); |
1421 } | 1444 } |
1422 | 1445 |
1446 switch (disk_cache_migration_state_) { | |
michaeln
2015/06/12 20:47:58
if (migration_needed_)
start it; // when its do
nhiroki
2015/06/15 16:43:27
Done.
| |
1447 case ServiceWorkerDatabase::DISKCACHE_NOT_USED: { | |
1448 // Defer the start of initialization until a migration state is updated. | |
1449 disk_cache_->set_is_waiting_to_initialize(true); | |
1450 base::Closure continuation = | |
1451 base::Bind(&ServiceWorkerStorage::InitializeDiskCache, | |
1452 weak_factory_.GetWeakPtr()); | |
1453 PostTaskAndReplyWithResult( | |
1454 database_task_manager_->GetTaskRunner(), FROM_HERE, | |
1455 base::Bind(&ServiceWorkerDatabase::WriteDiskCacheMigrationState, | |
1456 base::Unretained(database_.get()), | |
1457 ServiceWorkerDatabase::DISKCACHE_MIGRATED), | |
1458 base::Bind(&ServiceWorkerStorage::DidWriteDatabase, | |
1459 weak_factory_.GetWeakPtr(), continuation)); | |
1460 ServiceWorkerMetrics::RecordDiskCacheMigrationResult( | |
1461 ServiceWorkerMetrics::MIGRATION_NOT_NECESSARY); | |
1462 break; | |
1463 } | |
1464 case ServiceWorkerDatabase::DISKCACHE_NEEDS_TO_MIGRATE: { | |
1465 // Defer the start of initialization until a migration is complete. | |
1466 disk_cache_->set_is_waiting_to_initialize(true); | |
1467 DCHECK(!disk_cache_migrator_); | |
1468 disk_cache_migrator_.reset(new ServiceWorkerDiskCacheMigrator( | |
1469 GetOldDiskCachePath(), GetDiskCachePath(), kMaxDiskCacheSize, | |
1470 disk_cache_thread_)); | |
1471 disk_cache_migrator_->Start( | |
1472 base::Bind(&ServiceWorkerStorage::DidMigrateDiskCache, | |
1473 weak_factory_.GetWeakPtr())); | |
1474 break; | |
1475 } | |
1476 case ServiceWorkerDatabase::DISKCACHE_NEEDS_TO_DELETE_OLD: { | |
1477 // A migration was complete, but an old diskcache still exists. | |
1478 base::Closure continuation = base::Bind(&base::DoNothing); | |
1479 BrowserThread::PostAfterStartupTask( | |
1480 FROM_HERE, database_task_manager_->GetTaskRunner(), | |
1481 base::Bind(&DeleteOldDiskCacheInDB, database_.get(), | |
1482 base::ThreadTaskRunnerHandle::Get(), GetOldDiskCachePath(), | |
1483 base::Bind(&ServiceWorkerStorage::DidWriteDatabase, | |
1484 weak_factory_.GetWeakPtr(), continuation))); | |
1485 | |
1486 // Don't have to wait for the completion of deleting the old diskcache. | |
1487 // Immediately continue to initialize. | |
1488 ServiceWorkerMetrics::RecordDiskCacheMigrationResult( | |
1489 ServiceWorkerMetrics::MIGRATION_NOT_NECESSARY); | |
1490 InitializeDiskCache(); | |
1491 break; | |
1492 } | |
1493 case ServiceWorkerDatabase::DISKCACHE_MIGRATED: { | |
1494 ServiceWorkerMetrics::RecordDiskCacheMigrationResult( | |
1495 ServiceWorkerMetrics::MIGRATION_NOT_NECESSARY); | |
1496 InitializeDiskCache(); | |
1497 break; | |
1498 } | |
1499 case ServiceWorkerDatabase::DISKCACHE_UNKNOWN_STATE: { | |
1500 NOTREACHED(); | |
1501 break; | |
1502 } | |
1503 } | |
1504 | |
1505 return disk_cache_.get(); | |
1506 } | |
1507 | |
1508 void ServiceWorkerStorage::DidMigrateDiskCache(ServiceWorkerStatusCode status) { | |
1509 disk_cache_migrator_.reset(); | |
1510 | |
1511 if (status != SERVICE_WORKER_OK) { | |
1512 LOG(ERROR) << "Failed to migrate the diskcache: " | |
1513 << ServiceWorkerStatusToString(status); | |
1514 ServiceWorkerMetrics::RecordDiskCacheMigrationResult( | |
1515 ServiceWorkerMetrics::MIGRATION_ERROR_FAILED); | |
1516 | |
1517 // Give up a migration and recreate the whole storage. | |
1518 ScheduleDeleteAndStartOver(); | |
1519 | |
1520 // Delete the old diskcache. | |
1521 disk_cache_thread_->PostTask( | |
1522 FROM_HERE, base::Bind(base::IgnoreResult(&base::DeleteFile), | |
1523 GetOldDiskCachePath(), true)); | |
1524 return; | |
1525 } | |
1526 | |
1527 // The migration was complete, but an old diskcache still exists. | |
1528 base::Closure continuation = base::Bind(&base::DoNothing); | |
1529 BrowserThread::PostAfterStartupTask( | |
1530 FROM_HERE, database_task_manager_->GetTaskRunner(), | |
1531 base::Bind(&DeleteOldDiskCacheInDB, database_.get(), | |
1532 base::ThreadTaskRunnerHandle::Get(), GetOldDiskCachePath(), | |
1533 base::Bind(&ServiceWorkerStorage::DidWriteDatabase, | |
1534 weak_factory_.GetWeakPtr(), continuation))); | |
1535 | |
1536 // Don't have to wait for the completion of deleting the old diskcache. | |
1537 // Immediately continue to initialize. | |
1538 ServiceWorkerMetrics::RecordDiskCacheMigrationResult( | |
1539 ServiceWorkerMetrics::MIGRATION_OK); | |
1540 InitializeDiskCache(); | |
1541 } | |
1542 | |
1543 void ServiceWorkerStorage::InitializeDiskCache() { | |
1544 disk_cache_->set_is_waiting_to_initialize(false); | |
1423 int rv = disk_cache_->InitWithDiskBackend( | 1545 int rv = disk_cache_->InitWithDiskBackend( |
1424 path, | 1546 GetDiskCachePath(), kMaxDiskCacheSize, false, disk_cache_thread_, |
1425 kMaxDiskCacheSize, | |
1426 false, | |
1427 disk_cache_thread_, | |
1428 base::Bind(&ServiceWorkerStorage::OnDiskCacheInitialized, | 1547 base::Bind(&ServiceWorkerStorage::OnDiskCacheInitialized, |
1429 weak_factory_.GetWeakPtr())); | 1548 weak_factory_.GetWeakPtr())); |
1430 if (rv != net::ERR_IO_PENDING) | 1549 if (rv != net::ERR_IO_PENDING) |
1431 OnDiskCacheInitialized(rv); | 1550 OnDiskCacheInitialized(rv); |
1432 | |
1433 return disk_cache_.get(); | |
1434 } | 1551 } |
1435 | 1552 |
1436 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { | 1553 void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { |
1437 if (rv != net::OK) { | 1554 if (rv != net::OK) { |
1438 LOG(ERROR) << "Failed to open the serviceworker diskcache: " | 1555 LOG(ERROR) << "Failed to open the serviceworker diskcache: " |
1439 << net::ErrorToString(rv); | 1556 << net::ErrorToString(rv); |
1440 ScheduleDeleteAndStartOver(); | 1557 ScheduleDeleteAndStartOver(); |
1441 } | 1558 } |
1442 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); | 1559 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); |
1443 } | 1560 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1581 ServiceWorkerDatabase::Status status = | 1698 ServiceWorkerDatabase::Status status = |
1582 database->GetNextAvailableIds(&data->next_registration_id, | 1699 database->GetNextAvailableIds(&data->next_registration_id, |
1583 &data->next_version_id, | 1700 &data->next_version_id, |
1584 &data->next_resource_id); | 1701 &data->next_resource_id); |
1585 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1702 if (status != ServiceWorkerDatabase::STATUS_OK) { |
1586 original_task_runner->PostTask( | 1703 original_task_runner->PostTask( |
1587 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); | 1704 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); |
1588 return; | 1705 return; |
1589 } | 1706 } |
1590 | 1707 |
1708 status = database->ReadDiskCacheMigrationState(&data->migration_state); | |
1709 if (status != ServiceWorkerDatabase::STATUS_OK) { | |
1710 original_task_runner->PostTask( | |
1711 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); | |
1712 return; | |
1713 } | |
1714 | |
1591 status = database->GetOriginsWithRegistrations(&data->origins); | 1715 status = database->GetOriginsWithRegistrations(&data->origins); |
1592 original_task_runner->PostTask( | 1716 original_task_runner->PostTask( |
1593 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); | 1717 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); |
1594 } | 1718 } |
1595 | 1719 |
1720 void ServiceWorkerStorage::DeleteOldDiskCacheInDB( | |
1721 ServiceWorkerDatabase* database, | |
1722 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | |
1723 const base::FilePath& disk_cache_path, | |
1724 const DatabaseStatusCallback& callback) { | |
1725 DCHECK(database); | |
1726 ServiceWorkerDatabase::Status status = database->WriteDiskCacheMigrationState( | |
1727 ServiceWorkerDatabase::DISKCACHE_NEEDS_TO_DELETE_OLD); | |
1728 if (status != ServiceWorkerDatabase::STATUS_OK) { | |
1729 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, status)); | |
1730 return; | |
1731 } | |
1732 | |
1733 if (!base::DeleteFile(disk_cache_path, true)) { | |
michaeln
2015/06/12 20:47:58
it would be good to defer this part till 'aftersta
nhiroki
2015/06/15 16:43:27
Done.
| |
1734 // Ignore a failure. A migration state has already been recorded in the | |
1735 // database and a retry happens on the next diskcache initialization. | |
1736 original_task_runner->PostTask( | |
1737 FROM_HERE, base::Bind(callback, ServiceWorkerDatabase::STATUS_OK)); | |
1738 return; | |
1739 } | |
1740 | |
1741 status = database->WriteDiskCacheMigrationState( | |
1742 ServiceWorkerDatabase::DISKCACHE_MIGRATED); | |
1743 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, status)); | |
1744 } | |
1745 | |
1596 void ServiceWorkerStorage::DeleteRegistrationFromDB( | 1746 void ServiceWorkerStorage::DeleteRegistrationFromDB( |
1597 ServiceWorkerDatabase* database, | 1747 ServiceWorkerDatabase* database, |
1598 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1748 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
1599 int64 registration_id, | 1749 int64 registration_id, |
1600 const GURL& origin, | 1750 const GURL& origin, |
1601 const DeleteRegistrationCallback& callback) { | 1751 const DeleteRegistrationCallback& callback) { |
1602 DCHECK(database); | 1752 DCHECK(database); |
1603 | 1753 |
1604 ServiceWorkerDatabase::RegistrationData deleted_version; | 1754 ServiceWorkerDatabase::RegistrationData deleted_version; |
1605 std::vector<int64> newly_purgeable_resources; | 1755 std::vector<int64> newly_purgeable_resources; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1850 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 2000 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
1851 return; | 2001 return; |
1852 } | 2002 } |
1853 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 2003 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
1854 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( | 2004 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( |
1855 ServiceWorkerMetrics::DELETE_OK); | 2005 ServiceWorkerMetrics::DELETE_OK); |
1856 callback.Run(SERVICE_WORKER_OK); | 2006 callback.Run(SERVICE_WORKER_OK); |
1857 } | 2007 } |
1858 | 2008 |
1859 } // namespace content | 2009 } // namespace content |
OLD | NEW |