| Index: net/disk_cache/simple/simple_index.cc
|
| diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc
|
| index c2b73b9c80716577363e59f05a4387de37bc4181..495d7fdfe2b57d5df0f7afdf94ff7cc264a953dc 100644
|
| --- a/net/disk_cache/simple/simple_index.cc
|
| +++ b/net/disk_cache/simple/simple_index.cc
|
| @@ -173,6 +173,8 @@ void SimpleIndex::InsertInEntrySet(
|
| }
|
|
|
| void SimpleIndex::PostponeWritingToDisk() {
|
| + if (!initialized_)
|
| + return;
|
| const base::TimeDelta file_age = base::Time::Now() - last_write_to_disk_;
|
| if (file_age > base::TimeDelta::FromSeconds(kMaxWriteToDiskDelaySecs) &&
|
| write_to_disk_timer_.IsRunning()) {
|
| @@ -190,15 +192,35 @@ void SimpleIndex::PostponeWritingToDisk() {
|
| }
|
|
|
| // static
|
| +bool SimpleIndex::IsIndexFileStale(const base::FilePath& index_filename) {
|
| + base::PlatformFileInfo dir_info;
|
| + base::PlatformFileInfo index_info;
|
| + if (!file_util::GetFileInfo(index_filename.DirName(), &dir_info))
|
| + return false;
|
| + DCHECK(dir_info.is_directory);
|
| + if (!file_util::GetFileInfo(index_filename, &index_info))
|
| + return false;
|
| +
|
| + // Index file last_modified must be equal to the directory last_modified since
|
| + // the last operation we do is ReplaceFile in the
|
| + // SimpleIndexFile::WriteToDisk().
|
| + // If not true, we need to restore the index.
|
| + return index_info.last_modified >= dir_info.last_modified;
|
| +}
|
| +
|
| +// static
|
| void SimpleIndex::LoadFromDisk(
|
| const base::FilePath& index_filename,
|
| base::SingleThreadTaskRunner* io_thread,
|
| const IndexCompletionCallback& completion_callback) {
|
| - scoped_ptr<EntrySet> index_file_entries =
|
| - SimpleIndexFile::LoadFromDisk(index_filename);
|
| + // TODO(felipeg): probably could load a stale index and use it for something.
|
| + scoped_ptr<EntrySet> index_file_entries;
|
| + // Only load if the index is not stale.
|
| + if (!SimpleIndex::IsIndexFileStale(index_filename))
|
| + index_file_entries = SimpleIndexFile::LoadFromDisk(index_filename);
|
|
|
| bool force_index_flush = false;
|
| - if (!index_file_entries.get()) {
|
| + if (!index_file_entries) {
|
| index_file_entries = SimpleIndex::RestoreFromDisk(index_filename);
|
| // When we restore from disk we write the merged index file to disk right
|
| // away, this might save us from having to restore again next time.
|
| @@ -281,6 +303,7 @@ void SimpleIndex::WriteToDiskInternal(const base::FilePath& index_filename,
|
| void SimpleIndex::MergeInitializingSet(scoped_ptr<EntrySet> index_file_entries,
|
| bool force_index_flush) {
|
| DCHECK(io_thread_checker_.CalledOnValidThread());
|
| + DCHECK(index_file_entries);
|
| // First, remove the entries that are in the |removed_entries_| from both
|
| // sets.
|
| for (base::hash_set<uint64>::const_iterator it =
|
|
|