diff options
author | msramek <msramek@chromium.org> | 2015-10-14 09:23:26 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-14 16:24:30 +0000 |
commit | a319545886d0e297b88301f01b804432bea602f7 (patch) | |
tree | 0511a64183ebdaa38e8e9ff7b84a4568430bd3d9 /net/disk_cache | |
parent | e9a705bcc593af24c4360e693d1190a07e80f2af (diff) | |
download | chromium_src-a319545886d0e297b88301f01b804432bea602f7.zip chromium_src-a319545886d0e297b88301f01b804432bea602f7.tar.gz chromium_src-a319545886d0e297b88301f01b804432bea602f7.tar.bz2 |
Implement cache counting for the simple and memory backends.
This is a followup to https://codereview.chromium.org/1304363013/, which implemented it for the blockfile backend.
BUG=510028
Review URL: https://codereview.chromium.org/1398053002
Cr-Commit-Position: refs/heads/master@{#354037}
Diffstat (limited to 'net/disk_cache')
-rw-r--r-- | net/disk_cache/backend_unittest.cc | 68 | ||||
-rw-r--r-- | net/disk_cache/memory/mem_backend_impl.cc | 3 | ||||
-rw-r--r-- | net/disk_cache/simple/simple_backend_impl.cc | 38 | ||||
-rw-r--r-- | net/disk_cache/simple/simple_backend_impl.h | 4 | ||||
-rw-r--r-- | net/disk_cache/simple/simple_index.cc | 5 | ||||
-rw-r--r-- | net/disk_cache/simple/simple_index.h | 4 |
6 files changed, 68 insertions, 54 deletions
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc index 8833729..cf82a5b 100644 --- a/net/disk_cache/backend_unittest.cc +++ b/net/disk_cache/backend_unittest.cc @@ -89,6 +89,10 @@ class DiskCacheBackendTest : public DiskCacheTestWithCache { std::set<std::string>* keys_to_match, size_t* count); + // Computes the expected size of entry metadata, i.e. the total size without + // the actual data stored. This depends only on the entry's |key| size. + int GetEntryMetadataSize(std::string key); + // Actual tests: void BackendBasics(); void BackendKeying(); @@ -282,6 +286,18 @@ bool DiskCacheBackendTest::EnumerateAndMatchKeys( return true; } +int DiskCacheBackendTest::GetEntryMetadataSize(std::string key) { + // For blockfile and memory backends, it is just the key size. + if (!simple_cache_mode_) + return key.size(); + + // For the simple cache, we must add the file header and EOF, and that for + // every stream. + return disk_cache::kSimpleEntryStreamCount * + (sizeof(disk_cache::SimpleFileHeader) + + sizeof(disk_cache::SimpleFileEOF) + key.size()); +} + void DiskCacheBackendTest::BackendBasics() { InitCache(); disk_cache::Entry *entry1 = NULL, *entry2 = NULL; @@ -1679,12 +1695,7 @@ void DiskCacheBackendTest::BackendCalculateSizeOfAllEntries() { InitCache(); // The cache is initially empty. - if (memory_only_ || simple_cache_mode_) { - // TODO(msramek): Implement. - EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, CalculateSizeOfAllEntries()); - } else { - EXPECT_EQ(0, CalculateSizeOfAllEntries()); - } + EXPECT_EQ(0, CalculateSizeOfAllEntries()); // Generate random entries and populate them with data of respective // sizes 0, 1, ..., count - 1 bytes. @@ -1697,10 +1708,15 @@ void DiskCacheBackendTest::BackendCalculateSizeOfAllEntries() { scoped_refptr<net::StringIOBuffer> buffer = new net::StringIOBuffer(data); // Alternate between writing to the first and second stream to test that - // we are not taking just the first stream into account. + // we are not taking just the first stream into account. For convenience, + // the last written stream should be 0. This is because writing to + // the stream 1 in simple cache triggers a write to the stream 0 as well. + // This will happen asynchronously and possibly later than our call to + // |CalculateSizeOfAllEntries|. disk_cache::Entry* entry; ASSERT_EQ(net::OK, OpenEntry(key, &entry)); - ASSERT_EQ(count, WriteData(entry, count % 2, 0, buffer.get(), count, true)); + ASSERT_EQ(count, + WriteData(entry, (count + 1) % 2, 0, buffer.get(), count, true)); entry->Close(); ++count; @@ -1708,16 +1724,10 @@ void DiskCacheBackendTest::BackendCalculateSizeOfAllEntries() { // The resulting size should be (0 + 1 + ... + count - 1) plus keys. int result = CalculateSizeOfAllEntries(); - if (memory_only_ || simple_cache_mode_) { - // TODO(msramek): Implement. - EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, result); - } else { - int total_key_size = 0; - for (std::string key : key_pool) - total_key_size += key.size(); - - EXPECT_EQ((count - 1) * count / 2 + total_key_size, result); - } + int total_metadata_size = 0; + for (std::string key : key_pool) + total_metadata_size += GetEntryMetadataSize(key); + EXPECT_EQ((count - 1) * count / 2 + total_metadata_size, result); // Add another entry and test if the size is updated. Then remove it and test // if the size is back to original value. @@ -1734,32 +1744,16 @@ void DiskCacheBackendTest::BackendCalculateSizeOfAllEntries() { entry->Close(); int new_result = CalculateSizeOfAllEntries(); - if (memory_only_ || simple_cache_mode_) { - // TODO(msramek): Implement. - EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, new_result); - } else { - EXPECT_EQ(result + last_entry_size + static_cast<int>(key.size()), - new_result); - } + EXPECT_EQ(result + last_entry_size + GetEntryMetadataSize(key), new_result); DoomEntry(key); new_result = CalculateSizeOfAllEntries(); - if (memory_only_ || simple_cache_mode_) { - // TODO(msramek): Implement. - EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, new_result); - } else { - EXPECT_EQ(result, new_result); - } + EXPECT_EQ(result, new_result); } // After dooming the entries, the size should be back to zero. ASSERT_EQ(net::OK, DoomAllEntries()); - if (memory_only_ || simple_cache_mode_) { - // TODO(msramek): Implement. - EXPECT_EQ(net::ERR_NOT_IMPLEMENTED, CalculateSizeOfAllEntries()); - } else { - EXPECT_EQ(0, CalculateSizeOfAllEntries()); - } + EXPECT_EQ(0, CalculateSizeOfAllEntries()); } TEST_F(DiskCacheBackendTest, CalculateSizeOfAllEntries) { diff --git a/net/disk_cache/memory/mem_backend_impl.cc b/net/disk_cache/memory/mem_backend_impl.cc index ca8cf1b..9948660 100644 --- a/net/disk_cache/memory/mem_backend_impl.cc +++ b/net/disk_cache/memory/mem_backend_impl.cc @@ -184,8 +184,7 @@ int MemBackendImpl::DoomEntriesSince(const base::Time initial_time, int MemBackendImpl::CalculateSizeOfAllEntries( const CompletionCallback& callback) { - // TODO(msramek): Implement. - return net::ERR_NOT_IMPLEMENTED; + return current_size_; } class MemBackendImpl::MemIterator : public Backend::Iterator { diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc index f985e58..d1c111e 100644 --- a/net/disk_cache/simple/simple_backend_impl.cc +++ b/net/disk_cache/simple/simple_backend_impl.cc @@ -442,19 +442,6 @@ int SimpleBackendImpl::DoomAllEntries(const CompletionCallback& callback) { return DoomEntriesBetween(Time(), Time(), callback); } -void SimpleBackendImpl::IndexReadyForDoom(Time initial_time, - Time end_time, - const CompletionCallback& callback, - int result) { - if (result != net::OK) { - callback.Run(result); - return; - } - scoped_ptr<std::vector<uint64> > removed_key_hashes( - index_->GetEntriesBetween(initial_time, end_time).release()); - DoomEntries(removed_key_hashes.get(), callback); -} - int SimpleBackendImpl::DoomEntriesBetween( const Time initial_time, const Time end_time, @@ -472,8 +459,8 @@ int SimpleBackendImpl::DoomEntriesSince( int SimpleBackendImpl::CalculateSizeOfAllEntries( const CompletionCallback& callback) { - // TODO(msramek): Implement. - return net::ERR_NOT_IMPLEMENTED; + return index_->ExecuteWhenReady(base::Bind( + &SimpleBackendImpl::IndexReadyForSizeCalculation, AsWeakPtr(), callback)); } class SimpleBackendImpl::SimpleIterator final : public Iterator { @@ -570,6 +557,27 @@ void SimpleBackendImpl::InitializeIndex(const CompletionCallback& callback, callback.Run(result.net_error); } +void SimpleBackendImpl::IndexReadyForDoom(Time initial_time, + Time end_time, + const CompletionCallback& callback, + int result) { + if (result != net::OK) { + callback.Run(result); + return; + } + scoped_ptr<std::vector<uint64>> removed_key_hashes( + index_->GetEntriesBetween(initial_time, end_time).release()); + DoomEntries(removed_key_hashes.get(), callback); +} + +void SimpleBackendImpl::IndexReadyForSizeCalculation( + const CompletionCallback& callback, + int result) { + if (result == net::OK) + result = static_cast<int>(index_->GetCacheSize()); + callback.Run(result); +} + SimpleBackendImpl::DiskStatResult SimpleBackendImpl::InitCacheStructureOnDisk( const base::FilePath& path, uint64 suggested_max_size) { diff --git a/net/disk_cache/simple/simple_backend_impl.h b/net/disk_cache/simple/simple_backend_impl.h index c9debd0..c8cac21 100644 --- a/net/disk_cache/simple/simple_backend_impl.h +++ b/net/disk_cache/simple/simple_backend_impl.h @@ -140,6 +140,10 @@ class NET_EXPORT_PRIVATE SimpleBackendImpl : public Backend, const CompletionCallback& callback, int result); + // Calculates the size of the entire cache. Invoked when the index is ready. + void IndexReadyForSizeCalculation(const CompletionCallback& callback, + int result); + // Try to create the directory if it doesn't exist. This must run on the IO // thread. static DiskStatResult InitCacheStructureOnDisk(const base::FilePath& path, diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc index fd01abd..5557801 100644 --- a/net/disk_cache/simple/simple_index.cc +++ b/net/disk_cache/simple/simple_index.cc @@ -239,6 +239,11 @@ int32 SimpleIndex::GetEntryCount() const { return entries_set_.size(); } +uint64 SimpleIndex::GetCacheSize() const { + DCHECK(initialized_); + return cache_size_; +} + void SimpleIndex::Insert(uint64 entry_hash) { DCHECK(io_thread_checker_.CalledOnValidThread()); // Upon insert we don't know yet the size of the entry. diff --git a/net/disk_cache/simple/simple_index.h b/net/disk_cache/simple/simple_index.h index 11adab9..5a8046d 100644 --- a/net/disk_cache/simple/simple_index.h +++ b/net/disk_cache/simple/simple_index.h @@ -130,6 +130,10 @@ class NET_EXPORT_PRIVATE SimpleIndex // Returns number of indexed entries. int32 GetEntryCount() const; + // Returns the size of the entire cache in bytes. Can only be called after the + // index has been initialized. + uint64 GetCacheSize() const; + // Returns whether the index has been initialized yet. bool initialized() const { return initialized_; } |