diff options
-rw-r--r-- | net/http/infinite_cache.cc | 12 | ||||
-rw-r--r-- | net/http/infinite_cache_unittest.cc | 29 |
2 files changed, 36 insertions, 5 deletions
diff --git a/net/http/infinite_cache.cc b/net/http/infinite_cache.cc index a89d752..f0f3b0f 100644 --- a/net/http/infinite_cache.cc +++ b/net/http/infinite_cache.cc @@ -82,10 +82,10 @@ const size_t kRecordSize = sizeof(Key) + sizeof(Details); // Some constants related to the database file. uint32 kMagicSignature = 0x1f00cace; -uint32 kCurrentVersion = 0x10001; +uint32 kCurrentVersion = 0x10002; // Basic limits for the experiment. -int kMaxNumEntries = 500 * 1000; +int kMaxNumEntries = 200 * 1000; int kMaxTrackingSize = 40 * 1024 * 1024; // Settings that control how we generate histograms. @@ -604,7 +604,7 @@ void InfiniteCache::Worker::LoadData() { base::ClosePlatformFile(file); if (header_->disabled) { UMA_HISTOGRAM_BOOLEAN("InfiniteCache.Full", true); - map_.clear(); + InitializeData(); } } @@ -639,6 +639,7 @@ void InfiniteCache::Worker::InitializeData() { header_->magic = kMagicSignature; header_->version = kCurrentVersion; header_->creation_time = Time::Now().ToInternalValue(); + map_.clear(); UMA_HISTOGRAM_BOOLEAN("InfiniteCache.Initialize", true); init_ = true; @@ -653,7 +654,7 @@ bool InfiniteCache::Worker::ReadData(PlatformFile file) { uint32 hash = adler32(0, Z_NULL, 0); for (int remaining_records = header_->num_entries; remaining_records;) { - int num_records = std::min(header_->num_entries, + int num_records = std::min(remaining_records, static_cast<int>(kMaxRecordsToRead)); size_t num_bytes = num_records * kRecordSize; remaining_records -= num_records; @@ -703,7 +704,7 @@ bool InfiniteCache::Worker::WriteData(PlatformFile file) { DCHECK_EQ(header_->num_entries, static_cast<int32>(map_.size())); KeyMap::iterator iterator = map_.begin(); for (int remaining_records = header_->num_entries; remaining_records;) { - int num_records = std::min(header_->num_entries, + int num_records = std::min(remaining_records, static_cast<int>(kMaxRecordsToRead)); size_t num_bytes = num_records * kRecordSize; remaining_records -= num_records; @@ -804,6 +805,7 @@ void InfiniteCache::Worker::Add(const Details& details) { int entry_size = static_cast<int>(header_->total_size / kMaxNumEntries); UMA_HISTOGRAM_COUNTS("InfiniteCache.FinalAvgEntrySize", entry_size); header_->disabled = 1; + header_->num_entries = 0; map_.clear(); } } diff --git a/net/http/infinite_cache_unittest.cc b/net/http/infinite_cache_unittest.cc index 813adbc..2c10284 100644 --- a/net/http/infinite_cache_unittest.cc +++ b/net/http/infinite_cache_unittest.cc @@ -6,6 +6,7 @@ #include "base/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/stringprintf.h" #include "base/threading/platform_thread.h" #include "base/time.h" #include "net/base/net_errors.h" @@ -245,3 +246,31 @@ TEST(InfiniteCache, DeleteBetween) { EXPECT_EQ(1, cb.GetResult(cache->QueryItemsForTest(cb.callback()))); #endif // OS_ANDROID } + +#if 0 +// This test is too slow for the bots. +TEST(InfiniteCache, FillUp) { + base::ScopedTempDir dir; + ASSERT_TRUE(dir.CreateUniqueTempDir()); + FilePath path = dir.path().Append(FILE_PATH_LITERAL("infinite")); + + scoped_ptr<InfiniteCache> cache(new InfiniteCache); + cache->Init(path); + net::TestCompletionCallback cb; + + const int kNumEntries = 25000; + for (int i = 0; i < kNumEntries; i++) { + std::string url = StringPrintf("http://foo.com/%d/foo.html", i); + MockTransaction transaction = kTypicalGET_Transaction; + transaction.url = url.c_str(); + ProcessRequest(transaction, cache.get()); + } + + EXPECT_EQ(kNumEntries, cb.GetResult(cache->QueryItemsForTest(cb.callback()))); + EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback()))); + + cache.reset(new InfiniteCache); + cache->Init(path); + EXPECT_EQ(kNumEntries, cb.GetResult(cache->QueryItemsForTest(cb.callback()))); +} +#endif |