OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/blockfile/backend_impl_v3.h" | 5 #include "net/disk_cache/blockfile/backend_impl_v3.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 DCHECK(!init_); | 83 DCHECK(!init_); |
84 if (init_) | 84 if (init_) |
85 return net::ERR_FAILED; | 85 return net::ERR_FAILED; |
86 | 86 |
87 return net::ERR_IO_PENDING; | 87 return net::ERR_IO_PENDING; |
88 } | 88 } |
89 | 89 |
90 // ------------------------------------------------------------------------ | 90 // ------------------------------------------------------------------------ |
91 | 91 |
92 #if defined(V3_NOT_JUST_YET_READY) | 92 #if defined(V3_NOT_JUST_YET_READY) |
93 int BackendImplV3::OpenPrevEntry(void** iter, Entry** prev_entry, | 93 int BackendImplV3::OpenPrevEntry(void** iter, |
| 94 Entry** prev_entry, |
94 const CompletionCallback& callback) { | 95 const CompletionCallback& callback) { |
95 DCHECK(!callback.is_null()); | 96 DCHECK(!callback.is_null()); |
96 return OpenFollowingEntry(true, iter, prev_entry, callback); | 97 return OpenFollowingEntry(true, iter, prev_entry, callback); |
97 } | 98 } |
98 #endif // defined(V3_NOT_JUST_YET_READY). | 99 #endif // defined(V3_NOT_JUST_YET_READY). |
99 | 100 |
100 bool BackendImplV3::SetMaxSize(int max_bytes) { | 101 bool BackendImplV3::SetMaxSize(int max_bytes) { |
101 COMPILE_ASSERT(sizeof(max_bytes) == sizeof(max_size_), unsupported_int_model); | 102 COMPILE_ASSERT(sizeof(max_bytes) == sizeof(max_size_), unsupported_int_model); |
102 if (max_bytes < 0) | 103 if (max_bytes < 0) |
103 return false; | 104 return false; |
104 | 105 |
105 // Zero size means use the default. | 106 // Zero size means use the default. |
106 if (!max_bytes) | 107 if (!max_bytes) |
107 return true; | 108 return true; |
108 | 109 |
109 // Avoid a DCHECK later on. | 110 // Avoid a DCHECK later on. |
110 if (max_bytes >= kint32max - kint32max / 10) | 111 if (max_bytes >= kint32max - kint32max / 10) |
111 max_bytes = kint32max - kint32max / 10 - 1; | 112 max_bytes = kint32max - kint32max / 10 - 1; |
112 | 113 |
113 user_flags_ |= MAX_SIZE; | 114 user_flags_ |= MAX_SIZE; |
114 max_size_ = max_bytes; | 115 max_size_ = max_bytes; |
115 return true; | 116 return true; |
116 } | 117 } |
117 | 118 |
118 void BackendImplV3::SetType(net::CacheType type) { | 119 void BackendImplV3::SetType(net::CacheType type) { |
119 DCHECK_NE(net::MEMORY_CACHE, type); | 120 DCHECK_NE(net::MEMORY_CACHE, type); |
120 cache_type_ = type; | 121 cache_type_ = type; |
121 } | 122 } |
122 | 123 |
123 bool BackendImplV3::CreateBlock(FileType block_type, int block_count, | 124 bool BackendImplV3::CreateBlock(FileType block_type, |
| 125 int block_count, |
124 Addr* block_address) { | 126 Addr* block_address) { |
125 return block_files_.CreateBlock(block_type, block_count, block_address); | 127 return block_files_.CreateBlock(block_type, block_count, block_address); |
126 } | 128 } |
127 | 129 |
128 #if defined(V3_NOT_JUST_YET_READY) | 130 #if defined(V3_NOT_JUST_YET_READY) |
129 void BackendImplV3::UpdateRank(EntryImplV3* entry, bool modified) { | 131 void BackendImplV3::UpdateRank(EntryImplV3* entry, bool modified) { |
130 if (read_only_ || (!modified && cache_type() == net::SHADER_CACHE)) | 132 if (read_only_ || (!modified && cache_type() == net::SHADER_CACHE)) |
131 return; | 133 return; |
132 eviction_.UpdateRank(entry, modified); | 134 eviction_.UpdateRank(entry, modified); |
133 } | 135 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 } | 231 } |
230 | 232 |
231 bool BackendImplV3::IsLoaded() const { | 233 bool BackendImplV3::IsLoaded() const { |
232 if (user_flags_ & NO_LOAD_PROTECTION) | 234 if (user_flags_ & NO_LOAD_PROTECTION) |
233 return false; | 235 return false; |
234 | 236 |
235 return user_load_; | 237 return user_load_; |
236 } | 238 } |
237 | 239 |
238 std::string BackendImplV3::HistogramName(const char* name) const { | 240 std::string BackendImplV3::HistogramName(const char* name) const { |
239 static const char* names[] = { "Http", "", "Media", "AppCache", "Shader" }; | 241 static const char* names[] = {"Http", "", "Media", "AppCache", "Shader"}; |
240 DCHECK_NE(cache_type_, net::MEMORY_CACHE); | 242 DCHECK_NE(cache_type_, net::MEMORY_CACHE); |
241 return base::StringPrintf("DiskCache3.%s_%s", name, names[cache_type_]); | 243 return base::StringPrintf("DiskCache3.%s_%s", name, names[cache_type_]); |
242 } | 244 } |
243 | 245 |
244 base::WeakPtr<BackendImplV3> BackendImplV3::GetWeakPtr() { | 246 base::WeakPtr<BackendImplV3> BackendImplV3::GetWeakPtr() { |
245 return ptr_factory_.GetWeakPtr(); | 247 return ptr_factory_.GetWeakPtr(); |
246 } | 248 } |
247 | 249 |
248 #if defined(V3_NOT_JUST_YET_READY) | 250 #if defined(V3_NOT_JUST_YET_READY) |
249 // We want to remove biases from some histograms so we only send data once per | 251 // We want to remove biases from some histograms so we only send data once per |
(...skipping 22 matching lines...) Expand all Loading... |
272 | 274 |
273 Time create_time = Time::FromInternalValue(header->create_time); | 275 Time create_time = Time::FromInternalValue(header->create_time); |
274 CACHE_UMA(AGE, "FillupAge", create_time); | 276 CACHE_UMA(AGE, "FillupAge", create_time); |
275 | 277 |
276 int64 use_time = stats_.GetCounter(Stats::TIMER); | 278 int64 use_time = stats_.GetCounter(Stats::TIMER); |
277 CACHE_UMA(HOURS, "FillupTime", static_cast<int>(use_time / 120)); | 279 CACHE_UMA(HOURS, "FillupTime", static_cast<int>(use_time / 120)); |
278 CACHE_UMA(PERCENTAGE, "FirstHitRatio", stats_.GetHitRatio()); | 280 CACHE_UMA(PERCENTAGE, "FirstHitRatio", stats_.GetHitRatio()); |
279 | 281 |
280 if (!use_time) | 282 if (!use_time) |
281 use_time = 1; | 283 use_time = 1; |
282 CACHE_UMA(COUNTS_10000, "FirstEntryAccessRate", | 284 CACHE_UMA(COUNTS_10000, |
| 285 "FirstEntryAccessRate", |
283 static_cast<int>(header->num_entries / use_time)); | 286 static_cast<int>(header->num_entries / use_time)); |
284 CACHE_UMA(COUNTS, "FirstByteIORate", | 287 CACHE_UMA(COUNTS, |
| 288 "FirstByteIORate", |
285 static_cast<int>((header->num_bytes / 1024) / use_time)); | 289 static_cast<int>((header->num_bytes / 1024) / use_time)); |
286 | 290 |
287 int avg_size = header->num_bytes / GetEntryCount(); | 291 int avg_size = header->num_bytes / GetEntryCount(); |
288 CACHE_UMA(COUNTS, "FirstEntrySize", avg_size); | 292 CACHE_UMA(COUNTS, "FirstEntrySize", avg_size); |
289 | 293 |
290 int large_entries_bytes = stats_.GetLargeEntriesSize(); | 294 int large_entries_bytes = stats_.GetLargeEntriesSize(); |
291 int large_ratio = large_entries_bytes * 100 / header->num_bytes; | 295 int large_ratio = large_entries_bytes * 100 / header->num_bytes; |
292 CACHE_UMA(PERCENTAGE, "FirstLargeEntriesRatio", large_ratio); | 296 CACHE_UMA(PERCENTAGE, "FirstLargeEntriesRatio", large_ratio); |
293 | 297 |
294 if (!lru_eviction_) { | 298 if (!lru_eviction_) { |
295 CACHE_UMA(PERCENTAGE, "FirstResurrectRatio", stats_.GetResurrectRatio()); | 299 CACHE_UMA(PERCENTAGE, "FirstResurrectRatio", stats_.GetResurrectRatio()); |
296 CACHE_UMA(PERCENTAGE, "FirstNoUseRatio", | 300 CACHE_UMA(PERCENTAGE, |
| 301 "FirstNoUseRatio", |
297 header->num_no_use_entries * 100 / header->num_entries); | 302 header->num_no_use_entries * 100 / header->num_entries); |
298 CACHE_UMA(PERCENTAGE, "FirstLowUseRatio", | 303 CACHE_UMA(PERCENTAGE, |
| 304 "FirstLowUseRatio", |
299 header->num_low_use_entries * 100 / header->num_entries); | 305 header->num_low_use_entries * 100 / header->num_entries); |
300 CACHE_UMA(PERCENTAGE, "FirstHighUseRatio", | 306 CACHE_UMA(PERCENTAGE, |
| 307 "FirstHighUseRatio", |
301 header->num_high_use_entries * 100 / header->num_entries); | 308 header->num_high_use_entries * 100 / header->num_entries); |
302 } | 309 } |
303 | 310 |
304 stats_.ResetRatios(); | 311 stats_.ResetRatios(); |
305 } | 312 } |
306 | 313 |
307 void BackendImplV3::OnEvent(Stats::Counters an_event) { | 314 void BackendImplV3::OnEvent(Stats::Counters an_event) { |
308 stats_.OnEvent(an_event); | 315 stats_.OnEvent(an_event); |
309 } | 316 } |
310 | 317 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 return cache_type_; | 430 return cache_type_; |
424 } | 431 } |
425 | 432 |
426 int32 BackendImplV3::GetEntryCount() const { | 433 int32 BackendImplV3::GetEntryCount() const { |
427 if (disabled_) | 434 if (disabled_) |
428 return 0; | 435 return 0; |
429 DCHECK(init_); | 436 DCHECK(init_); |
430 return index_.header()->num_entries; | 437 return index_.header()->num_entries; |
431 } | 438 } |
432 | 439 |
433 int BackendImplV3::OpenEntry(const std::string& key, Entry** entry, | 440 int BackendImplV3::OpenEntry(const std::string& key, |
| 441 Entry** entry, |
434 const CompletionCallback& callback) { | 442 const CompletionCallback& callback) { |
435 if (disabled_) | 443 if (disabled_) |
436 return NULL; | 444 return NULL; |
437 | 445 |
438 TimeTicks start = TimeTicks::Now(); | 446 TimeTicks start = TimeTicks::Now(); |
439 uint32 hash = base::Hash(key); | 447 uint32 hash = base::Hash(key); |
440 Trace("Open hash 0x%x", hash); | 448 Trace("Open hash 0x%x", hash); |
441 | 449 |
442 bool error; | 450 bool error; |
443 EntryImpl* cache_entry = MatchEntry(key, hash, false, Addr(), &error); | 451 EntryImpl* cache_entry = MatchEntry(key, hash, false, Addr(), &error); |
(...skipping 13 matching lines...) Expand all Loading... |
457 CACHE_UMA(COUNTS_10000, "AllOpenBySize.Miss", 0, current_size); | 465 CACHE_UMA(COUNTS_10000, "AllOpenBySize.Miss", 0, current_size); |
458 CACHE_UMA(HOURS, "AllOpenByTotalHours.Miss", 0, total_hours); | 466 CACHE_UMA(HOURS, "AllOpenByTotalHours.Miss", 0, total_hours); |
459 CACHE_UMA(HOURS, "AllOpenByUseHours.Miss", 0, use_hours); | 467 CACHE_UMA(HOURS, "AllOpenByUseHours.Miss", 0, use_hours); |
460 stats_.OnEvent(Stats::OPEN_MISS); | 468 stats_.OnEvent(Stats::OPEN_MISS); |
461 return NULL; | 469 return NULL; |
462 } | 470 } |
463 | 471 |
464 eviction_.OnOpenEntry(cache_entry); | 472 eviction_.OnOpenEntry(cache_entry); |
465 entry_count_++; | 473 entry_count_++; |
466 | 474 |
467 Trace("Open hash 0x%x end: 0x%x", hash, | 475 Trace("Open hash 0x%x end: 0x%x", |
| 476 hash, |
468 cache_entry->entry()->address().value()); | 477 cache_entry->entry()->address().value()); |
469 CACHE_UMA(AGE_MS, "OpenTime", 0, start); | 478 CACHE_UMA(AGE_MS, "OpenTime", 0, start); |
470 CACHE_UMA(COUNTS_10000, "AllOpenBySize.Hit", 0, current_size); | 479 CACHE_UMA(COUNTS_10000, "AllOpenBySize.Hit", 0, current_size); |
471 CACHE_UMA(HOURS, "AllOpenByTotalHours.Hit", 0, total_hours); | 480 CACHE_UMA(HOURS, "AllOpenByTotalHours.Hit", 0, total_hours); |
472 CACHE_UMA(HOURS, "AllOpenByUseHours.Hit", 0, use_hours); | 481 CACHE_UMA(HOURS, "AllOpenByUseHours.Hit", 0, use_hours); |
473 stats_.OnEvent(Stats::OPEN_HIT); | 482 stats_.OnEvent(Stats::OPEN_HIT); |
474 SIMPLE_STATS_COUNTER("disk_cache.hit"); | 483 SIMPLE_STATS_COUNTER("disk_cache.hit"); |
475 return cache_entry; | 484 return cache_entry; |
476 } | 485 } |
477 | 486 |
478 int BackendImplV3::CreateEntry(const std::string& key, Entry** entry, | 487 int BackendImplV3::CreateEntry(const std::string& key, |
| 488 Entry** entry, |
479 const CompletionCallback& callback) { | 489 const CompletionCallback& callback) { |
480 if (disabled_ || key.empty()) | 490 if (disabled_ || key.empty()) |
481 return NULL; | 491 return NULL; |
482 | 492 |
483 TimeTicks start = TimeTicks::Now(); | 493 TimeTicks start = TimeTicks::Now(); |
484 Trace("Create hash 0x%x", hash); | 494 Trace("Create hash 0x%x", hash); |
485 | 495 |
486 scoped_refptr<EntryImpl> parent; | 496 scoped_refptr<EntryImpl> parent; |
487 Addr entry_address(data_->table[hash & mask_]); | 497 Addr entry_address(data_->table[hash & mask_]); |
488 if (entry_address.is_initialized()) { | 498 if (entry_address.is_initialized()) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 EntryImpl* node; | 629 EntryImpl* node; |
620 void* iter = NULL; | 630 void* iter = NULL; |
621 EntryImpl* next = OpenNextEntryImpl(&iter); | 631 EntryImpl* next = OpenNextEntryImpl(&iter); |
622 if (!next) | 632 if (!next) |
623 return net::OK; | 633 return net::OK; |
624 | 634 |
625 while (next) { | 635 while (next) { |
626 node = next; | 636 node = next; |
627 next = OpenNextEntryImpl(&iter); | 637 next = OpenNextEntryImpl(&iter); |
628 | 638 |
629 if (node->GetLastUsed() >= initial_time && | 639 if (node->GetLastUsed() >= initial_time && node->GetLastUsed() < end_time) { |
630 node->GetLastUsed() < end_time) { | |
631 node->DoomImpl(); | 640 node->DoomImpl(); |
632 } else if (node->GetLastUsed() < initial_time) { | 641 } else if (node->GetLastUsed() < initial_time) { |
633 if (next) | 642 if (next) |
634 next->Release(); | 643 next->Release(); |
635 next = NULL; | 644 next = NULL; |
636 SyncEndEnumeration(iter); | 645 SyncEndEnumeration(iter); |
637 } | 646 } |
638 | 647 |
639 node->Release(); | 648 node->Release(); |
640 } | 649 } |
(...skipping 19 matching lines...) Expand all Loading... |
660 SyncEndEnumeration(iter); | 669 SyncEndEnumeration(iter); |
661 return net::OK; | 670 return net::OK; |
662 } | 671 } |
663 | 672 |
664 entry->DoomImpl(); | 673 entry->DoomImpl(); |
665 entry->Release(); | 674 entry->Release(); |
666 SyncEndEnumeration(iter); // Dooming the entry invalidates the iterator. | 675 SyncEndEnumeration(iter); // Dooming the entry invalidates the iterator. |
667 } | 676 } |
668 } | 677 } |
669 | 678 |
670 int BackendImplV3::OpenNextEntry(void** iter, Entry** next_entry, | 679 int BackendImplV3::OpenNextEntry(void** iter, |
| 680 Entry** next_entry, |
671 const CompletionCallback& callback) { | 681 const CompletionCallback& callback) { |
672 DCHECK(!callback.is_null()); | 682 DCHECK(!callback.is_null()); |
673 background_queue_.OpenNextEntry(iter, next_entry, callback); | 683 background_queue_.OpenNextEntry(iter, next_entry, callback); |
674 return net::ERR_IO_PENDING; | 684 return net::ERR_IO_PENDING; |
675 } | 685 } |
676 | 686 |
677 void BackendImplV3::EndEnumeration(void** iter) { | 687 void BackendImplV3::EndEnumeration(void** iter) { |
678 scoped_ptr<IndexIterator> iterator( | 688 scoped_ptr<IndexIterator> iterator(reinterpret_cast<IndexIterator*>(*iter)); |
679 reinterpret_cast<IndexIterator*>(*iter)); | |
680 *iter = NULL; | 689 *iter = NULL; |
681 } | 690 } |
682 | 691 |
683 void BackendImplV3::GetStats(StatsItems* stats) { | 692 void BackendImplV3::GetStats(StatsItems* stats) { |
684 if (disabled_) | 693 if (disabled_) |
685 return; | 694 return; |
686 | 695 |
687 std::pair<std::string, std::string> item; | 696 std::pair<std::string, std::string> item; |
688 | 697 |
689 item.first = "Entries"; | 698 item.first = "Entries"; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 // of bigger caches. TODO(rvargas): remove this limit. | 760 // of bigger caches. TODO(rvargas): remove this limit. |
752 if (max_size_ > kDefaultCacheSize * 4) | 761 if (max_size_ > kDefaultCacheSize * 4) |
753 max_size_ = kDefaultCacheSize * 4; | 762 max_size_ = kDefaultCacheSize * 4; |
754 | 763 |
755 if (!table_len) | 764 if (!table_len) |
756 return; | 765 return; |
757 | 766 |
758 // If we already have a table, adjust the size to it. | 767 // If we already have a table, adjust the size to it. |
759 int current_max_size = MaxStorageSizeForTable(table_len); | 768 int current_max_size = MaxStorageSizeForTable(table_len); |
760 if (max_size_ > current_max_size) | 769 if (max_size_ > current_max_size) |
761 max_size_= current_max_size; | 770 max_size_ = current_max_size; |
762 } | 771 } |
763 | 772 |
764 bool BackendImplV3::InitStats() { | 773 bool BackendImplV3::InitStats() { |
765 Addr address(data_->header.stats); | 774 Addr address(data_->header.stats); |
766 int size = stats_.StorageSize(); | 775 int size = stats_.StorageSize(); |
767 | 776 |
768 if (!address.is_initialized()) { | 777 if (!address.is_initialized()) { |
769 FileType file_type = Addr::RequiredFileType(size); | 778 FileType file_type = Addr::RequiredFileType(size); |
770 DCHECK_NE(file_type, EXTERNAL); | 779 DCHECK_NE(file_type, EXTERNAL); |
771 int num_blocks = Addr::RequiredBlocks(size, file_type); | 780 int num_blocks = Addr::RequiredBlocks(size, file_type); |
772 | 781 |
773 if (!CreateBlock(file_type, num_blocks, &address)) | 782 if (!CreateBlock(file_type, num_blocks, &address)) |
774 return false; | 783 return false; |
775 return stats_.Init(NULL, 0, address); | 784 return stats_.Init(NULL, 0, address); |
776 } | 785 } |
777 | 786 |
778 if (!address.is_block_file()) { | 787 if (!address.is_block_file()) { |
779 NOTREACHED(); | 788 NOTREACHED(); |
780 return false; | 789 return false; |
781 } | 790 } |
782 | 791 |
783 // Load the required data. | 792 // Load the required data. |
784 size = address.num_blocks() * address.BlockSize(); | 793 size = address.num_blocks() * address.BlockSize(); |
785 MappedFile* file = File(address); | 794 MappedFile* file = File(address); |
786 if (!file) | 795 if (!file) |
787 return false; | 796 return false; |
788 | 797 |
789 scoped_ptr<char[]> data(new char[size]); | 798 scoped_ptr<char[]> data(new char[size]); |
790 size_t offset = address.start_block() * address.BlockSize() + | 799 size_t offset = |
791 kBlockHeaderSize; | 800 address.start_block() * address.BlockSize() + kBlockHeaderSize; |
792 if (!file->Read(data.get(), size, offset)) | 801 if (!file->Read(data.get(), size, offset)) |
793 return false; | 802 return false; |
794 | 803 |
795 if (!stats_.Init(data.get(), size, address)) | 804 if (!stats_.Init(data.get(), size, address)) |
796 return false; | 805 return false; |
797 if (cache_type_ == net::DISK_CACHE && ShouldReportAgain()) | 806 if (cache_type_ == net::DISK_CACHE && ShouldReportAgain()) |
798 stats_.InitSizeHistogram(); | 807 stats_.InitSizeHistogram(); |
799 return true; | 808 return true; |
800 } | 809 } |
801 | 810 |
802 void BackendImplV3::StoreStats() { | 811 void BackendImplV3::StoreStats() { |
803 int size = stats_.StorageSize(); | 812 int size = stats_.StorageSize(); |
804 scoped_ptr<char[]> data(new char[size]); | 813 scoped_ptr<char[]> data(new char[size]); |
805 Addr address; | 814 Addr address; |
806 size = stats_.SerializeStats(data.get(), size, &address); | 815 size = stats_.SerializeStats(data.get(), size, &address); |
807 DCHECK(size); | 816 DCHECK(size); |
808 if (!address.is_initialized()) | 817 if (!address.is_initialized()) |
809 return; | 818 return; |
810 | 819 |
811 MappedFile* file = File(address); | 820 MappedFile* file = File(address); |
812 if (!file) | 821 if (!file) |
813 return; | 822 return; |
814 | 823 |
815 size_t offset = address.start_block() * address.BlockSize() + | 824 size_t offset = |
816 kBlockHeaderSize; | 825 address.start_block() * address.BlockSize() + kBlockHeaderSize; |
817 file->Write(data.get(), size, offset); // ignore result. | 826 file->Write(data.get(), size, offset); // ignore result. |
818 } | 827 } |
819 | 828 |
820 void BackendImplV3::RestartCache(bool failure) { | 829 void BackendImplV3::RestartCache(bool failure) { |
821 int64 errors = stats_.GetCounter(Stats::FATAL_ERROR); | 830 int64 errors = stats_.GetCounter(Stats::FATAL_ERROR); |
822 int64 full_dooms = stats_.GetCounter(Stats::DOOM_CACHE); | 831 int64 full_dooms = stats_.GetCounter(Stats::DOOM_CACHE); |
823 int64 partial_dooms = stats_.GetCounter(Stats::DOOM_RECENT); | 832 int64 partial_dooms = stats_.GetCounter(Stats::DOOM_RECENT); |
824 int64 last_report = stats_.GetCounter(Stats::LAST_REPORT); | 833 int64 last_report = stats_.GetCounter(Stats::LAST_REPORT); |
825 | 834 |
826 PrepareForRestart(); | 835 PrepareForRestart(); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 if (IsLoaded()) { | 923 if (IsLoaded()) { |
915 CACHE_UMA(AGE_MS, "LoadTime", 0, start); | 924 CACHE_UMA(AGE_MS, "LoadTime", 0, start); |
916 } | 925 } |
917 | 926 |
918 if (!cache_entry->SanityCheck()) { | 927 if (!cache_entry->SanityCheck()) { |
919 LOG(WARNING) << "Messed up entry found."; | 928 LOG(WARNING) << "Messed up entry found."; |
920 STRESS_NOTREACHED(); | 929 STRESS_NOTREACHED(); |
921 return ERR_INVALID_ENTRY; | 930 return ERR_INVALID_ENTRY; |
922 } | 931 } |
923 | 932 |
924 STRESS_DCHECK(block_files_.IsValid( | 933 STRESS_DCHECK( |
925 Addr(cache_entry->entry()->Data()->rankings_node))); | 934 block_files_.IsValid(Addr(cache_entry->entry()->Data()->rankings_node))); |
926 | 935 |
927 if (!cache_entry->LoadNodeAddress()) | 936 if (!cache_entry->LoadNodeAddress()) |
928 return ERR_READ_FAILURE; | 937 return ERR_READ_FAILURE; |
929 | 938 |
930 if (!rankings_.SanityCheck(cache_entry->rankings(), false)) { | 939 if (!rankings_.SanityCheck(cache_entry->rankings(), false)) { |
931 STRESS_NOTREACHED(); | 940 STRESS_NOTREACHED(); |
932 cache_entry->SetDirtyFlag(0); | 941 cache_entry->SetDirtyFlag(0); |
933 // Don't remove this from the list (it is not linked properly). Instead, | 942 // Don't remove this from the list (it is not linked properly). Instead, |
934 // break the link back to the entry because it is going away, and leave the | 943 // break the link back to the entry because it is going away, and leave the |
935 // rankings node to be deleted if we find it through a list. | 944 // rankings node to be deleted if we find it through a list. |
936 rankings_.SetContents(cache_entry->rankings(), 0); | 945 rankings_.SetContents(cache_entry->rankings(), 0); |
937 } else if (!rankings_.DataSanityCheck(cache_entry->rankings(), false)) { | 946 } else if (!rankings_.DataSanityCheck(cache_entry->rankings(), false)) { |
938 STRESS_NOTREACHED(); | 947 STRESS_NOTREACHED(); |
939 cache_entry->SetDirtyFlag(0); | 948 cache_entry->SetDirtyFlag(0); |
940 rankings_.SetContents(cache_entry->rankings(), address.value()); | 949 rankings_.SetContents(cache_entry->rankings(), address.value()); |
941 } | 950 } |
942 | 951 |
943 if (!cache_entry->DataSanityCheck()) { | 952 if (!cache_entry->DataSanityCheck()) { |
944 LOG(WARNING) << "Messed up entry found."; | 953 LOG(WARNING) << "Messed up entry found."; |
945 cache_entry->SetDirtyFlag(0); | 954 cache_entry->SetDirtyFlag(0); |
946 cache_entry->FixForDelete(); | 955 cache_entry->FixForDelete(); |
947 } | 956 } |
948 | 957 |
949 // Prevent overwriting the dirty flag on the destructor. | 958 // Prevent overwriting the dirty flag on the destructor. |
950 cache_entry->SetDirtyFlag(GetCurrentEntryId()); | 959 cache_entry->SetDirtyFlag(GetCurrentEntryId()); |
951 | 960 |
952 if (cache_entry->dirty()) { | 961 if (cache_entry->dirty()) { |
953 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), | 962 Trace("Dirty entry 0x%p 0x%x", |
| 963 reinterpret_cast<void*>(cache_entry.get()), |
954 address.value()); | 964 address.value()); |
955 } | 965 } |
956 | 966 |
957 open_entries_[address.value()] = cache_entry.get(); | 967 open_entries_[address.value()] = cache_entry.get(); |
958 | 968 |
959 cache_entry->BeginLogging(net_log_, false); | 969 cache_entry->BeginLogging(net_log_, false); |
960 cache_entry.swap(entry); | 970 cache_entry.swap(entry); |
961 return 0; | 971 return 0; |
962 } | 972 } |
963 | 973 |
964 // This is the actual implementation for OpenNextEntry and OpenPrevEntry. | 974 // This is the actual implementation for OpenNextEntry and OpenPrevEntry. |
965 int BackendImplV3::OpenFollowingEntry(bool forward, void** iter, | 975 int BackendImplV3::OpenFollowingEntry(bool forward, |
| 976 void** iter, |
966 Entry** next_entry, | 977 Entry** next_entry, |
967 const CompletionCallback& callback) { | 978 const CompletionCallback& callback) { |
968 if (disabled_) | 979 if (disabled_) |
969 return net::ERR_FAILED; | 980 return net::ERR_FAILED; |
970 | 981 |
971 DCHECK(iter); | 982 DCHECK(iter); |
972 | 983 |
973 const int kListsToSearch = 3; | 984 const int kListsToSearch = 3; |
974 scoped_refptr<EntryImpl> entries[kListsToSearch]; | 985 scoped_refptr<EntryImpl> entries[kListsToSearch]; |
975 scoped_ptr<Rankings::Iterator> iterator( | 986 scoped_ptr<Rankings::Iterator> iterator( |
976 reinterpret_cast<Rankings::Iterator*>(*iter)); | 987 reinterpret_cast<Rankings::Iterator*>(*iter)); |
977 *iter = NULL; | 988 *iter = NULL; |
978 | 989 |
979 if (!iterator.get()) { | 990 if (!iterator.get()) { |
980 iterator.reset(new Rankings::Iterator(&rankings_)); | 991 iterator.reset(new Rankings::Iterator(&rankings_)); |
981 bool ret = false; | 992 bool ret = false; |
982 | 993 |
983 // Get an entry from each list. | 994 // Get an entry from each list. |
984 for (int i = 0; i < kListsToSearch; i++) { | 995 for (int i = 0; i < kListsToSearch; i++) { |
985 EntryImpl* temp = NULL; | 996 EntryImpl* temp = NULL; |
986 ret |= OpenFollowingEntryFromList(forward, static_cast<Rankings::List>(i), | 997 ret |= OpenFollowingEntryFromList( |
987 &iterator->nodes[i], &temp); | 998 forward, static_cast<Rankings::List>(i), &iterator->nodes[i], &temp); |
988 entries[i].swap(&temp); // The entry was already addref'd. | 999 entries[i].swap(&temp); // The entry was already addref'd. |
989 } | 1000 } |
990 if (!ret) | 1001 if (!ret) |
991 return NULL; | 1002 return NULL; |
992 } else { | 1003 } else { |
993 // Get the next entry from the last list, and the actual entries for the | 1004 // Get the next entry from the last list, and the actual entries for the |
994 // elements on the other lists. | 1005 // elements on the other lists. |
995 for (int i = 0; i < kListsToSearch; i++) { | 1006 for (int i = 0; i < kListsToSearch; i++) { |
996 EntryImpl* temp = NULL; | 1007 EntryImpl* temp = NULL; |
997 if (iterator->list == i) { | 1008 if (iterator->list == i) { |
998 OpenFollowingEntryFromList(forward, iterator->list, | 1009 OpenFollowingEntryFromList( |
999 &iterator->nodes[i], &temp); | 1010 forward, iterator->list, &iterator->nodes[i], &temp); |
1000 } else { | 1011 } else { |
1001 temp = GetEnumeratedEntry(iterator->nodes[i], | 1012 temp = GetEnumeratedEntry(iterator->nodes[i], |
1002 static_cast<Rankings::List>(i)); | 1013 static_cast<Rankings::List>(i)); |
1003 } | 1014 } |
1004 | 1015 |
1005 entries[i].swap(&temp); // The entry was already addref'd. | 1016 entries[i].swap(&temp); // The entry was already addref'd. |
1006 } | 1017 } |
1007 } | 1018 } |
1008 | 1019 |
1009 int newest = -1; | 1020 int newest = -1; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 | 1107 |
1097 num_refs_ = num_pending_io_ = max_refs_ = 0; | 1108 num_refs_ = num_pending_io_ = max_refs_ = 0; |
1098 entry_count_ = byte_count_ = 0; | 1109 entry_count_ = byte_count_ = 0; |
1099 | 1110 |
1100 if (!restarted_) { | 1111 if (!restarted_) { |
1101 buffer_bytes_ = 0; | 1112 buffer_bytes_ = 0; |
1102 trace_object_ = TraceObject::GetTraceObject(); | 1113 trace_object_ = TraceObject::GetTraceObject(); |
1103 // Create a recurrent timer of 30 secs. | 1114 // Create a recurrent timer of 30 secs. |
1104 int timer_delay = unit_test_ ? 1000 : 30000; | 1115 int timer_delay = unit_test_ ? 1000 : 30000; |
1105 timer_.reset(new base::RepeatingTimer<BackendImplV3>()); | 1116 timer_.reset(new base::RepeatingTimer<BackendImplV3>()); |
1106 timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(timer_delay), this, | 1117 timer_->Start(FROM_HERE, |
| 1118 TimeDelta::FromMilliseconds(timer_delay), |
| 1119 this, |
1107 &BackendImplV3::OnStatsTimer); | 1120 &BackendImplV3::OnStatsTimer); |
1108 } | 1121 } |
1109 | 1122 |
1110 init_ = true; | 1123 init_ = true; |
1111 Trace("Init"); | 1124 Trace("Init"); |
1112 | 1125 |
1113 if (data_->header.experiment != NO_EXPERIMENT && | 1126 if (data_->header.experiment != NO_EXPERIMENT && |
1114 cache_type_ != net::DISK_CACHE) { | 1127 cache_type_ != net::DISK_CACHE) { |
1115 // No experiment for other caches. | 1128 // No experiment for other caches. |
1116 return net::ERR_FAILED; | 1129 return net::ERR_FAILED; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1315 | 1328 |
1316 int current_size = header->num_bytes / (1024 * 1024); | 1329 int current_size = header->num_bytes / (1024 * 1024); |
1317 int max_size = max_size_ / (1024 * 1024); | 1330 int max_size = max_size_ / (1024 * 1024); |
1318 | 1331 |
1319 CACHE_UMA(COUNTS_10000, "Size", current_size); | 1332 CACHE_UMA(COUNTS_10000, "Size", current_size); |
1320 CACHE_UMA(COUNTS_10000, "MaxSize", max_size); | 1333 CACHE_UMA(COUNTS_10000, "MaxSize", max_size); |
1321 if (!max_size) | 1334 if (!max_size) |
1322 max_size++; | 1335 max_size++; |
1323 CACHE_UMA(PERCENTAGE, "UsedSpace", current_size * 100 / max_size); | 1336 CACHE_UMA(PERCENTAGE, "UsedSpace", current_size * 100 / max_size); |
1324 | 1337 |
1325 CACHE_UMA(COUNTS_10000, "AverageOpenEntries", | 1338 CACHE_UMA(COUNTS_10000, |
| 1339 "AverageOpenEntries", |
1326 static_cast<int>(stats_.GetCounter(Stats::OPEN_ENTRIES))); | 1340 static_cast<int>(stats_.GetCounter(Stats::OPEN_ENTRIES))); |
1327 CACHE_UMA(COUNTS_10000, "MaxOpenEntries", | 1341 CACHE_UMA(COUNTS_10000, |
| 1342 "MaxOpenEntries", |
1328 static_cast<int>(stats_.GetCounter(Stats::MAX_ENTRIES))); | 1343 static_cast<int>(stats_.GetCounter(Stats::MAX_ENTRIES))); |
1329 stats_.SetCounter(Stats::MAX_ENTRIES, 0); | 1344 stats_.SetCounter(Stats::MAX_ENTRIES, 0); |
1330 | 1345 |
1331 CACHE_UMA(COUNTS_10000, "TotalFatalErrors", | 1346 CACHE_UMA(COUNTS_10000, |
| 1347 "TotalFatalErrors", |
1332 static_cast<int>(stats_.GetCounter(Stats::FATAL_ERROR))); | 1348 static_cast<int>(stats_.GetCounter(Stats::FATAL_ERROR))); |
1333 CACHE_UMA(COUNTS_10000, "TotalDoomCache", | 1349 CACHE_UMA(COUNTS_10000, |
| 1350 "TotalDoomCache", |
1334 static_cast<int>(stats_.GetCounter(Stats::DOOM_CACHE))); | 1351 static_cast<int>(stats_.GetCounter(Stats::DOOM_CACHE))); |
1335 CACHE_UMA(COUNTS_10000, "TotalDoomRecentEntries", | 1352 CACHE_UMA(COUNTS_10000, |
| 1353 "TotalDoomRecentEntries", |
1336 static_cast<int>(stats_.GetCounter(Stats::DOOM_RECENT))); | 1354 static_cast<int>(stats_.GetCounter(Stats::DOOM_RECENT))); |
1337 stats_.SetCounter(Stats::FATAL_ERROR, 0); | 1355 stats_.SetCounter(Stats::FATAL_ERROR, 0); |
1338 stats_.SetCounter(Stats::DOOM_CACHE, 0); | 1356 stats_.SetCounter(Stats::DOOM_CACHE, 0); |
1339 stats_.SetCounter(Stats::DOOM_RECENT, 0); | 1357 stats_.SetCounter(Stats::DOOM_RECENT, 0); |
1340 | 1358 |
1341 int64 total_hours = stats_.GetCounter(Stats::TIMER) / 120; | 1359 int64 total_hours = stats_.GetCounter(Stats::TIMER) / 120; |
1342 if (!(header->flags & CACHE_EVICTED)) { | 1360 if (!(header->flags & CACHE_EVICTED)) { |
1343 CACHE_UMA(HOURS, "TotalTimeNotFull", static_cast<int>(total_hours)); | 1361 CACHE_UMA(HOURS, "TotalTimeNotFull", static_cast<int>(total_hours)); |
1344 return; | 1362 return; |
1345 } | 1363 } |
(...skipping 22 matching lines...) Expand all Loading... |
1368 int avg_size = header->num_bytes / GetEntryCount(); | 1386 int avg_size = header->num_bytes / GetEntryCount(); |
1369 CACHE_UMA(COUNTS, "EntrySize", avg_size); | 1387 CACHE_UMA(COUNTS, "EntrySize", avg_size); |
1370 CACHE_UMA(COUNTS, "EntriesFull", header->num_entries); | 1388 CACHE_UMA(COUNTS, "EntriesFull", header->num_entries); |
1371 | 1389 |
1372 int large_entries_bytes = stats_.GetLargeEntriesSize(); | 1390 int large_entries_bytes = stats_.GetLargeEntriesSize(); |
1373 int large_ratio = large_entries_bytes * 100 / header->num_bytes; | 1391 int large_ratio = large_entries_bytes * 100 / header->num_bytes; |
1374 CACHE_UMA(PERCENTAGE, "LargeEntriesRatio", large_ratio); | 1392 CACHE_UMA(PERCENTAGE, "LargeEntriesRatio", large_ratio); |
1375 | 1393 |
1376 if (!lru_eviction_) { | 1394 if (!lru_eviction_) { |
1377 CACHE_UMA(PERCENTAGE, "ResurrectRatio", stats_.GetResurrectRatio()); | 1395 CACHE_UMA(PERCENTAGE, "ResurrectRatio", stats_.GetResurrectRatio()); |
1378 CACHE_UMA(PERCENTAGE, "NoUseRatio", | 1396 CACHE_UMA(PERCENTAGE, |
| 1397 "NoUseRatio", |
1379 header->num_no_use_entries * 100 / header->num_entries); | 1398 header->num_no_use_entries * 100 / header->num_entries); |
1380 CACHE_UMA(PERCENTAGE, "LowUseRatio", | 1399 CACHE_UMA(PERCENTAGE, |
| 1400 "LowUseRatio", |
1381 header->num_low_use_entries * 100 / header->num_entries); | 1401 header->num_low_use_entries * 100 / header->num_entries); |
1382 CACHE_UMA(PERCENTAGE, "HighUseRatio", | 1402 CACHE_UMA(PERCENTAGE, |
| 1403 "HighUseRatio", |
1383 header->num_high_use_entries * 100 / header->num_entries); | 1404 header->num_high_use_entries * 100 / header->num_entries); |
1384 CACHE_UMA(PERCENTAGE, "DeletedRatio", | 1405 CACHE_UMA(PERCENTAGE, |
| 1406 "DeletedRatio", |
1385 header->num_evicted_entries * 100 / header->num_entries); | 1407 header->num_evicted_entries * 100 / header->num_entries); |
1386 } | 1408 } |
1387 | 1409 |
1388 stats_.ResetRatios(); | 1410 stats_.ResetRatios(); |
1389 stats_.SetCounter(Stats::TRIM_ENTRY, 0); | 1411 stats_.SetCounter(Stats::TRIM_ENTRY, 0); |
1390 | 1412 |
1391 if (cache_type_ == net::DISK_CACHE) | 1413 if (cache_type_ == net::DISK_CACHE) |
1392 block_files_.ReportStats(); | 1414 block_files_.ReportStats(); |
1393 } | 1415 } |
1394 | 1416 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1491 | 1513 |
1492 DCHECK_EQ(i, cache_entry->entry()->Data()->hash & mask_); | 1514 DCHECK_EQ(i, cache_entry->entry()->Data()->hash & mask_); |
1493 address.set_value(cache_entry->GetNextAddress()); | 1515 address.set_value(cache_entry->GetNextAddress()); |
1494 if (!address.is_initialized()) | 1516 if (!address.is_initialized()) |
1495 break; | 1517 break; |
1496 } | 1518 } |
1497 } | 1519 } |
1498 | 1520 |
1499 Trace("CheckAllEntries End"); | 1521 Trace("CheckAllEntries End"); |
1500 if (num_entries + num_dirty != data_->header.num_entries) { | 1522 if (num_entries + num_dirty != data_->header.num_entries) { |
1501 LOG(ERROR) << "Number of entries " << num_entries << " " << num_dirty << | 1523 LOG(ERROR) << "Number of entries " << num_entries << " " << num_dirty << " " |
1502 " " << data_->header.num_entries; | 1524 << data_->header.num_entries; |
1503 DCHECK_LT(num_entries, data_->header.num_entries); | 1525 DCHECK_LT(num_entries, data_->header.num_entries); |
1504 return ERR_NUM_ENTRIES_MISMATCH; | 1526 return ERR_NUM_ENTRIES_MISMATCH; |
1505 } | 1527 } |
1506 | 1528 |
1507 return num_dirty; | 1529 return num_dirty; |
1508 } | 1530 } |
1509 | 1531 |
1510 bool BackendImplV3::CheckEntry(EntryImpl* cache_entry) { | 1532 bool BackendImplV3::CheckEntry(EntryImpl* cache_entry) { |
1511 bool ok = block_files_.IsValid(cache_entry->entry()->address()); | 1533 bool ok = block_files_.IsValid(cache_entry->entry()->address()); |
1512 ok = ok && block_files_.IsValid(cache_entry->rankings()->address()); | 1534 ok = ok && block_files_.IsValid(cache_entry->rankings()->address()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 } | 1569 } |
1548 | 1570 |
1549 net::CacheType BackendImplV3::GetCacheType() const { | 1571 net::CacheType BackendImplV3::GetCacheType() const { |
1550 return cache_type_; | 1572 return cache_type_; |
1551 } | 1573 } |
1552 | 1574 |
1553 int32 BackendImplV3::GetEntryCount() const { | 1575 int32 BackendImplV3::GetEntryCount() const { |
1554 return 0; | 1576 return 0; |
1555 } | 1577 } |
1556 | 1578 |
1557 int BackendImplV3::OpenEntry(const std::string& key, Entry** entry, | 1579 int BackendImplV3::OpenEntry(const std::string& key, |
| 1580 Entry** entry, |
1558 const CompletionCallback& callback) { | 1581 const CompletionCallback& callback) { |
1559 return net::ERR_FAILED; | 1582 return net::ERR_FAILED; |
1560 } | 1583 } |
1561 | 1584 |
1562 int BackendImplV3::CreateEntry(const std::string& key, Entry** entry, | 1585 int BackendImplV3::CreateEntry(const std::string& key, |
| 1586 Entry** entry, |
1563 const CompletionCallback& callback) { | 1587 const CompletionCallback& callback) { |
1564 return net::ERR_FAILED; | 1588 return net::ERR_FAILED; |
1565 } | 1589 } |
1566 | 1590 |
1567 int BackendImplV3::DoomEntry(const std::string& key, | 1591 int BackendImplV3::DoomEntry(const std::string& key, |
1568 const CompletionCallback& callback) { | 1592 const CompletionCallback& callback) { |
1569 return net::ERR_FAILED; | 1593 return net::ERR_FAILED; |
1570 } | 1594 } |
1571 | 1595 |
1572 int BackendImplV3::DoomAllEntries(const CompletionCallback& callback) { | 1596 int BackendImplV3::DoomAllEntries(const CompletionCallback& callback) { |
1573 return net::ERR_FAILED; | 1597 return net::ERR_FAILED; |
1574 } | 1598 } |
1575 | 1599 |
1576 int BackendImplV3::DoomEntriesBetween(base::Time initial_time, | 1600 int BackendImplV3::DoomEntriesBetween(base::Time initial_time, |
1577 base::Time end_time, | 1601 base::Time end_time, |
1578 const CompletionCallback& callback) { | 1602 const CompletionCallback& callback) { |
1579 return net::ERR_FAILED; | 1603 return net::ERR_FAILED; |
1580 } | 1604 } |
1581 | 1605 |
1582 int BackendImplV3::DoomEntriesSince(base::Time initial_time, | 1606 int BackendImplV3::DoomEntriesSince(base::Time initial_time, |
1583 const CompletionCallback& callback) { | 1607 const CompletionCallback& callback) { |
1584 return net::ERR_FAILED; | 1608 return net::ERR_FAILED; |
1585 } | 1609 } |
1586 | 1610 |
1587 int BackendImplV3::OpenNextEntry(void** iter, Entry** next_entry, | 1611 int BackendImplV3::OpenNextEntry(void** iter, |
| 1612 Entry** next_entry, |
1588 const CompletionCallback& callback) { | 1613 const CompletionCallback& callback) { |
1589 return net::ERR_FAILED; | 1614 return net::ERR_FAILED; |
1590 } | 1615 } |
1591 | 1616 |
1592 void BackendImplV3::EndEnumeration(void** iter) { | 1617 void BackendImplV3::EndEnumeration(void** iter) { |
1593 NOTIMPLEMENTED(); | 1618 NOTIMPLEMENTED(); |
1594 } | 1619 } |
1595 | 1620 |
1596 void BackendImplV3::GetStats(StatsItems* stats) { | 1621 void BackendImplV3::GetStats(StatsItems* stats) { |
1597 NOTIMPLEMENTED(); | 1622 NOTIMPLEMENTED(); |
1598 } | 1623 } |
1599 | 1624 |
1600 void BackendImplV3::OnExternalCacheHit(const std::string& key) { | 1625 void BackendImplV3::OnExternalCacheHit(const std::string& key) { |
1601 NOTIMPLEMENTED(); | 1626 NOTIMPLEMENTED(); |
1602 } | 1627 } |
1603 | 1628 |
1604 void BackendImplV3::CleanupCache() { | 1629 void BackendImplV3::CleanupCache() { |
1605 } | 1630 } |
1606 | 1631 |
1607 } // namespace disk_cache | 1632 } // namespace disk_cache |
OLD | NEW |