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

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

Issue 2416713002: Write out CacheStorageCache size to index file. (Closed)
Patch Set: Consolidated observer methods, renames, cleanup, etc. Created 4 years, 1 month 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( 259 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache(
259 const GURL& origin, 260 const GURL& origin,
260 const std::string& cache_name, 261 const std::string& cache_name,
261 CacheStorage* cache_storage, 262 CacheStorage* cache_storage,
262 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 263 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
263 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 264 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
264 base::WeakPtr<storage::BlobStorageContext> blob_context) { 265 base::WeakPtr<storage::BlobStorageContext> blob_context) {
265 CacheStorageCache* cache = 266 CacheStorageCache* cache =
266 new CacheStorageCache(origin, cache_name, base::FilePath(), cache_storage, 267 new CacheStorageCache(origin, cache_name, base::FilePath(), cache_storage,
267 std::move(request_context_getter), 268 std::move(request_context_getter),
268 std::move(quota_manager_proxy), blob_context); 269 std::move(quota_manager_proxy), blob_context, 0);
jkarlin 2016/11/11 18:24:57 nit: can you add /* cache size */ after the 0?
cmumford 2016/11/22 17:45:03 Done.
269 cache->InitBackend(); 270 cache->SetObserver(cache_storage), cache->InitBackend();
270 return base::WrapUnique(cache); 271 return base::WrapUnique(cache);
271 } 272 }
272 273
273 // static 274 // static
274 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( 275 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache(
275 const GURL& origin, 276 const GURL& origin,
276 const std::string& cache_name, 277 const std::string& cache_name,
277 CacheStorage* cache_storage, 278 CacheStorage* cache_storage,
278 const base::FilePath& path, 279 const base::FilePath& path,
279 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 280 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
280 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 281 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
281 base::WeakPtr<storage::BlobStorageContext> blob_context) { 282 base::WeakPtr<storage::BlobStorageContext> blob_context,
282 CacheStorageCache* cache = 283 int64_t cache_size) {
283 new CacheStorageCache(origin, cache_name, path, cache_storage, 284 CacheStorageCache* cache = new CacheStorageCache(
284 std::move(request_context_getter), 285 origin, cache_name, path, cache_storage,
285 std::move(quota_manager_proxy), blob_context); 286 std::move(request_context_getter), std::move(quota_manager_proxy),
286 cache->InitBackend(); 287 blob_context, cache_size);
288 cache->SetObserver(cache_storage), cache->InitBackend();
287 return base::WrapUnique(cache); 289 return base::WrapUnique(cache);
288 } 290 }
289 291
290 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { 292 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() {
291 return weak_ptr_factory_.GetWeakPtr(); 293 return weak_ptr_factory_.GetWeakPtr();
292 } 294 }
293 295
294 void CacheStorageCache::Match( 296 void CacheStorageCache::Match(
295 std::unique_ptr<ServiceWorkerFetchRequest> request, 297 std::unique_ptr<ServiceWorkerFetchRequest> request,
296 const CacheStorageCacheQueryParams& match_params, 298 const CacheStorageCacheQueryParams& match_params,
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 return; 492 return;
491 } 493 }
492 494
493 scheduler_->ScheduleOperation( 495 scheduler_->ScheduleOperation(
494 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(), 496 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(),
495 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize, 497 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize,
496 weak_ptr_factory_.GetWeakPtr(), 498 weak_ptr_factory_.GetWeakPtr(),
497 scheduler_->WrapCallbackToRunNext(callback)))); 499 scheduler_->WrapCallbackToRunNext(callback))));
498 } 500 }
499 501
502 void CacheStorageCache::SetObserver(CacheStorageCacheObserver* observer) {
503 cache_observer_ = observer;
504 }
505
500 CacheStorageCache::~CacheStorageCache() { 506 CacheStorageCache::~CacheStorageCache() {
501 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_); 507 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_);
502 } 508 }
503 509
504 CacheStorageCache::CacheStorageCache( 510 CacheStorageCache::CacheStorageCache(
505 const GURL& origin, 511 const GURL& origin,
506 const std::string& cache_name, 512 const std::string& cache_name,
507 const base::FilePath& path, 513 const base::FilePath& path,
508 CacheStorage* cache_storage, 514 CacheStorage* cache_storage,
509 scoped_refptr<net::URLRequestContextGetter> request_context_getter, 515 scoped_refptr<net::URLRequestContextGetter> request_context_getter,
510 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, 516 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
511 base::WeakPtr<storage::BlobStorageContext> blob_context) 517 base::WeakPtr<storage::BlobStorageContext> blob_context,
518 int64_t cache_size)
512 : origin_(origin), 519 : origin_(origin),
513 cache_name_(cache_name), 520 cache_name_(cache_name),
514 path_(path), 521 path_(path),
515 cache_storage_(cache_storage), 522 cache_storage_(cache_storage),
516 request_context_getter_(std::move(request_context_getter)), 523 request_context_getter_(std::move(request_context_getter)),
517 quota_manager_proxy_(std::move(quota_manager_proxy)), 524 quota_manager_proxy_(std::move(quota_manager_proxy)),
518 blob_storage_context_(blob_context), 525 blob_storage_context_(blob_context),
519 scheduler_( 526 scheduler_(
520 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)), 527 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)),
528 cache_size_(cache_size),
521 max_query_size_bytes_(kMaxQueryCacheResultBytes), 529 max_query_size_bytes_(kMaxQueryCacheResultBytes),
530 cache_observer_(nullptr),
522 memory_only_(path.empty()), 531 memory_only_(path.empty()),
523 weak_ptr_factory_(this) { 532 weak_ptr_factory_(this) {
524 DCHECK(!origin_.is_empty()); 533 DCHECK(!origin_.is_empty());
525 DCHECK(quota_manager_proxy_.get()); 534 DCHECK(quota_manager_proxy_.get());
526 535
527 quota_manager_proxy_->NotifyOriginInUse(origin_); 536 quota_manager_proxy_->NotifyOriginInUse(origin_);
528 } 537 }
529 538
530 void CacheStorageCache::QueryCache( 539 void CacheStorageCache::QueryCache(
531 std::unique_ptr<ServiceWorkerFetchRequest> request, 540 std::unique_ptr<ServiceWorkerFetchRequest> request,
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 &CacheStorageCache::UpdateCacheSizeGotSize, 1186 &CacheStorageCache::UpdateCacheSizeGotSize,
1178 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle()))); 1187 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle())));
1179 1188
1180 if (rv != net::ERR_IO_PENDING) 1189 if (rv != net::ERR_IO_PENDING)
1181 UpdateCacheSizeGotSize(CreateCacheHandle(), rv); 1190 UpdateCacheSizeGotSize(CreateCacheHandle(), rv);
1182 } 1191 }
1183 1192
1184 void CacheStorageCache::UpdateCacheSizeGotSize( 1193 void CacheStorageCache::UpdateCacheSizeGotSize(
1185 std::unique_ptr<CacheStorageCacheHandle> cache_handle, 1194 std::unique_ptr<CacheStorageCacheHandle> cache_handle,
1186 int current_cache_size) { 1195 int current_cache_size) {
1196 DCHECK_NE(current_cache_size, CacheStorage::kSizeUnknown);
1187 int64_t old_cache_size = cache_size_; 1197 int64_t old_cache_size = cache_size_;
1188 cache_size_ = current_cache_size; 1198 cache_size_ = current_cache_size;
1189 1199
1200 int64_t size_delta = current_cache_size - old_cache_size;
1201
1190 quota_manager_proxy_->NotifyStorageModified( 1202 quota_manager_proxy_->NotifyStorageModified(
1191 storage::QuotaClient::kServiceWorkerCache, origin_, 1203 storage::QuotaClient::kServiceWorkerCache, origin_,
1192 storage::kStorageTypeTemporary, current_cache_size - old_cache_size); 1204 storage::kStorageTypeTemporary, size_delta);
1205
1206 if (cache_observer_)
1207 cache_observer_->CacheSizeSet(
1208 this, CacheStorageCacheObserver::Whence::DELTA, size_delta);
1193 } 1209 }
1194 1210
1195 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation, 1211 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation,
1196 const ErrorCallback& callback) { 1212 const ErrorCallback& callback) {
1197 DCHECK(BACKEND_OPEN == backend_state_ || initializing_); 1213 DCHECK(BACKEND_OPEN == backend_state_ || initializing_);
1198 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE, 1214 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE,
1199 operation.operation_type); 1215 operation.operation_type);
1200 1216
1201 std::unique_ptr<ServiceWorkerFetchRequest> request( 1217 std::unique_ptr<ServiceWorkerFetchRequest> request(
1202 new ServiceWorkerFetchRequest( 1218 new ServiceWorkerFetchRequest(
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1367 base::Bind(&CacheStorageCache::InitGotCacheSize, 1383 base::Bind(&CacheStorageCache::InitGotCacheSize,
1368 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error)); 1384 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error));
1369 1385
1370 if (rv != net::ERR_IO_PENDING) 1386 if (rv != net::ERR_IO_PENDING)
1371 InitGotCacheSize(callback, cache_create_error, rv); 1387 InitGotCacheSize(callback, cache_create_error, rv);
1372 } 1388 }
1373 1389
1374 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback, 1390 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback,
1375 CacheStorageError cache_create_error, 1391 CacheStorageError cache_create_error,
1376 int cache_size) { 1392 int cache_size) {
1393 if (cache_size_ != CacheStorage::kSizeUnknown) {
1394 // If this check fails, either there is a flaw in how Chrome remembers the
1395 // cache size, or the files in the cache have been modified.
1396 DCHECK_EQ(cache_size_, cache_size);
jkarlin 2016/11/11 18:24:57 Hmm, how about DCHECK(cache_size == CacheStorage::
cmumford 2016/11/22 17:45:03 Done.
1397 }
1377 cache_size_ = cache_size; 1398 cache_size_ = cache_size;
1378 initializing_ = false; 1399 initializing_ = false;
1379 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ && 1400 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ &&
1380 backend_state_ == BACKEND_UNINITIALIZED) 1401 backend_state_ == BACKEND_UNINITIALIZED)
1381 ? BACKEND_OPEN 1402 ? BACKEND_OPEN
1382 : BACKEND_CLOSED; 1403 : BACKEND_CLOSED;
1383 1404
1384 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult", 1405 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult",
1385 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1); 1406 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1);
1386 1407
1408 if (cache_observer_)
1409 cache_observer_->CacheSizeSet(this, CacheStorageCacheObserver::Whence::SET,
1410 cache_size_);
1411
1387 callback.Run(); 1412 callback.Run();
1388 } 1413 }
1389 1414
1390 void CacheStorageCache::PopulateRequestFromMetadata( 1415 void CacheStorageCache::PopulateRequestFromMetadata(
1391 const CacheMetadata& metadata, 1416 const CacheMetadata& metadata,
1392 const GURL& request_url, 1417 const GURL& request_url,
1393 ServiceWorkerFetchRequest* request) { 1418 ServiceWorkerFetchRequest* request) {
1394 *request = 1419 *request =
1395 ServiceWorkerFetchRequest(request_url, metadata.request().method(), 1420 ServiceWorkerFetchRequest(request_url, metadata.request().method(),
1396 ServiceWorkerHeaderMap(), Referrer(), false); 1421 ServiceWorkerHeaderMap(), Referrer(), false);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); 1467 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA);
1443 return blob_storage_context_->AddFinishedBlob(&blob_data); 1468 return blob_storage_context_->AddFinishedBlob(&blob_data);
1444 } 1469 }
1445 1470
1446 std::unique_ptr<CacheStorageCacheHandle> 1471 std::unique_ptr<CacheStorageCacheHandle>
1447 CacheStorageCache::CreateCacheHandle() { 1472 CacheStorageCache::CreateCacheHandle() {
1448 return cache_storage_->CreateCacheHandle(this); 1473 return cache_storage_->CreateCacheHandle(this);
1449 } 1474 }
1450 1475
1451 } // namespace content 1476 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698