| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/simple/simple_index_file.h" | 5 #include "net/disk_cache/simple/simple_index_file.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/memory_mapped_file.h" | 10 #include "base/files/memory_mapped_file.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 // Used in histograms. Please only add new values at the end. | 39 // Used in histograms. Please only add new values at the end. |
| 40 enum IndexFileState { | 40 enum IndexFileState { |
| 41 INDEX_STATE_CORRUPT = 0, | 41 INDEX_STATE_CORRUPT = 0, |
| 42 INDEX_STATE_STALE = 1, | 42 INDEX_STATE_STALE = 1, |
| 43 INDEX_STATE_FRESH = 2, | 43 INDEX_STATE_FRESH = 2, |
| 44 INDEX_STATE_FRESH_CONCURRENT_UPDATES = 3, | 44 INDEX_STATE_FRESH_CONCURRENT_UPDATES = 3, |
| 45 INDEX_STATE_MAX = 4, | 45 INDEX_STATE_MAX = 4, |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 void UmaRecordIndexFileState(IndexFileState state, net::CacheType cache_type) { | 48 void UmaRecordIndexFileState(IndexFileState state, net::CacheType cache_type) { |
| 49 SIMPLE_CACHE_UMA(ENUMERATION, | 49 SIMPLE_CACHE_UMA( |
| 50 "IndexFileStateOnLoad", cache_type, state, INDEX_STATE_MAX); | 50 ENUMERATION, "IndexFileStateOnLoad", cache_type, state, INDEX_STATE_MAX); |
| 51 } | 51 } |
| 52 | 52 |
| 53 // Used in histograms. Please only add new values at the end. | 53 // Used in histograms. Please only add new values at the end. |
| 54 enum IndexInitMethod { | 54 enum IndexInitMethod { |
| 55 INITIALIZE_METHOD_RECOVERED = 0, | 55 INITIALIZE_METHOD_RECOVERED = 0, |
| 56 INITIALIZE_METHOD_LOADED = 1, | 56 INITIALIZE_METHOD_LOADED = 1, |
| 57 INITIALIZE_METHOD_NEWCACHE = 2, | 57 INITIALIZE_METHOD_NEWCACHE = 2, |
| 58 INITIALIZE_METHOD_MAX = 3, | 58 INITIALIZE_METHOD_MAX = 3, |
| 59 }; | 59 }; |
| 60 | 60 |
| 61 void UmaRecordIndexInitMethod(IndexInitMethod method, | 61 void UmaRecordIndexInitMethod(IndexInitMethod method, |
| 62 net::CacheType cache_type) { | 62 net::CacheType cache_type) { |
| 63 SIMPLE_CACHE_UMA(ENUMERATION, | 63 SIMPLE_CACHE_UMA(ENUMERATION, |
| 64 "IndexInitializeMethod", cache_type, | 64 "IndexInitializeMethod", |
| 65 method, INITIALIZE_METHOD_MAX); | 65 cache_type, |
| 66 method, |
| 67 INITIALIZE_METHOD_MAX); |
| 66 } | 68 } |
| 67 | 69 |
| 68 bool WritePickleFile(Pickle* pickle, const base::FilePath& file_name) { | 70 bool WritePickleFile(Pickle* pickle, const base::FilePath& file_name) { |
| 69 int bytes_written = base::WriteFile( | 71 int bytes_written = base::WriteFile( |
| 70 file_name, static_cast<const char*>(pickle->data()), pickle->size()); | 72 file_name, static_cast<const char*>(pickle->data()), pickle->size()); |
| 71 if (bytes_written != implicit_cast<int>(pickle->size())) { | 73 if (bytes_written != implicit_cast<int>(pickle->size())) { |
| 72 base::DeleteFile(file_name, /* recursive = */ false); | 74 base::DeleteFile(file_name, /* recursive = */ false); |
| 73 return false; | 75 return false; |
| 74 } | 76 } |
| 75 return true; | 77 return true; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 106 // guaranteed to be more accurate than mtime. It is no worse though. | 108 // guaranteed to be more accurate than mtime. It is no worse though. |
| 107 last_used_time = file_info.last_accessed; | 109 last_used_time = file_info.last_accessed; |
| 108 #endif | 110 #endif |
| 109 if (last_used_time.is_null()) | 111 if (last_used_time.is_null()) |
| 110 last_used_time = file_info.last_modified; | 112 last_used_time = file_info.last_modified; |
| 111 | 113 |
| 112 int64 file_size = file_info.size; | 114 int64 file_size = file_info.size; |
| 113 SimpleIndex::EntrySet::iterator it = entries->find(hash_key); | 115 SimpleIndex::EntrySet::iterator it = entries->find(hash_key); |
| 114 if (it == entries->end()) { | 116 if (it == entries->end()) { |
| 115 SimpleIndex::InsertInEntrySet( | 117 SimpleIndex::InsertInEntrySet( |
| 116 hash_key, | 118 hash_key, EntryMetadata(last_used_time, file_size), entries); |
| 117 EntryMetadata(last_used_time, file_size), | |
| 118 entries); | |
| 119 } else { | 119 } else { |
| 120 // Summing up the total size of the entry through all the *_[0-1] files | 120 // Summing up the total size of the entry through all the *_[0-1] files |
| 121 it->second.SetEntrySize(it->second.GetEntrySize() + file_size); | 121 it->second.SetEntrySize(it->second.GetEntrySize() + file_size); |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 } // namespace | 125 } // namespace |
| 126 | 126 |
| 127 SimpleIndexLoadResult::SimpleIndexLoadResult() : did_load(false), | 127 SimpleIndexLoadResult::SimpleIndexLoadResult() |
| 128 flush_required(false) { | 128 : did_load(false), flush_required(false) { |
| 129 } | 129 } |
| 130 | 130 |
| 131 SimpleIndexLoadResult::~SimpleIndexLoadResult() { | 131 SimpleIndexLoadResult::~SimpleIndexLoadResult() { |
| 132 } | 132 } |
| 133 | 133 |
| 134 void SimpleIndexLoadResult::Reset() { | 134 void SimpleIndexLoadResult::Reset() { |
| 135 did_load = false; | 135 did_load = false; |
| 136 flush_required = false; | 136 flush_required = false; |
| 137 entries.clear(); | 137 entries.clear(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 // static | 140 // static |
| 141 const char SimpleIndexFile::kIndexFileName[] = "the-real-index"; | 141 const char SimpleIndexFile::kIndexFileName[] = "the-real-index"; |
| 142 // static | 142 // static |
| 143 const char SimpleIndexFile::kIndexDirectory[] = "index-dir"; | 143 const char SimpleIndexFile::kIndexDirectory[] = "index-dir"; |
| 144 // static | 144 // static |
| 145 const char SimpleIndexFile::kTempIndexFileName[] = "temp-index"; | 145 const char SimpleIndexFile::kTempIndexFileName[] = "temp-index"; |
| 146 | 146 |
| 147 SimpleIndexFile::IndexMetadata::IndexMetadata() | 147 SimpleIndexFile::IndexMetadata::IndexMetadata() |
| 148 : magic_number_(kSimpleIndexMagicNumber), | 148 : magic_number_(kSimpleIndexMagicNumber), |
| 149 version_(kSimpleVersion), | 149 version_(kSimpleVersion), |
| 150 number_of_entries_(0), | 150 number_of_entries_(0), |
| 151 cache_size_(0) {} | 151 cache_size_(0) { |
| 152 } |
| 152 | 153 |
| 153 SimpleIndexFile::IndexMetadata::IndexMetadata( | 154 SimpleIndexFile::IndexMetadata::IndexMetadata(uint64 number_of_entries, |
| 154 uint64 number_of_entries, uint64 cache_size) | 155 uint64 cache_size) |
| 155 : magic_number_(kSimpleIndexMagicNumber), | 156 : magic_number_(kSimpleIndexMagicNumber), |
| 156 version_(kSimpleVersion), | 157 version_(kSimpleVersion), |
| 157 number_of_entries_(number_of_entries), | 158 number_of_entries_(number_of_entries), |
| 158 cache_size_(cache_size) {} | 159 cache_size_(cache_size) { |
| 160 } |
| 159 | 161 |
| 160 void SimpleIndexFile::IndexMetadata::Serialize(Pickle* pickle) const { | 162 void SimpleIndexFile::IndexMetadata::Serialize(Pickle* pickle) const { |
| 161 DCHECK(pickle); | 163 DCHECK(pickle); |
| 162 pickle->WriteUInt64(magic_number_); | 164 pickle->WriteUInt64(magic_number_); |
| 163 pickle->WriteUInt32(version_); | 165 pickle->WriteUInt32(version_); |
| 164 pickle->WriteUInt64(number_of_entries_); | 166 pickle->WriteUInt64(number_of_entries_); |
| 165 pickle->WriteUInt64(cache_size_); | 167 pickle->WriteUInt64(cache_size_); |
| 166 } | 168 } |
| 167 | 169 |
| 168 // static | 170 // static |
| 169 bool SimpleIndexFile::SerializeFinalData(base::Time cache_modified, | 171 bool SimpleIndexFile::SerializeFinalData(base::Time cache_modified, |
| 170 Pickle* pickle) { | 172 Pickle* pickle) { |
| 171 if (!pickle->WriteInt64(cache_modified.ToInternalValue())) | 173 if (!pickle->WriteInt64(cache_modified.ToInternalValue())) |
| 172 return false; | 174 return false; |
| 173 SimpleIndexFile::PickleHeader* header_p = pickle->headerT<PickleHeader>(); | 175 SimpleIndexFile::PickleHeader* header_p = pickle->headerT<PickleHeader>(); |
| 174 header_p->crc = CalculatePickleCRC(*pickle); | 176 header_p->crc = CalculatePickleCRC(*pickle); |
| 175 return true; | 177 return true; |
| 176 } | 178 } |
| 177 | 179 |
| 178 bool SimpleIndexFile::IndexMetadata::Deserialize(PickleIterator* it) { | 180 bool SimpleIndexFile::IndexMetadata::Deserialize(PickleIterator* it) { |
| 179 DCHECK(it); | 181 DCHECK(it); |
| 180 return it->ReadUInt64(&magic_number_) && | 182 return it->ReadUInt64(&magic_number_) && it->ReadUInt32(&version_) && |
| 181 it->ReadUInt32(&version_) && | 183 it->ReadUInt64(&number_of_entries_) && it->ReadUInt64(&cache_size_); |
| 182 it->ReadUInt64(&number_of_entries_)&& | |
| 183 it->ReadUInt64(&cache_size_); | |
| 184 } | 184 } |
| 185 | 185 |
| 186 void SimpleIndexFile::SyncWriteToDisk(net::CacheType cache_type, | 186 void SimpleIndexFile::SyncWriteToDisk(net::CacheType cache_type, |
| 187 const base::FilePath& cache_directory, | 187 const base::FilePath& cache_directory, |
| 188 const base::FilePath& index_filename, | 188 const base::FilePath& index_filename, |
| 189 const base::FilePath& temp_index_filename, | 189 const base::FilePath& temp_index_filename, |
| 190 scoped_ptr<Pickle> pickle, | 190 scoped_ptr<Pickle> pickle, |
| 191 const base::TimeTicks& start_time, | 191 const base::TimeTicks& start_time, |
| 192 bool app_on_background) { | 192 bool app_on_background) { |
| 193 // There is a chance that the index containing all the necessary data about | 193 // There is a chance that the index containing all the necessary data about |
| (...skipping 17 matching lines...) Expand all Loading... |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 } | 213 } |
| 214 | 214 |
| 215 // Atomically rename the temporary index file to become the real one. | 215 // Atomically rename the temporary index file to become the real one. |
| 216 bool result = base::ReplaceFile(temp_index_filename, index_filename, NULL); | 216 bool result = base::ReplaceFile(temp_index_filename, index_filename, NULL); |
| 217 DCHECK(result); | 217 DCHECK(result); |
| 218 | 218 |
| 219 if (app_on_background) { | 219 if (app_on_background) { |
| 220 SIMPLE_CACHE_UMA(TIMES, | 220 SIMPLE_CACHE_UMA(TIMES, |
| 221 "IndexWriteToDiskTime.Background", cache_type, | 221 "IndexWriteToDiskTime.Background", |
| 222 cache_type, |
| 222 (base::TimeTicks::Now() - start_time)); | 223 (base::TimeTicks::Now() - start_time)); |
| 223 } else { | 224 } else { |
| 224 SIMPLE_CACHE_UMA(TIMES, | 225 SIMPLE_CACHE_UMA(TIMES, |
| 225 "IndexWriteToDiskTime.Foreground", cache_type, | 226 "IndexWriteToDiskTime.Foreground", |
| 227 cache_type, |
| 226 (base::TimeTicks::Now() - start_time)); | 228 (base::TimeTicks::Now() - start_time)); |
| 227 } | 229 } |
| 228 } | 230 } |
| 229 | 231 |
| 230 bool SimpleIndexFile::IndexMetadata::CheckIndexMetadata() { | 232 bool SimpleIndexFile::IndexMetadata::CheckIndexMetadata() { |
| 231 return number_of_entries_ <= kMaxEntiresInIndex && | 233 return number_of_entries_ <= kMaxEntiresInIndex && |
| 232 magic_number_ == kSimpleIndexMagicNumber && | 234 magic_number_ == kSimpleIndexMagicNumber && version_ == kSimpleVersion; |
| 233 version_ == kSimpleVersion; | |
| 234 } | 235 } |
| 235 | 236 |
| 236 SimpleIndexFile::SimpleIndexFile( | 237 SimpleIndexFile::SimpleIndexFile(base::SingleThreadTaskRunner* cache_thread, |
| 237 base::SingleThreadTaskRunner* cache_thread, | 238 base::TaskRunner* worker_pool, |
| 238 base::TaskRunner* worker_pool, | 239 net::CacheType cache_type, |
| 239 net::CacheType cache_type, | 240 const base::FilePath& cache_directory) |
| 240 const base::FilePath& cache_directory) | |
| 241 : cache_thread_(cache_thread), | 241 : cache_thread_(cache_thread), |
| 242 worker_pool_(worker_pool), | 242 worker_pool_(worker_pool), |
| 243 cache_type_(cache_type), | 243 cache_type_(cache_type), |
| 244 cache_directory_(cache_directory), | 244 cache_directory_(cache_directory), |
| 245 index_file_(cache_directory_.AppendASCII(kIndexDirectory) | 245 index_file_(cache_directory_.AppendASCII(kIndexDirectory) |
| 246 .AppendASCII(kIndexFileName)), | 246 .AppendASCII(kIndexFileName)), |
| 247 temp_index_file_(cache_directory_.AppendASCII(kIndexDirectory) | 247 temp_index_file_(cache_directory_.AppendASCII(kIndexDirectory) |
| 248 .AppendASCII(kTempIndexFileName)) { | 248 .AppendASCII(kTempIndexFileName)) { |
| 249 } | 249 } |
| 250 | 250 |
| 251 SimpleIndexFile::~SimpleIndexFile() {} | 251 SimpleIndexFile::~SimpleIndexFile() { |
| 252 } |
| 252 | 253 |
| 253 void SimpleIndexFile::LoadIndexEntries(base::Time cache_last_modified, | 254 void SimpleIndexFile::LoadIndexEntries(base::Time cache_last_modified, |
| 254 const base::Closure& callback, | 255 const base::Closure& callback, |
| 255 SimpleIndexLoadResult* out_result) { | 256 SimpleIndexLoadResult* out_result) { |
| 256 base::Closure task = base::Bind(&SimpleIndexFile::SyncLoadIndexEntries, | 257 base::Closure task = base::Bind(&SimpleIndexFile::SyncLoadIndexEntries, |
| 257 cache_type_, | 258 cache_type_, |
| 258 cache_last_modified, cache_directory_, | 259 cache_last_modified, |
| 259 index_file_, out_result); | 260 cache_directory_, |
| 261 index_file_, |
| 262 out_result); |
| 260 worker_pool_->PostTaskAndReply(FROM_HERE, task, callback); | 263 worker_pool_->PostTaskAndReply(FROM_HERE, task, callback); |
| 261 } | 264 } |
| 262 | 265 |
| 263 void SimpleIndexFile::WriteToDisk(const SimpleIndex::EntrySet& entry_set, | 266 void SimpleIndexFile::WriteToDisk(const SimpleIndex::EntrySet& entry_set, |
| 264 uint64 cache_size, | 267 uint64 cache_size, |
| 265 const base::TimeTicks& start, | 268 const base::TimeTicks& start, |
| 266 bool app_on_background) { | 269 bool app_on_background) { |
| 267 IndexMetadata index_metadata(entry_set.size(), cache_size); | 270 IndexMetadata index_metadata(entry_set.size(), cache_size); |
| 268 scoped_ptr<Pickle> pickle = Serialize(index_metadata, entry_set); | 271 scoped_ptr<Pickle> pickle = Serialize(index_metadata, entry_set); |
| 269 cache_thread_->PostTask(FROM_HERE, base::Bind( | 272 cache_thread_->PostTask(FROM_HERE, |
| 270 &SimpleIndexFile::SyncWriteToDisk, | 273 base::Bind(&SimpleIndexFile::SyncWriteToDisk, |
| 271 cache_type_, | 274 cache_type_, |
| 272 cache_directory_, | 275 cache_directory_, |
| 273 index_file_, | 276 index_file_, |
| 274 temp_index_file_, | 277 temp_index_file_, |
| 275 base::Passed(&pickle), | 278 base::Passed(&pickle), |
| 276 base::TimeTicks::Now(), | 279 base::TimeTicks::Now(), |
| 277 app_on_background)); | 280 app_on_background)); |
| 278 } | 281 } |
| 279 | 282 |
| 280 // static | 283 // static |
| 281 void SimpleIndexFile::SyncLoadIndexEntries( | 284 void SimpleIndexFile::SyncLoadIndexEntries( |
| 282 net::CacheType cache_type, | 285 net::CacheType cache_type, |
| 283 base::Time cache_last_modified, | 286 base::Time cache_last_modified, |
| 284 const base::FilePath& cache_directory, | 287 const base::FilePath& cache_directory, |
| 285 const base::FilePath& index_file_path, | 288 const base::FilePath& index_file_path, |
| 286 SimpleIndexLoadResult* out_result) { | 289 SimpleIndexLoadResult* out_result) { |
| 287 // Load the index and find its age. | 290 // Load the index and find its age. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 305 } | 308 } |
| 306 UmaRecordIndexInitMethod(INITIALIZE_METHOD_LOADED, cache_type); | 309 UmaRecordIndexInitMethod(INITIALIZE_METHOD_LOADED, cache_type); |
| 307 return; | 310 return; |
| 308 } | 311 } |
| 309 UmaRecordIndexFileState(INDEX_STATE_STALE, cache_type); | 312 UmaRecordIndexFileState(INDEX_STATE_STALE, cache_type); |
| 310 } | 313 } |
| 311 | 314 |
| 312 // Reconstruct the index by scanning the disk for entries. | 315 // Reconstruct the index by scanning the disk for entries. |
| 313 const base::TimeTicks start = base::TimeTicks::Now(); | 316 const base::TimeTicks start = base::TimeTicks::Now(); |
| 314 SyncRestoreFromDisk(cache_directory, index_file_path, out_result); | 317 SyncRestoreFromDisk(cache_directory, index_file_path, out_result); |
| 315 SIMPLE_CACHE_UMA(MEDIUM_TIMES, "IndexRestoreTime", cache_type, | 318 SIMPLE_CACHE_UMA(MEDIUM_TIMES, |
| 319 "IndexRestoreTime", |
| 320 cache_type, |
| 316 base::TimeTicks::Now() - start); | 321 base::TimeTicks::Now() - start); |
| 317 SIMPLE_CACHE_UMA(COUNTS, "IndexEntriesRestored", cache_type, | 322 SIMPLE_CACHE_UMA( |
| 318 out_result->entries.size()); | 323 COUNTS, "IndexEntriesRestored", cache_type, out_result->entries.size()); |
| 319 if (index_file_existed) { | 324 if (index_file_existed) { |
| 320 UmaRecordIndexInitMethod(INITIALIZE_METHOD_RECOVERED, cache_type); | 325 UmaRecordIndexInitMethod(INITIALIZE_METHOD_RECOVERED, cache_type); |
| 321 } else { | 326 } else { |
| 322 UmaRecordIndexInitMethod(INITIALIZE_METHOD_NEWCACHE, cache_type); | 327 UmaRecordIndexInitMethod(INITIALIZE_METHOD_NEWCACHE, cache_type); |
| 323 SIMPLE_CACHE_UMA(COUNTS, | 328 SIMPLE_CACHE_UMA(COUNTS, |
| 324 "IndexCreatedEntryCount", cache_type, | 329 "IndexCreatedEntryCount", |
| 330 cache_type, |
| 325 out_result->entries.size()); | 331 out_result->entries.size()); |
| 326 } | 332 } |
| 327 } | 333 } |
| 328 | 334 |
| 329 // static | 335 // static |
| 330 void SimpleIndexFile::SyncLoadFromDisk(const base::FilePath& index_filename, | 336 void SimpleIndexFile::SyncLoadFromDisk(const base::FilePath& index_filename, |
| 331 base::Time* out_last_cache_seen_by_index, | 337 base::Time* out_last_cache_seen_by_index, |
| 332 SimpleIndexLoadResult* out_result) { | 338 SimpleIndexLoadResult* out_result) { |
| 333 out_result->Reset(); | 339 out_result->Reset(); |
| 334 | 340 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 350 } | 356 } |
| 351 | 357 |
| 352 // static | 358 // static |
| 353 scoped_ptr<Pickle> SimpleIndexFile::Serialize( | 359 scoped_ptr<Pickle> SimpleIndexFile::Serialize( |
| 354 const SimpleIndexFile::IndexMetadata& index_metadata, | 360 const SimpleIndexFile::IndexMetadata& index_metadata, |
| 355 const SimpleIndex::EntrySet& entries) { | 361 const SimpleIndex::EntrySet& entries) { |
| 356 scoped_ptr<Pickle> pickle(new Pickle(sizeof(SimpleIndexFile::PickleHeader))); | 362 scoped_ptr<Pickle> pickle(new Pickle(sizeof(SimpleIndexFile::PickleHeader))); |
| 357 | 363 |
| 358 index_metadata.Serialize(pickle.get()); | 364 index_metadata.Serialize(pickle.get()); |
| 359 for (SimpleIndex::EntrySet::const_iterator it = entries.begin(); | 365 for (SimpleIndex::EntrySet::const_iterator it = entries.begin(); |
| 360 it != entries.end(); ++it) { | 366 it != entries.end(); |
| 367 ++it) { |
| 361 pickle->WriteUInt64(it->first); | 368 pickle->WriteUInt64(it->first); |
| 362 it->second.Serialize(pickle.get()); | 369 it->second.Serialize(pickle.get()); |
| 363 } | 370 } |
| 364 return pickle.Pass(); | 371 return pickle.Pass(); |
| 365 } | 372 } |
| 366 | 373 |
| 367 // static | 374 // static |
| 368 void SimpleIndexFile::Deserialize(const char* data, int data_len, | 375 void SimpleIndexFile::Deserialize(const char* data, |
| 376 int data_len, |
| 369 base::Time* out_cache_last_modified, | 377 base::Time* out_cache_last_modified, |
| 370 SimpleIndexLoadResult* out_result) { | 378 SimpleIndexLoadResult* out_result) { |
| 371 DCHECK(data); | 379 DCHECK(data); |
| 372 | 380 |
| 373 out_result->Reset(); | 381 out_result->Reset(); |
| 374 SimpleIndex::EntrySet* entries = &out_result->entries; | 382 SimpleIndex::EntrySet* entries = &out_result->entries; |
| 375 | 383 |
| 376 Pickle pickle(data, data_len); | 384 Pickle pickle(data, data_len); |
| 377 if (!pickle.data()) { | 385 if (!pickle.data()) { |
| 378 LOG(WARNING) << "Corrupt Simple Index File."; | 386 LOG(WARNING) << "Corrupt Simple Index File."; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 entries->clear(); | 430 entries->clear(); |
| 423 return; | 431 return; |
| 424 } | 432 } |
| 425 DCHECK(out_cache_last_modified); | 433 DCHECK(out_cache_last_modified); |
| 426 *out_cache_last_modified = base::Time::FromInternalValue(cache_last_modified); | 434 *out_cache_last_modified = base::Time::FromInternalValue(cache_last_modified); |
| 427 | 435 |
| 428 out_result->did_load = true; | 436 out_result->did_load = true; |
| 429 } | 437 } |
| 430 | 438 |
| 431 // static | 439 // static |
| 432 void SimpleIndexFile::SyncRestoreFromDisk( | 440 void SimpleIndexFile::SyncRestoreFromDisk(const base::FilePath& cache_directory, |
| 433 const base::FilePath& cache_directory, | 441 const base::FilePath& index_file_path, |
| 434 const base::FilePath& index_file_path, | 442 SimpleIndexLoadResult* out_result) { |
| 435 SimpleIndexLoadResult* out_result) { | |
| 436 VLOG(1) << "Simple Cache Index is being restored from disk."; | 443 VLOG(1) << "Simple Cache Index is being restored from disk."; |
| 437 base::DeleteFile(index_file_path, /* recursive = */ false); | 444 base::DeleteFile(index_file_path, /* recursive = */ false); |
| 438 out_result->Reset(); | 445 out_result->Reset(); |
| 439 SimpleIndex::EntrySet* entries = &out_result->entries; | 446 SimpleIndex::EntrySet* entries = &out_result->entries; |
| 440 | 447 |
| 441 const bool did_succeed = TraverseCacheDirectory( | 448 const bool did_succeed = TraverseCacheDirectory( |
| 442 cache_directory, base::Bind(&ProcessEntryFile, entries)); | 449 cache_directory, base::Bind(&ProcessEntryFile, entries)); |
| 443 if (!did_succeed) { | 450 if (!did_succeed) { |
| 444 LOG(ERROR) << "Could not reconstruct index from disk"; | 451 LOG(ERROR) << "Could not reconstruct index from disk"; |
| 445 return; | 452 return; |
| 446 } | 453 } |
| 447 out_result->did_load = true; | 454 out_result->did_load = true; |
| 448 // When we restore from disk we write the merged index file to disk right | 455 // When we restore from disk we write the merged index file to disk right |
| 449 // away, this might save us from having to restore again next time. | 456 // away, this might save us from having to restore again next time. |
| 450 out_result->flush_required = true; | 457 out_result->flush_required = true; |
| 451 } | 458 } |
| 452 | 459 |
| 453 // static | 460 // static |
| 454 bool SimpleIndexFile::LegacyIsIndexFileStale( | 461 bool SimpleIndexFile::LegacyIsIndexFileStale( |
| 455 base::Time cache_last_modified, | 462 base::Time cache_last_modified, |
| 456 const base::FilePath& index_file_path) { | 463 const base::FilePath& index_file_path) { |
| 457 base::Time index_mtime; | 464 base::Time index_mtime; |
| 458 if (!simple_util::GetMTime(index_file_path, &index_mtime)) | 465 if (!simple_util::GetMTime(index_file_path, &index_mtime)) |
| 459 return true; | 466 return true; |
| 460 return index_mtime < cache_last_modified; | 467 return index_mtime < cache_last_modified; |
| 461 } | 468 } |
| 462 | 469 |
| 463 } // namespace disk_cache | 470 } // namespace disk_cache |
| OLD | NEW |