Chromium Code Reviews| 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 // The eviction policy is a very simple pure LRU, so the elements at the end of | 5 // The eviction policy is a very simple pure LRU, so the elements at the end of |
| 6 // the list are evicted until kCleanUpMargin free space is available. There is | 6 // the list are evicted until kCleanUpMargin free space is available. There is |
| 7 // only one list in use (Rankings::NO_USE), and elements are sent to the front | 7 // only one list in use (Rankings::NO_USE), and elements are sent to the front |
| 8 // of the list whenever they are accessed. | 8 // of the list whenever they are accessed. |
| 9 | 9 |
| 10 // The new (in-development) eviction policy adds re-use as a factor to evict | 10 // The new (in-development) eviction policy adds re-use as a factor to evict |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 | 217 |
| 218 bool Eviction::ShouldTrim() { | 218 bool Eviction::ShouldTrim() { |
| 219 if (trim_delays_ < kMaxDelayedTrims && backend_->IsLoaded()) | 219 if (trim_delays_ < kMaxDelayedTrims && backend_->IsLoaded()) |
| 220 return false; | 220 return false; |
| 221 | 221 |
| 222 UMA_HISTOGRAM_COUNTS("DiskCache.TrimDelays", trim_delays_); | 222 UMA_HISTOGRAM_COUNTS("DiskCache.TrimDelays", trim_delays_); |
| 223 trim_delays_ = 0; | 223 trim_delays_ = 0; |
| 224 return true; | 224 return true; |
| 225 } | 225 } |
| 226 | 226 |
| 227 bool Eviction::ShouldTrimDeleted() { | |
| 228 // Normally we use 25% for each list. The experiment doubles the number of | |
| 229 // deleted entries, so the total number of entries increases by 25%. Using | |
| 230 // 40% of that value for deleted entries leaves the size of the other three | |
| 231 // lists intact. | |
| 232 int max_length = in_experiment_ ? header_->num_entries * 2 / 5 : | |
| 233 header_->num_entries / 4; | |
| 234 return (!test_mode_ && header_->lru.sizes[Rankings::DELETED] > max_length); | |
| 235 } | |
| 236 | |
| 227 void Eviction::ReportTrimTimes(EntryImpl* entry) { | 237 void Eviction::ReportTrimTimes(EntryImpl* entry) { |
| 228 if (first_trim_) { | 238 if (first_trim_) { |
| 229 first_trim_ = false; | 239 first_trim_ = false; |
| 230 if (backend_->ShouldReportAgain()) { | 240 if (backend_->ShouldReportAgain()) { |
| 231 CACHE_UMA(AGE, "TrimAge", 0, entry->GetLastUsed()); | 241 CACHE_UMA(AGE, "TrimAge", 0, entry->GetLastUsed()); |
| 232 ReportListStats(); | 242 ReportListStats(); |
| 233 } | 243 } |
| 234 | 244 |
| 235 if (header_->lru.filled) | 245 if (header_->lru.filled) |
| 236 return; | 246 return; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 &Eviction::TrimCache, ptr_factory_.GetWeakPtr(), false)); | 356 &Eviction::TrimCache, ptr_factory_.GetWeakPtr(), false)); |
| 347 break; | 357 break; |
| 348 } | 358 } |
| 349 } | 359 } |
| 350 if (!empty) | 360 if (!empty) |
| 351 list = kListsToSearch; | 361 list = kListsToSearch; |
| 352 } | 362 } |
| 353 | 363 |
| 354 if (empty) { | 364 if (empty) { |
| 355 TrimDeleted(true); | 365 TrimDeleted(true); |
| 356 } else if (header_->lru.sizes[Rankings::DELETED] > header_->num_entries / 4 && | 366 } else if (ShouldTrimDeleted()) { |
|
gavinp
2011/11/15 16:17:56
Good catch.
| |
| 357 !test_mode_) { | |
| 358 MessageLoop::current()->PostTask(FROM_HERE, | 367 MessageLoop::current()->PostTask(FROM_HERE, |
| 359 base::Bind(&Eviction::TrimDeleted, ptr_factory_.GetWeakPtr(), empty)); | 368 base::Bind(&Eviction::TrimDeleted, ptr_factory_.GetWeakPtr(), empty)); |
| 360 } | 369 } |
| 361 | 370 |
| 362 if (empty) { | 371 if (empty) { |
| 363 CACHE_UMA(AGE_MS, "TotalClearTimeV2", 0, start); | 372 CACHE_UMA(AGE_MS, "TotalClearTimeV2", 0, start); |
| 364 } else { | 373 } else { |
| 365 CACHE_UMA(AGE_MS, "TotalTrimTimeV2", 0, start); | 374 CACHE_UMA(AGE_MS, "TotalTrimTimeV2", 0, start); |
| 366 } | 375 } |
| 367 CACHE_UMA(COUNTS, "TrimItemsV2", 0, deleted_entries); | 376 CACHE_UMA(COUNTS, "TrimItemsV2", 0, deleted_entries); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 479 (empty || (deleted_entries < 20 && | 488 (empty || (deleted_entries < 20 && |
| 480 (TimeTicks::Now() - start).InMilliseconds() < 20))) { | 489 (TimeTicks::Now() - start).InMilliseconds() < 20))) { |
| 481 node.reset(next.release()); | 490 node.reset(next.release()); |
| 482 next.reset(rankings_->GetPrev(node.get(), Rankings::DELETED)); | 491 next.reset(rankings_->GetPrev(node.get(), Rankings::DELETED)); |
| 483 if (RemoveDeletedNode(node.get())) | 492 if (RemoveDeletedNode(node.get())) |
| 484 deleted_entries++; | 493 deleted_entries++; |
| 485 if (test_mode_) | 494 if (test_mode_) |
| 486 break; | 495 break; |
| 487 } | 496 } |
| 488 | 497 |
| 489 // Normally we use 25% for each list. The experiment doubles the number of | 498 if (deleted_entries && !empty && ShouldTrimDeleted()) { |
| 490 // deleted entries, so the total number of entries increases by 25%. Using | |
| 491 // 40% of that value for deleted entries leaves the size of the other three | |
| 492 // lists intact. | |
| 493 int max_length = in_experiment_ ? header_->num_entries * 2 / 5 : | |
| 494 header_->num_entries / 4; | |
| 495 if (deleted_entries && !empty && !test_mode_ && | |
| 496 header_->lru.sizes[Rankings::DELETED] > max_length) { | |
| 497 MessageLoop::current()->PostTask(FROM_HERE, | 499 MessageLoop::current()->PostTask(FROM_HERE, |
| 498 base::Bind(&Eviction::TrimDeleted, ptr_factory_.GetWeakPtr(), false)); | 500 base::Bind(&Eviction::TrimDeleted, ptr_factory_.GetWeakPtr(), false)); |
| 499 } | 501 } |
| 500 | 502 |
| 501 CACHE_UMA(AGE_MS, "TotalTrimDeletedTime", 0, start); | 503 CACHE_UMA(AGE_MS, "TotalTrimDeletedTime", 0, start); |
| 502 CACHE_UMA(COUNTS, "TrimDeletedItems", 0, deleted_entries); | 504 CACHE_UMA(COUNTS, "TrimDeletedItems", 0, deleted_entries); |
| 503 Trace("*** Trim Deleted end ***"); | 505 Trace("*** Trim Deleted end ***"); |
| 504 return; | 506 return; |
| 505 } | 507 } |
| 506 | 508 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 571 Time::FromInternalValue(last2.get()->Data()->last_used)); | 573 Time::FromInternalValue(last2.get()->Data()->last_used)); |
| 572 if (last3.get()) | 574 if (last3.get()) |
| 573 CACHE_UMA(AGE, "HighUseAge", 0, | 575 CACHE_UMA(AGE, "HighUseAge", 0, |
| 574 Time::FromInternalValue(last3.get()->Data()->last_used)); | 576 Time::FromInternalValue(last3.get()->Data()->last_used)); |
| 575 if (last4.get()) | 577 if (last4.get()) |
| 576 CACHE_UMA(AGE, "DeletedAge", 0, | 578 CACHE_UMA(AGE, "DeletedAge", 0, |
| 577 Time::FromInternalValue(last4.get()->Data()->last_used)); | 579 Time::FromInternalValue(last4.get()->Data()->last_used)); |
| 578 } | 580 } |
| 579 | 581 |
| 580 } // namespace disk_cache | 582 } // namespace disk_cache |
| OLD | NEW |