diff options
-rw-r--r-- | net/disk_cache/backend_impl.cc | 2 | ||||
-rw-r--r-- | net/disk_cache/backend_unittest.cc | 4 | ||||
-rw-r--r-- | net/disk_cache/entry_impl.cc | 8 | ||||
-rw-r--r-- | net/disk_cache/entry_unittest.cc | 45 |
4 files changed, 54 insertions, 5 deletions
diff --git a/net/disk_cache/backend_impl.cc b/net/disk_cache/backend_impl.cc index 5cada55..96f8723 100644 --- a/net/disk_cache/backend_impl.cc +++ b/net/disk_cache/backend_impl.cc @@ -428,7 +428,7 @@ BackendImpl::~BackendImpl() { // ------------------------------------------------------------------------ int32 BackendImpl::GetEntryCount() const { - if (!index_) + if (!index_ || disabled_) return 0; // num_entries includes entries already evicted. int32 not_deleted = data_->header.num_entries - diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc index bfb78b6..d3e79a1 100644 --- a/net/disk_cache/backend_unittest.cc +++ b/net/disk_cache/backend_unittest.cc @@ -1444,7 +1444,7 @@ void DiskCacheBackendTest::BackendDisable() { ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1)); EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2)); - EXPECT_EQ(2, cache_->GetEntryCount()); + EXPECT_EQ(0, cache_->GetEntryCount()); EXPECT_NE(net::OK, CreateEntry("Something new", &entry2)); entry1->Close(); @@ -1601,7 +1601,7 @@ void DiskCacheBackendTest::BackendDisable4() { // This line should disable the cache but not delete it. EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4)); - EXPECT_EQ(4, cache_->GetEntryCount()); + EXPECT_EQ(0, cache_->GetEntryCount()); EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4)); diff --git a/net/disk_cache/entry_impl.cc b/net/disk_cache/entry_impl.cc index ce59270..e5e6482 100644 --- a/net/disk_cache/entry_impl.cc +++ b/net/disk_cache/entry_impl.cc @@ -296,11 +296,15 @@ EntryImpl::EntryImpl(BackendImpl* backend, Addr address, bool read_only) // written before). EntryImpl::~EntryImpl() { Log("~EntryImpl in"); - backend_->OnEntryDestroyBegin(entry_.address()); - // Save the sparse info to disk before deleting this entry. + // Save the sparse info to disk. This will generate IO for this entry and + // maybe for a child entry, so it is important to do it before deleting this + // entry. sparse_.reset(); + // Remove this entry from the list of open entries. + backend_->OnEntryDestroyBegin(entry_.address()); + if (doomed_) { DeleteEntryData(true); } else { diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc index bea940c..4f4149d 100644 --- a/net/disk_cache/entry_unittest.cc +++ b/net/disk_cache/entry_unittest.cc @@ -48,6 +48,7 @@ class DiskCacheEntryTest : public DiskCacheTestWithCache { void HugeSparseIO(); void GetAvailableRange(); void CouldBeSparse(); + void UpdateSparseEntry(); void DoomSparseEntry(); void PartialSparseEntry(); }; @@ -1655,6 +1656,50 @@ TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) { entry->Close(); } +void DiskCacheEntryTest::UpdateSparseEntry() { + std::string key("the first key"); + disk_cache::Entry* entry1; + ASSERT_EQ(net::OK, CreateEntry(key, &entry1)); + + const int kSize = 2048; + scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize)); + scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize)); + CacheTestFillBuffer(buf_1->data(), kSize, false); + + // Write at offset 0. + VerifySparseIO(entry1, 0, buf_1, kSize, buf_2); + entry1->Close(); + + // Write at offset 2048. + ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); + VerifySparseIO(entry1, 2048, buf_1, kSize, buf_2); + + disk_cache::Entry* entry2; + ASSERT_EQ(net::OK, CreateEntry("the second key", &entry2)); + + entry1->Close(); + entry2->Close(); + FlushQueueForTest(); + if (memory_only_) + EXPECT_EQ(2, cache_->GetEntryCount()); + else + EXPECT_EQ(3, cache_->GetEntryCount()); +} + +TEST_F(DiskCacheEntryTest, UpdateSparseEntry) { + SetDirectMode(); + SetCacheType(net::MEDIA_CACHE); + InitCache(); + UpdateSparseEntry(); +} + +TEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) { + SetMemoryOnlyMode(); + SetCacheType(net::MEDIA_CACHE); + InitCache(); + UpdateSparseEntry(); +} + void DiskCacheEntryTest::DoomSparseEntry() { std::string key1("the first key"); std::string key2("the second key"); |