OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 return ERR_INVALID_LINKS; | 1531 return ERR_INVALID_LINKS; |
1522 | 1532 |
1523 if (*dirty) { | 1533 if (*dirty) { |
1524 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), | 1534 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), |
1525 address.value()); | 1535 address.value()); |
1526 } else { | 1536 } else { |
1527 // We only add clean entries to the map. | 1537 // We only add clean entries to the map. |
1528 open_entries_[address.value()] = cache_entry; | 1538 open_entries_[address.value()] = cache_entry; |
1529 } | 1539 } |
1530 | 1540 |
| 1541 cache_entry->BeginLogging(net_log_, false); |
1531 cache_entry.swap(entry); | 1542 cache_entry.swap(entry); |
1532 return 0; | 1543 return 0; |
1533 } | 1544 } |
1534 | 1545 |
1535 EntryImpl* BackendImpl::MatchEntry(const std::string& key, uint32 hash, | 1546 EntryImpl* BackendImpl::MatchEntry(const std::string& key, uint32 hash, |
1536 bool find_parent) { | 1547 bool find_parent) { |
1537 Addr address(data_->table[hash & mask_]); | 1548 Addr address(data_->table[hash & mask_]); |
1538 scoped_refptr<EntryImpl> cache_entry, parent_entry; | 1549 scoped_refptr<EntryImpl> cache_entry, parent_entry; |
1539 EntryImpl* tmp = NULL; | 1550 EntryImpl* tmp = NULL; |
1540 bool found = false; | 1551 bool found = false; |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 if (total_memory > kMaxBuffersSize || total_memory <= 0) | 2078 if (total_memory > kMaxBuffersSize || total_memory <= 0) |
2068 total_memory = kMaxBuffersSize; | 2079 total_memory = kMaxBuffersSize; |
2069 | 2080 |
2070 done = true; | 2081 done = true; |
2071 } | 2082 } |
2072 | 2083 |
2073 return static_cast<int>(total_memory); | 2084 return static_cast<int>(total_memory); |
2074 } | 2085 } |
2075 | 2086 |
2076 } // namespace disk_cache | 2087 } // namespace disk_cache |
OLD | NEW |