summaryrefslogtreecommitdiffstats
path: root/net/disk_cache/rankings.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/disk_cache/rankings.cc')
-rw-r--r--net/disk_cache/rankings.cc46
1 files changed, 45 insertions, 1 deletions
diff --git a/net/disk_cache/rankings.cc b/net/disk_cache/rankings.cc
index a14a37a..99ed927 100644
--- a/net/disk_cache/rankings.cc
+++ b/net/disk_cache/rankings.cc
@@ -492,6 +492,8 @@ int Rankings::SelfCheck() {
total += partial;
}
CACHE_UMA(AGE_MS, "ListSelfCheckTime", 0, start);
+
+ QuickListCheck();
return total;
}
@@ -785,7 +787,7 @@ int Rankings::CheckList(List list) {
int head_items;
int rv = CheckListSection(list, last1, last2, true, // Head to tail.
&last1, &last2, &head_items);
- if (rv == 0)
+ if (rv == ERR_NO_ERROR)
return head_items;
Addr last3, last4;
@@ -896,6 +898,48 @@ int Rankings::CheckListSection(List list, Addr end1, Addr end2, bool forward,
return ERR_NO_ERROR;
}
+// TODO(rvargas): remove when we figure why we have corrupt heads.
+void Rankings::QuickListCheck() {
+ for (int i = 0; i < LAST_ELEMENT; i++) {
+ int rv = CheckHeadAndTail(static_cast<List>(i));
+ CACHE_UMA(CACHE_ERROR, "QuickListCheck", 0, rv);
+ }
+}
+
+int Rankings::CheckHeadAndTail(List list) {
+ Addr head_addr = heads_[list];
+ Addr tail_addr = tails_[list];
+
+ if (!head_addr.is_initialized() && !tail_addr.is_initialized())
+ return ERR_NO_ERROR;
+
+ if (!head_addr.SanityCheckForRankings())
+ return ERR_INVALID_HEAD;
+
+ if (!tail_addr.SanityCheckForRankings())
+ return ERR_INVALID_TAIL;
+
+ scoped_ptr<CacheRankingsBlock> head;
+ head.reset(new CacheRankingsBlock(backend_->File(head_addr), head_addr));
+ head->Load();
+ if (!SanityCheck(head.get(), true)) // From list.
+ return ERR_INVALID_ENTRY;
+
+ scoped_ptr<CacheRankingsBlock> tail;
+ tail.reset(new CacheRankingsBlock(backend_->File(tail_addr), tail_addr));
+ tail->Load();
+ if (!SanityCheck(tail.get(), true)) // From list.
+ return ERR_INVALID_ENTRY;
+
+ if (head->Data()->prev != head_addr.value())
+ return ERR_INVALID_PREV;
+
+ if (tail->Data()->next != tail_addr.value())
+ return ERR_INVALID_NEXT;
+
+ return ERR_NO_ERROR;
+}
+
bool Rankings::IsHead(CacheAddr addr, List* list) const {
for (int i = 0; i < LAST_ELEMENT; i++) {
if (addr == heads_[i].value()) {