Index: net/disk_cache/simple/simple_entry_impl.cc |
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc |
index afc18852a30f360778f51326459102dec6d7be94..8536ccec11816f3f640699a05f9fc12b31bfa0bf 100644 |
--- a/net/disk_cache/simple/simple_entry_impl.cc |
+++ b/net/disk_cache/simple/simple_entry_impl.cc |
@@ -205,6 +205,7 @@ void SimpleEntryImpl::SetActiveEntryProxy( |
} |
int SimpleEntryImpl::OpenEntry(Entry** out_entry, |
+ const Backend::OracleCallback& oracle, |
const CompletionCallback& callback) { |
DCHECK(backend_.get()); |
@@ -219,8 +220,9 @@ int SimpleEntryImpl::OpenEntry(Entry** out_entry, |
INDEX_MAX = 3, |
}; |
OpenEntryIndexEnum open_entry_index_enum = INDEX_NOEXIST; |
+ uint8_t oracle_byte = 0; |
if (have_index) { |
- if (backend_->index()->Has(entry_hash_)) |
+ if (backend_->index()->HasWithOracleByte(entry_hash_, &oracle_byte)) |
open_entry_index_enum = INDEX_HIT; |
else |
open_entry_index_enum = INDEX_MISS; |
@@ -229,6 +231,14 @@ int SimpleEntryImpl::OpenEntry(Entry** out_entry, |
"OpenEntryIndexState", cache_type_, |
open_entry_index_enum, INDEX_MAX); |
+ if (open_entry_index_enum == INDEX_HIT && !oracle.is_null() && |
+ oracle.Run(oracle_byte) == Backend::OracleJudgement::MISS_AND_DOOM) { |
+ // ### UMA this. |
+ // ### net log. |
+ Doom(); |
+ return net::ERR_FAILED; |
+ } |
+ |
// If entry is not known to the index, initiate fast failover to the network. |
if (open_entry_index_enum == INDEX_MISS) { |
net_log_.AddEventWithNetErrorCode( |
@@ -1363,6 +1373,13 @@ void SimpleEntryImpl::UpdateDataFromEntryStat( |
} |
} |
+void SimpleEntryImpl::SetOracleByte(uint8_t oracle_byte) { |
+ DCHECK(io_thread_checker_.CalledOnValidThread()); |
+ if (!doomed_ && backend_.get()) { |
+ backend_->index()->UpdateEntryOracleByte(entry_hash_, oracle_byte); |
+ } |
+} |
+ |
int64_t SimpleEntryImpl::GetDiskUsage() const { |
int64_t file_size = 0; |
for (int i = 0; i < kSimpleEntryStreamCount; ++i) { |