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

Side by Side Diff: net/disk_cache/backend_impl.cc

Issue 6125001: Fixed first pass at adding http/backend cache events to the NetLog. ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Fix Created 9 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « net/disk_cache/backend_impl.h ('k') | net/disk_cache/backend_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "net/disk_cache/backend_impl.h" 5 #include "net/disk_cache/backend_impl.h"
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 return trial2->group() == group2a; 187 return trial2->group() == group2a;
188 } 188 }
189 189
190 // ------------------------------------------------------------------------ 190 // ------------------------------------------------------------------------
191 191
192 // This class takes care of building an instance of the backend. 192 // This class takes care of building an instance of the backend.
193 class CacheCreator { 193 class CacheCreator {
194 public: 194 public:
195 CacheCreator(const FilePath& path, bool force, int max_bytes, 195 CacheCreator(const FilePath& path, bool force, int max_bytes,
196 net::CacheType type, uint32 flags, 196 net::CacheType type, uint32 flags,
197 base::MessageLoopProxy* thread, disk_cache::Backend** backend, 197 base::MessageLoopProxy* thread, net::NetLog* net_log,
198 disk_cache::Backend** backend,
198 net::CompletionCallback* callback) 199 net::CompletionCallback* callback)
199 : path_(path), force_(force), retry_(false), max_bytes_(max_bytes), 200 : path_(path), force_(force), retry_(false), max_bytes_(max_bytes),
200 type_(type), flags_(flags), thread_(thread), backend_(backend), 201 type_(type), flags_(flags), thread_(thread), backend_(backend),
201 callback_(callback), cache_(NULL), 202 callback_(callback), cache_(NULL), net_log_(net_log),
202 ALLOW_THIS_IN_INITIALIZER_LIST( 203 ALLOW_THIS_IN_INITIALIZER_LIST(
203 my_callback_(this, &CacheCreator::OnIOComplete)) { 204 my_callback_(this, &CacheCreator::OnIOComplete)) {
204 } 205 }
205 ~CacheCreator() {} 206 ~CacheCreator() {}
206 207
207 // Creates the backend. 208 // Creates the backend.
208 int Run(); 209 int Run();
209 210
210 // Callback implementation. 211 // Callback implementation.
211 void OnIOComplete(int result); 212 void OnIOComplete(int result);
212 213
213 private: 214 private:
214 void DoCallback(int result); 215 void DoCallback(int result);
215 216
216 const FilePath& path_; 217 const FilePath& path_;
217 bool force_; 218 bool force_;
218 bool retry_; 219 bool retry_;
219 int max_bytes_; 220 int max_bytes_;
220 net::CacheType type_; 221 net::CacheType type_;
221 uint32 flags_; 222 uint32 flags_;
222 scoped_refptr<base::MessageLoopProxy> thread_; 223 scoped_refptr<base::MessageLoopProxy> thread_;
223 disk_cache::Backend** backend_; 224 disk_cache::Backend** backend_;
224 net::CompletionCallback* callback_; 225 net::CompletionCallback* callback_;
225 disk_cache::BackendImpl* cache_; 226 disk_cache::BackendImpl* cache_;
227 net::NetLog* net_log_;
226 net::CompletionCallbackImpl<CacheCreator> my_callback_; 228 net::CompletionCallbackImpl<CacheCreator> my_callback_;
227 229
228 DISALLOW_COPY_AND_ASSIGN(CacheCreator); 230 DISALLOW_COPY_AND_ASSIGN(CacheCreator);
229 }; 231 };
230 232
231 int CacheCreator::Run() { 233 int CacheCreator::Run() {
232 cache_ = new disk_cache::BackendImpl(path_, thread_); 234 cache_ = new disk_cache::BackendImpl(path_, thread_, net_log_);
233 cache_->SetMaxSize(max_bytes_); 235 cache_->SetMaxSize(max_bytes_);
234 cache_->SetType(type_); 236 cache_->SetType(type_);
235 cache_->SetFlags(flags_); 237 cache_->SetFlags(flags_);
236 int rv = cache_->Init(&my_callback_); 238 int rv = cache_->Init(&my_callback_);
237 DCHECK_EQ(net::ERR_IO_PENDING, rv); 239 DCHECK_EQ(net::ERR_IO_PENDING, rv);
238 return rv; 240 return rv;
239 } 241 }
240 242
241 void CacheCreator::OnIOComplete(int result) { 243 void CacheCreator::OnIOComplete(int result) {
242 if (result == net::OK || !force_ || retry_) 244 if (result == net::OK || !force_ || retry_)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 } 290 }
289 291
290 } // namespace 292 } // namespace
291 293
292 // ------------------------------------------------------------------------ 294 // ------------------------------------------------------------------------
293 295
294 namespace disk_cache { 296 namespace disk_cache {
295 297
296 int CreateCacheBackend(net::CacheType type, const FilePath& path, int max_bytes, 298 int CreateCacheBackend(net::CacheType type, const FilePath& path, int max_bytes,
297 bool force, base::MessageLoopProxy* thread, 299 bool force, base::MessageLoopProxy* thread,
298 Backend** backend, CompletionCallback* callback) { 300 net::NetLog* net_log, Backend** backend,
301 CompletionCallback* callback) {
299 DCHECK(callback); 302 DCHECK(callback);
300 if (type == net::MEMORY_CACHE) { 303 if (type == net::MEMORY_CACHE) {
301 *backend = MemBackendImpl::CreateBackend(max_bytes); 304 *backend = MemBackendImpl::CreateBackend(max_bytes);
302 return *backend ? net::OK : net::ERR_FAILED; 305 return *backend ? net::OK : net::ERR_FAILED;
303 } 306 }
304 DCHECK(thread); 307 DCHECK(thread);
305 308
306 return BackendImpl::CreateBackend(path, force, max_bytes, type, kNone, thread, 309 return BackendImpl::CreateBackend(path, force, max_bytes, type, kNone, thread,
307 backend, callback); 310 net_log, backend, callback);
308 } 311 }
309 312
310 // Returns the preferred maximum number of bytes for the cache given the 313 // Returns the preferred maximum number of bytes for the cache given the
311 // number of available bytes. 314 // number of available bytes.
312 int PreferedCacheSize(int64 available) { 315 int PreferedCacheSize(int64 available) {
313 // Return 80% of the available space if there is not enough space to use 316 // Return 80% of the available space if there is not enough space to use
314 // kDefaultCacheSize. 317 // kDefaultCacheSize.
315 if (available < kDefaultCacheSize * 10 / 8) 318 if (available < kDefaultCacheSize * 10 / 8)
316 return static_cast<int32>(available * 8 / 10); 319 return static_cast<int32>(available * 8 / 10);
317 320
(...skipping 26 matching lines...) Expand all
344 // number, (located on the same parent folder), and spawn a worker thread to 347 // number, (located on the same parent folder), and spawn a worker thread to
345 // delete all the files on all the stale cache folders. The whole process can 348 // delete all the files on all the stale cache folders. The whole process can
346 // still fail if we are not able to rename the cache folder (for instance due to 349 // still fail if we are not able to rename the cache folder (for instance due to
347 // a sharing violation), and in that case a cache for this profile (on the 350 // a sharing violation), and in that case a cache for this profile (on the
348 // desired path) cannot be created. 351 // desired path) cannot be created.
349 // 352 //
350 // Static. 353 // Static.
351 int BackendImpl::CreateBackend(const FilePath& full_path, bool force, 354 int BackendImpl::CreateBackend(const FilePath& full_path, bool force,
352 int max_bytes, net::CacheType type, 355 int max_bytes, net::CacheType type,
353 uint32 flags, base::MessageLoopProxy* thread, 356 uint32 flags, base::MessageLoopProxy* thread,
354 Backend** backend, 357 net::NetLog* net_log, Backend** backend,
355 CompletionCallback* callback) { 358 CompletionCallback* callback) {
356 DCHECK(callback); 359 DCHECK(callback);
357 CacheCreator* creator = new CacheCreator(full_path, force, max_bytes, type, 360 CacheCreator* creator = new CacheCreator(full_path, force, max_bytes, type,
358 flags, thread, backend, callback); 361 flags, thread, net_log, backend,
362 callback);
359 // This object will self-destroy when finished. 363 // This object will self-destroy when finished.
360 return creator->Run(); 364 return creator->Run();
361 } 365 }
362 366
363 int BackendImpl::Init(CompletionCallback* callback) { 367 int BackendImpl::Init(CompletionCallback* callback) {
364 background_queue_.Init(callback); 368 background_queue_.Init(callback);
365 return net::ERR_IO_PENDING; 369 return net::ERR_IO_PENDING;
366 } 370 }
367 371
368 BackendImpl::BackendImpl(const FilePath& path, 372 BackendImpl::BackendImpl(const FilePath& path,
369 base::MessageLoopProxy* cache_thread) 373 base::MessageLoopProxy* cache_thread,
374 net::NetLog* net_log)
370 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), 375 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)),
371 path_(path), 376 path_(path),
372 block_files_(path), 377 block_files_(path),
373 mask_(0), 378 mask_(0),
374 max_size_(0), 379 max_size_(0),
375 io_delay_(0), 380 io_delay_(0),
376 cache_type_(net::DISK_CACHE), 381 cache_type_(net::DISK_CACHE),
377 uma_report_(0), 382 uma_report_(0),
378 user_flags_(0), 383 user_flags_(0),
379 init_(false), 384 init_(false),
380 restarted_(false), 385 restarted_(false),
381 unit_test_(false), 386 unit_test_(false),
382 read_only_(false), 387 read_only_(false),
383 new_eviction_(false), 388 new_eviction_(false),
384 first_timer_(true), 389 first_timer_(true),
385 throttle_requests_(false), 390 throttle_requests_(false),
391 net_log_(net_log),
386 done_(true, false), 392 done_(true, false),
387 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)), 393 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)),
388 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) { 394 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) {
389 } 395 }
390 396
391 BackendImpl::BackendImpl(const FilePath& path, 397 BackendImpl::BackendImpl(const FilePath& path,
392 uint32 mask, 398 uint32 mask,
393 base::MessageLoopProxy* cache_thread) 399 base::MessageLoopProxy* cache_thread,
400 net::NetLog* net_log)
394 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), 401 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)),
395 path_(path), 402 path_(path),
396 block_files_(path), 403 block_files_(path),
397 mask_(mask), 404 mask_(mask),
398 max_size_(0), 405 max_size_(0),
399 io_delay_(0), 406 io_delay_(0),
400 cache_type_(net::DISK_CACHE), 407 cache_type_(net::DISK_CACHE),
401 uma_report_(0), 408 uma_report_(0),
402 user_flags_(kMask), 409 user_flags_(kMask),
403 init_(false), 410 init_(false),
404 restarted_(false), 411 restarted_(false),
405 unit_test_(false), 412 unit_test_(false),
406 read_only_(false), 413 read_only_(false),
407 new_eviction_(false), 414 new_eviction_(false),
408 first_timer_(true), 415 first_timer_(true),
409 throttle_requests_(false), 416 throttle_requests_(false),
417 net_log_(net_log),
410 done_(true, false), 418 done_(true, false),
411 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)), 419 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)),
412 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) { 420 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) {
413 } 421 }
414 422
415 BackendImpl::~BackendImpl() { 423 BackendImpl::~BackendImpl() {
416 background_queue_.WaitForPendingIO(); 424 background_queue_.WaitForPendingIO();
417 425
418 if (background_queue_.BackgroundIsCurrentThread()) { 426 if (background_queue_.BackgroundIsCurrentThread()) {
419 // Unit tests may use the same thread for everything. 427 // Unit tests may use the same thread for everything.
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 IncreaseNumRefs(); 849 IncreaseNumRefs();
842 850
843 if (!cache_entry->CreateEntry(node_address, key, hash)) { 851 if (!cache_entry->CreateEntry(node_address, key, hash)) {
844 block_files_.DeleteBlock(entry_address, false); 852 block_files_.DeleteBlock(entry_address, false);
845 block_files_.DeleteBlock(node_address, false); 853 block_files_.DeleteBlock(node_address, false);
846 LOG(ERROR) << "Create entry failed " << key.c_str(); 854 LOG(ERROR) << "Create entry failed " << key.c_str();
847 stats_.OnEvent(Stats::CREATE_ERROR); 855 stats_.OnEvent(Stats::CREATE_ERROR);
848 return NULL; 856 return NULL;
849 } 857 }
850 858
859 cache_entry->BeginLogging(net_log_, true);
860
851 // We are not failing the operation; let's add this to the map. 861 // We are not failing the operation; let's add this to the map.
852 open_entries_[entry_address.value()] = cache_entry; 862 open_entries_[entry_address.value()] = cache_entry;
853 863
854 if (parent.get()) 864 if (parent.get())
855 parent->SetNextAddress(entry_address); 865 parent->SetNextAddress(entry_address);
856 866
857 block_files_.GetFile(entry_address)->Store(cache_entry->entry()); 867 block_files_.GetFile(entry_address)->Store(cache_entry->entry());
858 block_files_.GetFile(node_address)->Store(cache_entry->rankings()); 868 block_files_.GetFile(node_address)->Store(cache_entry->rankings());
859 869
860 IncreaseNumEntries(); 870 IncreaseNumEntries();
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 return ERR_INVALID_LINKS; 1540 return ERR_INVALID_LINKS;
1531 1541
1532 if (*dirty) { 1542 if (*dirty) {
1533 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), 1543 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()),
1534 address.value()); 1544 address.value());
1535 } else { 1545 } else {
1536 // We only add clean entries to the map. 1546 // We only add clean entries to the map.
1537 open_entries_[address.value()] = cache_entry; 1547 open_entries_[address.value()] = cache_entry;
1538 } 1548 }
1539 1549
1550 cache_entry->BeginLogging(net_log_, false);
1540 cache_entry.swap(entry); 1551 cache_entry.swap(entry);
1541 return 0; 1552 return 0;
1542 } 1553 }
1543 1554
1544 EntryImpl* BackendImpl::MatchEntry(const std::string& key, uint32 hash, 1555 EntryImpl* BackendImpl::MatchEntry(const std::string& key, uint32 hash,
1545 bool find_parent) { 1556 bool find_parent) {
1546 Addr address(data_->table[hash & mask_]); 1557 Addr address(data_->table[hash & mask_]);
1547 scoped_refptr<EntryImpl> cache_entry, parent_entry; 1558 scoped_refptr<EntryImpl> cache_entry, parent_entry;
1548 EntryImpl* tmp = NULL; 1559 EntryImpl* tmp = NULL;
1549 bool found = false; 1560 bool found = false;
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
2084 if (total_memory > kMaxBuffersSize || total_memory <= 0) 2095 if (total_memory > kMaxBuffersSize || total_memory <= 0)
2085 total_memory = kMaxBuffersSize; 2096 total_memory = kMaxBuffersSize;
2086 2097
2087 done = true; 2098 done = true;
2088 } 2099 }
2089 2100
2090 return static_cast<int>(total_memory); 2101 return static_cast<int>(total_memory);
2091 } 2102 }
2092 2103
2093 } // namespace disk_cache 2104 } // namespace disk_cache
OLDNEW
« no previous file with comments | « net/disk_cache/backend_impl.h ('k') | net/disk_cache/backend_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698