OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 29 matching lines...) Expand all Loading... |
40 const char* kIndexName = "index"; | 40 const char* kIndexName = "index"; |
41 const int kMaxOldFolders = 100; | 41 const int kMaxOldFolders = 100; |
42 | 42 |
43 // Seems like ~240 MB correspond to less than 50k entries for 99% of the people. | 43 // Seems like ~240 MB correspond to less than 50k entries for 99% of the people. |
44 // Note that the actual target is to keep the index table load factor under 55% | 44 // Note that the actual target is to keep the index table load factor under 55% |
45 // for most users. | 45 // for most users. |
46 const int k64kEntriesStore = 240 * 1000 * 1000; | 46 const int k64kEntriesStore = 240 * 1000 * 1000; |
47 const int kBaseTableLen = 64 * 1024; | 47 const int kBaseTableLen = 64 * 1024; |
48 const int kDefaultCacheSize = 80 * 1024 * 1024; | 48 const int kDefaultCacheSize = 80 * 1024 * 1024; |
49 | 49 |
| 50 // Avoid trimming the cache for the first 5 minutes (10 timer ticks). |
| 51 const int kTrimDelay = 10; |
| 52 |
50 int DesiredIndexTableLen(int32 storage_size) { | 53 int DesiredIndexTableLen(int32 storage_size) { |
51 if (storage_size <= k64kEntriesStore) | 54 if (storage_size <= k64kEntriesStore) |
52 return kBaseTableLen; | 55 return kBaseTableLen; |
53 if (storage_size <= k64kEntriesStore * 2) | 56 if (storage_size <= k64kEntriesStore * 2) |
54 return kBaseTableLen * 2; | 57 return kBaseTableLen * 2; |
55 if (storage_size <= k64kEntriesStore * 4) | 58 if (storage_size <= k64kEntriesStore * 4) |
56 return kBaseTableLen * 4; | 59 return kBaseTableLen * 4; |
57 if (storage_size <= k64kEntriesStore * 8) | 60 if (storage_size <= k64kEntriesStore * 8) |
58 return kBaseTableLen * 8; | 61 return kBaseTableLen * 8; |
59 | 62 |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 // ------------------------------------------------------------------------ | 362 // ------------------------------------------------------------------------ |
360 | 363 |
361 BackendImpl::BackendImpl(const FilePath& path, | 364 BackendImpl::BackendImpl(const FilePath& path, |
362 base::MessageLoopProxy* cache_thread, | 365 base::MessageLoopProxy* cache_thread, |
363 net::NetLog* net_log) | 366 net::NetLog* net_log) |
364 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), | 367 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), |
365 path_(path), | 368 path_(path), |
366 block_files_(path), | 369 block_files_(path), |
367 mask_(0), | 370 mask_(0), |
368 max_size_(0), | 371 max_size_(0), |
369 io_delay_(0), | 372 up_ticks_(0), |
370 cache_type_(net::DISK_CACHE), | 373 cache_type_(net::DISK_CACHE), |
371 uma_report_(0), | 374 uma_report_(0), |
372 user_flags_(0), | 375 user_flags_(0), |
373 init_(false), | 376 init_(false), |
374 restarted_(false), | 377 restarted_(false), |
375 unit_test_(false), | 378 unit_test_(false), |
376 read_only_(false), | 379 read_only_(false), |
377 disabled_(false), | 380 disabled_(false), |
378 new_eviction_(false), | 381 new_eviction_(false), |
379 first_timer_(true), | 382 first_timer_(true), |
380 net_log_(net_log), | 383 net_log_(net_log), |
381 done_(true, false), | 384 done_(true, false), |
382 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)), | 385 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)), |
383 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) { | 386 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)) { |
384 } | 387 } |
385 | 388 |
386 BackendImpl::BackendImpl(const FilePath& path, | 389 BackendImpl::BackendImpl(const FilePath& path, |
387 uint32 mask, | 390 uint32 mask, |
388 base::MessageLoopProxy* cache_thread, | 391 base::MessageLoopProxy* cache_thread, |
389 net::NetLog* net_log) | 392 net::NetLog* net_log) |
390 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), | 393 : ALLOW_THIS_IN_INITIALIZER_LIST(background_queue_(this, cache_thread)), |
391 path_(path), | 394 path_(path), |
392 block_files_(path), | 395 block_files_(path), |
393 mask_(mask), | 396 mask_(mask), |
394 max_size_(0), | 397 max_size_(0), |
395 io_delay_(0), | 398 up_ticks_(0), |
396 cache_type_(net::DISK_CACHE), | 399 cache_type_(net::DISK_CACHE), |
397 uma_report_(0), | 400 uma_report_(0), |
398 user_flags_(kMask), | 401 user_flags_(kMask), |
399 init_(false), | 402 init_(false), |
400 restarted_(false), | 403 restarted_(false), |
401 unit_test_(false), | 404 unit_test_(false), |
402 read_only_(false), | 405 read_only_(false), |
403 disabled_(false), | 406 disabled_(false), |
404 new_eviction_(false), | 407 new_eviction_(false), |
405 first_timer_(true), | 408 first_timer_(true), |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 } | 971 } |
969 | 972 |
970 void BackendImpl::OnEntryDestroyBegin(Addr address) { | 973 void BackendImpl::OnEntryDestroyBegin(Addr address) { |
971 EntriesMap::iterator it = open_entries_.find(address.value()); | 974 EntriesMap::iterator it = open_entries_.find(address.value()); |
972 if (it != open_entries_.end()) | 975 if (it != open_entries_.end()) |
973 open_entries_.erase(it); | 976 open_entries_.erase(it); |
974 } | 977 } |
975 | 978 |
976 void BackendImpl::OnEntryDestroyEnd() { | 979 void BackendImpl::OnEntryDestroyEnd() { |
977 DecreaseNumRefs(); | 980 DecreaseNumRefs(); |
978 if (data_->header.num_bytes > max_size_ && !read_only_) | 981 if (data_->header.num_bytes > max_size_ && !read_only_ && |
| 982 (up_ticks_ > kTrimDelay || user_flags_ & disk_cache::kNoRandom)) |
979 eviction_.TrimCache(false); | 983 eviction_.TrimCache(false); |
980 } | 984 } |
981 | 985 |
982 EntryImpl* BackendImpl::GetOpenEntry(CacheRankingsBlock* rankings) const { | 986 EntryImpl* BackendImpl::GetOpenEntry(CacheRankingsBlock* rankings) const { |
983 DCHECK(rankings->HasData()); | 987 DCHECK(rankings->HasData()); |
984 EntriesMap::const_iterator it = | 988 EntriesMap::const_iterator it = |
985 open_entries_.find(rankings->Data()->contents); | 989 open_entries_.find(rankings->Data()->contents); |
986 if (it != open_entries_.end()) { | 990 if (it != open_entries_.end()) { |
987 // We have this entry in memory. | 991 // We have this entry in memory. |
988 return it->second; | 992 return it->second; |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 stats_.SetCounter(Stats::OPEN_ENTRIES, current); | 1187 stats_.SetCounter(Stats::OPEN_ENTRIES, current); |
1184 stats_.SetCounter(Stats::MAX_ENTRIES, max_refs_); | 1188 stats_.SetCounter(Stats::MAX_ENTRIES, max_refs_); |
1185 } | 1189 } |
1186 | 1190 |
1187 CACHE_UMA(COUNTS, "NumberOfReferences", 0, num_refs_); | 1191 CACHE_UMA(COUNTS, "NumberOfReferences", 0, num_refs_); |
1188 | 1192 |
1189 CACHE_UMA(COUNTS_10000, "EntryAccessRate", 0, entry_count_); | 1193 CACHE_UMA(COUNTS_10000, "EntryAccessRate", 0, entry_count_); |
1190 CACHE_UMA(COUNTS, "ByteIORate", 0, byte_count_ / 1024); | 1194 CACHE_UMA(COUNTS, "ByteIORate", 0, byte_count_ / 1024); |
1191 entry_count_ = 0; | 1195 entry_count_ = 0; |
1192 byte_count_ = 0; | 1196 byte_count_ = 0; |
| 1197 up_ticks_++; |
1193 | 1198 |
1194 if (!data_) | 1199 if (!data_) |
1195 first_timer_ = false; | 1200 first_timer_ = false; |
1196 if (first_timer_) { | 1201 if (first_timer_) { |
1197 first_timer_ = false; | 1202 first_timer_ = false; |
1198 if (ShouldReportAgain()) | 1203 if (ShouldReportAgain()) |
1199 ReportStats(); | 1204 ReportStats(); |
1200 } | 1205 } |
1201 | 1206 |
1202 // Save stats to disk at 5 min intervals. | 1207 // Save stats to disk at 5 min intervals. |
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 if (total_memory > kMaxBuffersSize || total_memory <= 0) | 2120 if (total_memory > kMaxBuffersSize || total_memory <= 0) |
2116 total_memory = kMaxBuffersSize; | 2121 total_memory = kMaxBuffersSize; |
2117 | 2122 |
2118 done = true; | 2123 done = true; |
2119 } | 2124 } |
2120 | 2125 |
2121 return static_cast<int>(total_memory); | 2126 return static_cast<int>(total_memory); |
2122 } | 2127 } |
2123 | 2128 |
2124 } // namespace disk_cache | 2129 } // namespace disk_cache |
OLD | NEW |