Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1609)

Unified Diff: net/disk_cache/simple/simple_index_file.cc

Issue 2878533002: SimpleCache: Tolerate weird file sizes when doing index recovery. (Closed)
Patch Set: Woops, the test was meant to be a different CL. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/disk_cache/simple/simple_synchronous_entry.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/disk_cache/simple/simple_index_file.cc
diff --git a/net/disk_cache/simple/simple_index_file.cc b/net/disk_cache/simple/simple_index_file.cc
index d31d2446c60914b64c73039a77881804fcddc1fe..01eaba1e00cd1ca1753b416e5fa171ca61dc9441 100644
--- a/net/disk_cache/simple/simple_index_file.cc
+++ b/net/disk_cache/simple/simple_index_file.cc
@@ -160,14 +160,50 @@ void ProcessEntryFile(SimpleIndex::EntrySet* entries,
SimpleIndex::EntrySet::iterator it = entries->find(hash_key);
base::CheckedNumeric<uint32_t> total_entry_size = size;
+ // Sometimes we see entry sizes here which are nonsense. We can't use them
+ // as-is, as they simply won't fit the type. The options that come to mind
+ // are:
+ // 1) Ignore the file.
+ // 2) Make something up.
+ // 3) Delete the files for the hash.
+ // ("crash the browser" isn't considered a serious alternative).
+ //
+ // The problem with doing (1) is that we are recovering the index here, so if
+ // we don't include the info on the file here, we may completely lose track of
+ // the entry and never clean the file up.
+ //
+ // (2) is actually mostly fine: we may trigger eviction too soon or too late,
+ // but we can't really do better since we can't trust the size. If the entry
+ // is never opened, it will eventually get evicted. If it is opened, we will
+ // re-check the file size, and if it's nonsense delete it there, and if it's
+ // fine we will fix up the index via a UpdateDataFromEntryStat to have the
+ // correct size.
+ //
+ // (3) does the best thing except when the wrong size is some weird interim
+ // thing just on directory listing (in which case it may evict an entry
+ // prematurely). It's a little harder to think about since it involves
+ // mutating the disk while there are other mutations going on, however,
+ // while (2) is single-threaded.
+ //
+ // Hence this picks (2).
+
+ const int kPlaceHolderSizeWhenInvalid = 32768;
+ if (!total_entry_size.IsValid()) {
+ LOG(WARNING) << "Invalid file size while restoring index from disk: "
+ << size << " on file:" << file_name;
+ }
+
if (it == entries->end()) {
SimpleIndex::InsertInEntrySet(
- hash_key, EntryMetadata(last_used_time, total_entry_size.ValueOrDie()),
+ hash_key,
+ EntryMetadata(last_used_time, total_entry_size.ValueOrDefault(
+ kPlaceHolderSizeWhenInvalid)),
entries);
} else {
// Summing up the total size of the entry through all the *_[0-1] files
total_entry_size += it->second.GetEntrySize();
- it->second.SetEntrySize(total_entry_size.ValueOrDie());
+ it->second.SetEntrySize(
+ total_entry_size.ValueOrDefault(kPlaceHolderSizeWhenInvalid));
}
}
« no previous file with comments | « no previous file | net/disk_cache/simple/simple_synchronous_entry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698