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

Side by Side Diff: content/browser/cache_storage/cache_storage_cache.cc

Issue 2416713002: Write out CacheStorageCache size to index file. (Closed)
Patch Set: BrowserThread::PostDelayedTask(IO, ...) --> base::ThreadTaskRunnerHandle::Get()->Post* Created 3 years, 12 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/cache_storage/cache_storage_cache.h" 5 #include "content/browser/cache_storage/cache_storage_cache.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <limits> 9 #include <limits>
10 #include <memory> 10 #include <memory>
11 #include <string> 11 #include <string>
12 #include <utility> 12 #include <utility>
13 13
14 #include "base/barrier_closure.h" 14 #include "base/barrier_closure.h"
15 #include "base/bind_helpers.h" 15 #include "base/bind_helpers.h"
16 #include "base/files/file_path.h" 16 #include "base/files/file_path.h"
17 #include "base/guid.h" 17 #include "base/guid.h"
18 #include "base/macros.h" 18 #include "base/macros.h"
19 #include "base/memory/ptr_util.h" 19 #include "base/memory/ptr_util.h"
20 #include "base/metrics/histogram_macros.h" 20 #include "base/metrics/histogram_macros.h"
21 #include "base/strings/string_split.h" 21 #include "base/strings/string_split.h"
22 #include "base/strings/string_util.h" 22 #include "base/strings/string_util.h"
23 #include "base/threading/thread_task_runner_handle.h" 23 #include "base/threading/thread_task_runner_handle.h"
24 #include "content/browser/cache_storage/cache_storage.pb.h" 24 #include "content/browser/cache_storage/cache_storage.pb.h"
25 #include "content/browser/cache_storage/cache_storage_blob_to_disk_cache.h" 25 #include "content/browser/cache_storage/cache_storage_blob_to_disk_cache.h"
26 #include "content/browser/cache_storage/cache_storage_cache_handle.h" 26 #include "content/browser/cache_storage/cache_storage_cache_handle.h"
27 #include "content/browser/cache_storage/cache_storage_cache_observer.h"
27 #include "content/browser/cache_storage/cache_storage_scheduler.h" 28 #include "content/browser/cache_storage/cache_storage_scheduler.h"
28 #include "content/public/browser/browser_thread.h" 29 #include "content/public/browser/browser_thread.h"
29 #include "content/public/common/referrer.h" 30 #include "content/public/common/referrer.h"
30 #include "net/base/completion_callback.h" 31 #include "net/base/completion_callback.h"
31 #include "net/base/io_buffer.h" 32 #include "net/base/io_buffer.h"
32 #include "net/base/net_errors.h" 33 #include "net/base/net_errors.h"
33 #include "net/disk_cache/disk_cache.h" 34 #include "net/disk_cache/disk_cache.h"
34 #include "net/url_request/url_request_context_getter.h" 35 #include "net/url_request/url_request_context_getter.h"
35 #include "storage/browser/blob/blob_data_builder.h" 36 #include "storage/browser/blob/blob_data_builder.h"
36 #include "storage/browser/blob/blob_data_handle.h" 37 #include "storage/browser/blob/blob_data_handle.h"
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 }; 257 };
257 258
258 // static 259 // static
259 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( 260 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache(
260 const GURL& origin, 261 const GURL& origin,
261 const std::string& cache_name, 262 const std::string& cache_name,
262 CacheStorage* cache_storage, 263 CacheStorage* cache_storage,
263 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 264 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
264 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 265 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
265 base::WeakPtr<storage::BlobStorageContext> blob_context) { 266 base::WeakPtr<storage::BlobStorageContext> blob_context) {
266 CacheStorageCache* cache = 267 CacheStorageCache* cache = new CacheStorageCache(
267 new CacheStorageCache(origin, cache_name, base::FilePath(), cache_storage, 268 origin, cache_name, base::FilePath(), cache_storage,
268 std::move(request_context_getter), 269 std::move(request_context_getter), std::move(quota_manager_proxy),
269 std::move(quota_manager_proxy), blob_context); 270 blob_context, 0 /* cache_size */);
270 cache->InitBackend(); 271 cache->SetObserver(cache_storage), cache->InitBackend();
271 return base::WrapUnique(cache); 272 return base::WrapUnique(cache);
272 } 273 }
273 274
274 // static 275 // static
275 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( 276 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache(
276 const GURL& origin, 277 const GURL& origin,
277 const std::string& cache_name, 278 const std::string& cache_name,
278 CacheStorage* cache_storage, 279 CacheStorage* cache_storage,
279 const base::FilePath& path, 280 const base::FilePath& path,
280 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 281 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
281 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 282 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
282 base::WeakPtr<storage::BlobStorageContext> blob_context) { 283 base::WeakPtr<storage::BlobStorageContext> blob_context,
283 CacheStorageCache* cache = 284 int64_t cache_size) {
284 new CacheStorageCache(origin, cache_name, path, cache_storage, 285 CacheStorageCache* cache = new CacheStorageCache(
285 std::move(request_context_getter), 286 origin, cache_name, path, cache_storage,
286 std::move(quota_manager_proxy), blob_context); 287 std::move(request_context_getter), std::move(quota_manager_proxy),
287 cache->InitBackend(); 288 blob_context, cache_size);
289 cache->SetObserver(cache_storage), cache->InitBackend();
288 return base::WrapUnique(cache); 290 return base::WrapUnique(cache);
289 } 291 }
290 292
291 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { 293 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() {
292 return weak_ptr_factory_.GetWeakPtr(); 294 return weak_ptr_factory_.GetWeakPtr();
293 } 295 }
294 296
295 void CacheStorageCache::Match( 297 void CacheStorageCache::Match(
296 std::unique_ptr<ServiceWorkerFetchRequest> request, 298 std::unique_ptr<ServiceWorkerFetchRequest> request,
297 const CacheStorageCacheQueryParams& match_params, 299 const CacheStorageCacheQueryParams& match_params,
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 return; 493 return;
492 } 494 }
493 495
494 scheduler_->ScheduleOperation( 496 scheduler_->ScheduleOperation(
495 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(), 497 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(),
496 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize, 498 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize,
497 weak_ptr_factory_.GetWeakPtr(), 499 weak_ptr_factory_.GetWeakPtr(),
498 scheduler_->WrapCallbackToRunNext(callback)))); 500 scheduler_->WrapCallbackToRunNext(callback))));
499 } 501 }
500 502
503 void CacheStorageCache::SetObserver(CacheStorageCacheObserver* observer) {
504 DCHECK((observer == nullptr) ^ (cache_observer_ == nullptr));
505 cache_observer_ = observer;
506 }
507
501 CacheStorageCache::~CacheStorageCache() { 508 CacheStorageCache::~CacheStorageCache() {
502 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_); 509 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_);
503 } 510 }
504 511
505 CacheStorageCache::CacheStorageCache( 512 CacheStorageCache::CacheStorageCache(
506 const GURL& origin, 513 const GURL& origin,
507 const std::string& cache_name, 514 const std::string& cache_name,
508 const base::FilePath& path, 515 const base::FilePath& path,
509 CacheStorage* cache_storage, 516 CacheStorage* cache_storage,
510 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 517 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
511 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 518 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
512 base::WeakPtr<storage::BlobStorageContext> blob_context) 519 base::WeakPtr<storage::BlobStorageContext> blob_context,
520 int64_t cache_size)
513 : origin_(origin), 521 : origin_(origin),
514 cache_name_(cache_name), 522 cache_name_(cache_name),
515 path_(path), 523 path_(path),
516 cache_storage_(cache_storage), 524 cache_storage_(cache_storage),
517 request_context_getter_(std::move(request_context_getter)), 525 request_context_getter_(std::move(request_context_getter)),
518 quota_manager_proxy_(std::move(quota_manager_proxy)), 526 quota_manager_proxy_(std::move(quota_manager_proxy)),
519 blob_storage_context_(blob_context), 527 blob_storage_context_(blob_context),
520 scheduler_( 528 scheduler_(
521 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)), 529 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)),
530 cache_size_(cache_size),
522 max_query_size_bytes_(kMaxQueryCacheResultBytes), 531 max_query_size_bytes_(kMaxQueryCacheResultBytes),
532 cache_observer_(nullptr),
523 memory_only_(path.empty()), 533 memory_only_(path.empty()),
524 weak_ptr_factory_(this) { 534 weak_ptr_factory_(this) {
525 DCHECK(!origin_.is_empty()); 535 DCHECK(!origin_.is_empty());
526 DCHECK(quota_manager_proxy_.get()); 536 DCHECK(quota_manager_proxy_.get());
527 537
528 quota_manager_proxy_->NotifyOriginInUse(origin_); 538 quota_manager_proxy_->NotifyOriginInUse(origin_);
529 } 539 }
530 540
531 void CacheStorageCache::QueryCache( 541 void CacheStorageCache::QueryCache(
532 std::unique_ptr<ServiceWorkerFetchRequest> request, 542 std::unique_ptr<ServiceWorkerFetchRequest> request,
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 &CacheStorageCache::UpdateCacheSizeGotSize, 1182 &CacheStorageCache::UpdateCacheSizeGotSize,
1173 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle()))); 1183 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle())));
1174 1184
1175 if (rv != net::ERR_IO_PENDING) 1185 if (rv != net::ERR_IO_PENDING)
1176 UpdateCacheSizeGotSize(CreateCacheHandle(), rv); 1186 UpdateCacheSizeGotSize(CreateCacheHandle(), rv);
1177 } 1187 }
1178 1188
1179 void CacheStorageCache::UpdateCacheSizeGotSize( 1189 void CacheStorageCache::UpdateCacheSizeGotSize(
1180 std::unique_ptr<CacheStorageCacheHandle> cache_handle, 1190 std::unique_ptr<CacheStorageCacheHandle> cache_handle,
1181 int current_cache_size) { 1191 int current_cache_size) {
1192 DCHECK_NE(current_cache_size, CacheStorage::kSizeUnknown);
1182 int64_t old_cache_size = cache_size_; 1193 int64_t old_cache_size = cache_size_;
1183 cache_size_ = current_cache_size; 1194 cache_size_ = current_cache_size;
1184 1195
1196 int64_t size_delta = current_cache_size - old_cache_size;
1197
1185 quota_manager_proxy_->NotifyStorageModified( 1198 quota_manager_proxy_->NotifyStorageModified(
1186 storage::QuotaClient::kServiceWorkerCache, origin_, 1199 storage::QuotaClient::kServiceWorkerCache, origin_,
1187 storage::kStorageTypeTemporary, current_cache_size - old_cache_size); 1200 storage::kStorageTypeTemporary, size_delta);
1201
1202 if (cache_observer_)
1203 cache_observer_->CacheSizeUpdated(this, current_cache_size);
1188 } 1204 }
1189 1205
1190 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation, 1206 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation,
1191 const ErrorCallback& callback) { 1207 const ErrorCallback& callback) {
1192 DCHECK(BACKEND_OPEN == backend_state_ || initializing_); 1208 DCHECK(BACKEND_OPEN == backend_state_ || initializing_);
1193 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE, 1209 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE,
1194 operation.operation_type); 1210 operation.operation_type);
1195 1211
1196 std::unique_ptr<ServiceWorkerFetchRequest> request( 1212 std::unique_ptr<ServiceWorkerFetchRequest> request(
1197 new ServiceWorkerFetchRequest( 1213 new ServiceWorkerFetchRequest(
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 base::Bind(&CacheStorageCache::InitGotCacheSize, 1378 base::Bind(&CacheStorageCache::InitGotCacheSize,
1363 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error)); 1379 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error));
1364 1380
1365 if (rv != net::ERR_IO_PENDING) 1381 if (rv != net::ERR_IO_PENDING)
1366 InitGotCacheSize(callback, cache_create_error, rv); 1382 InitGotCacheSize(callback, cache_create_error, rv);
1367 } 1383 }
1368 1384
1369 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback, 1385 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback,
1370 CacheStorageError cache_create_error, 1386 CacheStorageError cache_create_error,
1371 int cache_size) { 1387 int cache_size) {
1388 // Now that we know the cache size either 1) the cache size should be unknown
1389 // (which is why the size was calculated), or 2) it must match the current
1390 // size. If the sizes aren't equal then there is a bug in how the cache size
1391 // is saved in the store's index.
1392 if (cache_size_ != CacheStorage::kSizeUnknown && cache_size_ != cache_size) {
1393 // TODO(cmumford): Add UMA for this.
1394 LOG(ERROR) << "Cache size/index mismatch";
1395 DCHECK_EQ(cache_size_, cache_size);
bcwhite 2017/01/19 22:21:38 Would you remove this, please? It causes crash-lo
1396 }
1372 cache_size_ = cache_size; 1397 cache_size_ = cache_size;
1373 initializing_ = false; 1398 initializing_ = false;
1374 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ && 1399 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ &&
1375 backend_state_ == BACKEND_UNINITIALIZED) 1400 backend_state_ == BACKEND_UNINITIALIZED)
1376 ? BACKEND_OPEN 1401 ? BACKEND_OPEN
1377 : BACKEND_CLOSED; 1402 : BACKEND_CLOSED;
1378 1403
1379 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult", 1404 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult",
1380 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1); 1405 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1);
1381 1406
1407 if (cache_observer_)
1408 cache_observer_->CacheSizeUpdated(this, cache_size_);
1409
1382 callback.Run(); 1410 callback.Run();
1383 } 1411 }
1384 1412
1385 void CacheStorageCache::PopulateRequestFromMetadata( 1413 void CacheStorageCache::PopulateRequestFromMetadata(
1386 const proto::CacheMetadata& metadata, 1414 const proto::CacheMetadata& metadata,
1387 const GURL& request_url, 1415 const GURL& request_url,
1388 ServiceWorkerFetchRequest* request) { 1416 ServiceWorkerFetchRequest* request) {
1389 *request = 1417 *request =
1390 ServiceWorkerFetchRequest(request_url, metadata.request().method(), 1418 ServiceWorkerFetchRequest(request_url, metadata.request().method(),
1391 ServiceWorkerHeaderMap(), Referrer(), false); 1419 ServiceWorkerHeaderMap(), Referrer(), false);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); 1480 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA);
1453 return blob_storage_context_->AddFinishedBlob(&blob_data); 1481 return blob_storage_context_->AddFinishedBlob(&blob_data);
1454 } 1482 }
1455 1483
1456 std::unique_ptr<CacheStorageCacheHandle> 1484 std::unique_ptr<CacheStorageCacheHandle>
1457 CacheStorageCache::CreateCacheHandle() { 1485 CacheStorageCache::CreateCacheHandle() {
1458 return cache_storage_->CreateCacheHandle(this); 1486 return cache_storage_->CreateCacheHandle(this);
1459 } 1487 }
1460 1488
1461 } // namespace content 1489 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/cache_storage/cache_storage_cache.h ('k') | content/browser/cache_storage/cache_storage_cache_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698