summaryrefslogtreecommitdiffstats
path: root/net/disk_cache
diff options
context:
space:
mode:
authorrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-30 23:08:39 +0000
committerrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-30 23:08:39 +0000
commit3c85b8003597b96007ed2e6a98007bb6f3c0ddb2 (patch)
tree3ad86fe254b1eb88d1d7ed22201721d9e1315f83 /net/disk_cache
parent10ca64313cc70fd791172d6257c607b2c80e5eff (diff)
downloadchromium_src-3c85b8003597b96007ed2e6a98007bb6f3c0ddb2.zip
chromium_src-3c85b8003597b96007ed2e6a98007bb6f3c0ddb2.tar.gz
chromium_src-3c85b8003597b96007ed2e6a98007bb6f3c0ddb2.tar.bz2
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
Diffstat (limited to 'net/disk_cache')
-rw-r--r--net/disk_cache/backend_unittest.cc17
-rw-r--r--net/disk_cache/entry_impl.cc3
2 files changed, 20 insertions, 0 deletions
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index 9851203..a13762f 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -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"));
diff --git a/net/disk_cache/entry_impl.cc b/net/disk_cache/entry_impl.cc
index 0173548..8ff7b21 100644
--- a/net/disk_cache/entry_impl.cc
+++ b/net/disk_cache/entry_impl.cc
@@ -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;
}