summaryrefslogtreecommitdiffstats
path: root/net/disk_cache
diff options
context:
space:
mode:
authormsramek <msramek@chromium.org>2015-10-14 09:23:26 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-14 16:24:30 +0000
commita319545886d0e297b88301f01b804432bea602f7 (patch)
tree0511a64183ebdaa38e8e9ff7b84a4568430bd3d9 /net/disk_cache
parente9a705bcc593af24c4360e693d1190a07e80f2af (diff)
downloadchromium_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.cc68
-rw-r--r--net/disk_cache/memory/mem_backend_impl.cc3
-rw-r--r--net/disk_cache/simple/simple_backend_impl.cc38
-rw-r--r--net/disk_cache/simple/simple_backend_impl.h4
-rw-r--r--net/disk_cache/simple/simple_index.cc5
-rw-r--r--net/disk_cache/simple/simple_index.h4
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_; }