| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/field_trial.h" | 7 #include "base/field_trial.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/histogram.h" | 10 #include "base/histogram.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 | 140 |
| 141 // Sets |current_group| for the current experiment. Returns false if the files | 141 // Sets |current_group| for the current experiment. Returns false if the files |
| 142 // should be discarded. | 142 // should be discarded. |
| 143 bool InitExperiment(int* current_group) { | 143 bool InitExperiment(int* current_group) { |
| 144 if (*current_group == 3 || *current_group == 4) { | 144 if (*current_group == 3 || *current_group == 4) { |
| 145 // Discard current cache for groups 3 and 4. | 145 // Discard current cache for groups 3 and 4. |
| 146 return false; | 146 return false; |
| 147 } | 147 } |
| 148 | 148 |
| 149 if (*current_group <= 5) { | 149 if (*current_group <= 5) { |
| 150 #if defined(UNIT_TEST) | |
| 151 // The unit test controls directly what to test. | |
| 152 *current_group = 0; | |
| 153 return true; | |
| 154 #endif | |
| 155 | |
| 156 // Re-load the two groups. | 150 // Re-load the two groups. |
| 157 int option = base::RandInt(0, 9); | 151 int option = base::RandInt(0, 9); |
| 158 | 152 |
| 159 if (option > 1) { | 153 if (option > 1) { |
| 160 // 80% will be out of the experiment. | 154 // 80% will be out of the experiment. |
| 161 *current_group = 9; | 155 *current_group = 9; |
| 162 } else { | 156 } else { |
| 163 *current_group = option + 6; | 157 *current_group = option + 6; |
| 164 } | 158 } |
| 165 } | 159 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 | 281 |
| 288 if (!restarted_) { | 282 if (!restarted_) { |
| 289 trace_object_ = TraceObject::GetTraceObject(); | 283 trace_object_ = TraceObject::GetTraceObject(); |
| 290 // Create a recurrent timer of 30 secs. | 284 // Create a recurrent timer of 30 secs. |
| 291 int timer_delay = unit_test_ ? 1000 : 30000; | 285 int timer_delay = unit_test_ ? 1000 : 30000; |
| 292 timer_.Start(TimeDelta::FromMilliseconds(timer_delay), this, | 286 timer_.Start(TimeDelta::FromMilliseconds(timer_delay), this, |
| 293 &BackendImpl::OnStatsTimer); | 287 &BackendImpl::OnStatsTimer); |
| 294 } | 288 } |
| 295 | 289 |
| 296 init_ = true; | 290 init_ = true; |
| 297 if (!InitExperiment(&data_->header.experiment)) | 291 if (!(user_flags_ & disk_cache::kNoRandom)) { |
| 298 return false; | 292 // The unit test controls directly what to test. |
| 293 if (!InitExperiment(&data_->header.experiment)) |
| 294 return false; |
| 295 } |
| 299 | 296 |
| 300 if (data_->header.experiment > 6 && data_->header.experiment < 9) | 297 if (data_->header.experiment > 6 && data_->header.experiment < 9) |
| 301 new_eviction_ = true; | 298 new_eviction_ = true; |
| 302 | 299 |
| 303 if (!CheckIndex()) { | 300 if (!CheckIndex()) { |
| 304 ReportError(ERR_INIT_FAILED); | 301 ReportError(ERR_INIT_FAILED); |
| 305 return false; | 302 return false; |
| 306 } | 303 } |
| 307 | 304 |
| 308 // We don't care if the value overflows. The only thing we care about is that | 305 // We don't care if the value overflows. The only thing we care about is that |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 void BackendImpl::SetUpgradeMode() { | 939 void BackendImpl::SetUpgradeMode() { |
| 943 user_flags_ |= kUpgradeMode; | 940 user_flags_ |= kUpgradeMode; |
| 944 read_only_ = true; | 941 read_only_ = true; |
| 945 } | 942 } |
| 946 | 943 |
| 947 void BackendImpl::SetNewEviction() { | 944 void BackendImpl::SetNewEviction() { |
| 948 user_flags_ |= kNewEviction; | 945 user_flags_ |= kNewEviction; |
| 949 new_eviction_ = true; | 946 new_eviction_ = true; |
| 950 } | 947 } |
| 951 | 948 |
| 949 void BackendImpl::SetFlags(uint32 flags) { |
| 950 user_flags_ |= flags; |
| 951 } |
| 952 |
| 952 void BackendImpl::ClearRefCountForTest() { | 953 void BackendImpl::ClearRefCountForTest() { |
| 953 num_refs_ = 0; | 954 num_refs_ = 0; |
| 954 } | 955 } |
| 955 | 956 |
| 956 int BackendImpl::SelfCheck() { | 957 int BackendImpl::SelfCheck() { |
| 957 if (!init_) { | 958 if (!init_) { |
| 958 LOG(ERROR) << "Init failed"; | 959 LOG(ERROR) << "Init failed"; |
| 959 return ERR_INIT_FAILED; | 960 return ERR_INIT_FAILED; |
| 960 } | 961 } |
| 961 | 962 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 980 // ------------------------------------------------------------------------ | 981 // ------------------------------------------------------------------------ |
| 981 | 982 |
| 982 // We just created a new file so we're going to write the header and set the | 983 // We just created a new file so we're going to write the header and set the |
| 983 // file length to include the hash table (zero filled). | 984 // file length to include the hash table (zero filled). |
| 984 bool BackendImpl::CreateBackingStore(disk_cache::File* file) { | 985 bool BackendImpl::CreateBackingStore(disk_cache::File* file) { |
| 985 AdjustMaxCacheSize(0); | 986 AdjustMaxCacheSize(0); |
| 986 | 987 |
| 987 IndexHeader header; | 988 IndexHeader header; |
| 988 header.table_len = DesiredIndexTableLen(max_size_); | 989 header.table_len = DesiredIndexTableLen(max_size_); |
| 989 | 990 |
| 991 // All new profiles are going to use the new eviction. |
| 992 if (!(user_flags_ & disk_cache::kNoRandom)) { |
| 993 header.experiment = 8; |
| 994 new_eviction_ = true; |
| 995 } |
| 996 |
| 990 // We need file version 2.1 for the new eviction algorithm. | 997 // We need file version 2.1 for the new eviction algorithm. |
| 991 if (new_eviction_) | 998 if (new_eviction_) |
| 992 header.version = 0x20001; | 999 header.version = 0x20001; |
| 993 | 1000 |
| 994 header.create_time = Time::Now().ToInternalValue(); | 1001 header.create_time = Time::Now().ToInternalValue(); |
| 995 | 1002 |
| 996 if (!file->Write(&header, sizeof(header), 0)) | 1003 if (!file->Write(&header, sizeof(header), 0)) |
| 997 return false; | 1004 return false; |
| 998 | 1005 |
| 999 return file->SetLength(GetIndexSize(header.table_len)); | 1006 return file->SetLength(GetIndexSize(header.table_len)); |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1638 | 1645 |
| 1639 return num_dirty; | 1646 return num_dirty; |
| 1640 } | 1647 } |
| 1641 | 1648 |
| 1642 bool BackendImpl::CheckEntry(EntryImpl* cache_entry) { | 1649 bool BackendImpl::CheckEntry(EntryImpl* cache_entry) { |
| 1643 RankingsNode* rankings = cache_entry->rankings()->Data(); | 1650 RankingsNode* rankings = cache_entry->rankings()->Data(); |
| 1644 return !rankings->dummy; | 1651 return !rankings->dummy; |
| 1645 } | 1652 } |
| 1646 | 1653 |
| 1647 } // namespace disk_cache | 1654 } // namespace disk_cache |
| OLD | NEW |