Commit 3c85b800 authored by rvargas@google.com's avatar rvargas@google.com

Disk Cache: Make sure that an entry that pretends to be

"clean" is not really dirty.

If for some reason an entry is left on disk with a pointer
on the rankings node but without the dirty flag set, we now
recognize it as dirty the next time we read it from disk.

BUG=3987
TEST=DiskCacheTest.Backend_NotMarkedButDirty


Review URL: http://codereview.chromium.org/57024

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12820 0039d316-1c4b-4281-b951-d872f2087c98
parent 10ca6431
Index header:
num_entries: 2
num_bytes: 27
this_id: 1
table_len: 64k
head: 0x90000001
tail: 0x90000000
Address: 0xa0010002
Address: 0xa0010003
-------------------------------
entry:
Address: 0xa0010002
hash: 0x687d1422
next: 0
rankings_node: 0x90000000
key_len: 13
long_key: 0
data_size: 0's
data_addr: 0's
key: "the first key"
rankings:
Address: 0x90000000
next: 0x90000000
prev: 0x90000001
contents: 0xa0010002
dirty: 0
pointer: 0
-------------------------------
entry:
Address: 0xa0010003
hash: 0x63909ecb
next: 0
rankings_node: 0x90000001
key_len: 14
long_key: 0
data_size: 0's
data_addr: 0's
key: "some other key"
rankings:
Address: 0x90000001
next: 0x90000000
prev: 0x90000001
contents: 0xa0010003
dirty: 0
pointer: 0x0169dc48 <- Invalid.
================================
Generated with:
disk_cache::Entry *entry;
ASSERT_TRUE(cache_->CreateEntry("the first key", &entry));
entry->Close();
ASSERT_TRUE(cache_->CreateEntry("some other key", &entry));
entry->Close(); <---- Edit value*
* Edit the value with the debugger before it is saved to disk (break on
the destructor of EntryImpl and skip the line that clears "pointer")
\ No newline at end of file
......@@ -817,6 +817,23 @@ TEST_F(DiskCacheTest, Backend_InvalidEntry) {
delete cache;
}
// We want to be able to deal with abnormal dirty entries.
TEST_F(DiskCacheTest, Backend_NotMarkedButDirty) {
ASSERT_TRUE(CopyTestCache(L"dirty_entry"));
std::wstring path = GetCachePath();
disk_cache::Backend* cache = disk_cache::CreateCacheBackend(path, false, 0,
net::DISK_CACHE);
ASSERT_TRUE(NULL != cache);
disk_cache::Entry *entry1, *entry2;
ASSERT_TRUE(cache->OpenEntry("the first key", &entry1));
EXPECT_FALSE(cache->OpenEntry("some other key", &entry2));
entry1->Close();
delete cache;
EXPECT_TRUE(CheckCacheIntegrity(path));
}
// We want to be able to deal with messed up entries on disk.
TEST_F(DiskCacheTest, Backend_InvalidRankings) {
ASSERT_TRUE(CopyTestCache(L"bad_rankings"));
......
......@@ -539,6 +539,9 @@ EntryImpl* EntryImpl::Update(EntryImpl* entry) {
bool EntryImpl::IsDirty(int32 current_id) {
DCHECK(node_.HasData());
if (node_.Data()->pointer && !node_.Data()->dirty)
return true;
return node_.Data()->dirty && current_id != node_.Data()->dirty;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment