diff options
author | gavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-29 17:35:57 +0000 |
---|---|---|
committer | gavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-29 17:35:57 +0000 |
commit | 783b22dea0148ee262c89c7a69423dc26227853f (patch) | |
tree | a2a789fd4807cbcc56d92924153fd1693c6cd2f1 /net/disk_cache/entry_unittest.cc | |
parent | 01dd75434167c0e445a1216e89473d070ac91448 (diff) | |
download | chromium_src-783b22dea0148ee262c89c7a69423dc26227853f.zip chromium_src-783b22dea0148ee262c89c7a69423dc26227853f.tar.gz chromium_src-783b22dea0148ee262c89c7a69423dc26227853f.tar.bz2 |
Deflake SimpleCache::Close()
It turns out that Close() takes a small, finite amount of time before
it is safe to open an entry again, because it must write the EOF
record before closing the file.
To reduce flakiness, do not permit OpenEntry to proceed while a Close
is pending. This is done by placing a more detailed state machine in the
SimpleEntryImpl, along with a map of all active entries in the SimpleBackendImpl.
Not all flakes are gone (especially around mass dooms), but this should be a strict
improvement.
R=pliard,pasko,felipeg
BUG=233871,236322
Review URL: https://chromiumcodereview.appspot.com/14354008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@197070 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/disk_cache/entry_unittest.cc')
-rw-r--r-- | net/disk_cache/entry_unittest.cc | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc index ef5ad9b..b98d6fd 100644 --- a/net/disk_cache/entry_unittest.cc +++ b/net/disk_cache/entry_unittest.cc @@ -59,6 +59,7 @@ class DiskCacheEntryTest : public DiskCacheTestWithCache { void DoomSparseEntry(); void PartialSparseEntry(); void EvictOldEntries(); + void SimpleCacheMakeBadChecksumEntry(const char* key); }; // This part of the test runs on the background thread. @@ -2351,12 +2352,7 @@ TEST_F(DiskCacheEntryTest, SimpleCacheDoomedEntry) { DoomedEntry(); } -// Tests that the simple cache can detect entries that have bad data. -TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { - SetSimpleCacheMode(); - InitCache(); - - const char key[] = "the first key"; +void DiskCacheEntryTest::SimpleCacheMakeBadChecksumEntry(const char* key) { disk_cache::Entry* entry = NULL; ASSERT_EQ(net::OK, CreateEntry(key, &entry)); @@ -2388,15 +2384,50 @@ TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { base::WritePlatformFile(entry_file0, file_offset, bad_data.data(), bad_data.size())); EXPECT_TRUE(base::ClosePlatformFile(entry_file0)); +} + +// Tests that the simple cache can detect entries that have bad data. +TEST_F(DiskCacheEntryTest, SimpleCacheBadChecksum) { + SetSimpleCacheMode(); + InitCache(); + + const char key[] = "the first key"; + SimpleCacheMakeBadChecksumEntry(key); + + disk_cache::Entry* entry = NULL; // Open the entry. EXPECT_EQ(net::OK, OpenEntry(key, &entry)); - const size_t kReadBufferSize = 200; - EXPECT_LE(data.size(), kReadBufferSize); + const int kReadBufferSize = 200; + DCHECK_GE(kReadBufferSize, entry->GetDataSize(0)); scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); EXPECT_EQ(net::ERR_FAILED, ReadData(entry, 0, 0, read_buffer, kReadBufferSize)); + + entry->Close(); +} + +// Tests that an entry that has had an IO error occur can still be Doomed(). +TEST_F(DiskCacheEntryTest, SimpleCacheErrorThenDoom) { + SetSimpleCacheMode(); + InitCache(); + + const char key[] = "the first key"; + SimpleCacheMakeBadChecksumEntry(key); + + disk_cache::Entry* entry = NULL; + + // Open the entry, forcing an IO error. + EXPECT_EQ(net::OK, OpenEntry(key, &entry)); + + const int kReadBufferSize = 200; + DCHECK_GE(kReadBufferSize, entry->GetDataSize(0)); + scoped_refptr<net::IOBuffer> read_buffer(new net::IOBuffer(kReadBufferSize)); + EXPECT_EQ(net::ERR_FAILED, + ReadData(entry, 0, 0, read_buffer, kReadBufferSize)); + + entry->Doom(); // Should not crash. entry->Close(); } |