Index: net/disk_cache/backend_impl.cc |
=================================================================== |
--- net/disk_cache/backend_impl.cc (revision 199883) |
+++ net/disk_cache/backend_impl.cc (working copy) |
@@ -22,6 +22,7 @@ |
#include "base/timer.h" |
#include "net/base/net_errors.h" |
#include "net/disk_cache/cache_util.h" |
+#include "net/disk_cache/disk_format.h" |
#include "net/disk_cache/entry_impl.h" |
#include "net/disk_cache/errors.h" |
#include "net/disk_cache/experiments.h" |
@@ -284,7 +285,7 @@ |
bool previous_crash = (data_->header.crash != 0); |
data_->header.crash = 1; |
- if (!block_files_.Init(create_files)) |
+ if (!block_files_.Init(create_files, kFirstAdditionalBlockFile)) |
return net::ERR_FAILED; |
// We want to minimize the changes to cache for an AppCache. |
@@ -299,7 +300,7 @@ |
// stats_ and rankings_ may end up calling back to us so we better be enabled. |
disabled_ = false; |
- if (!stats_.Init(this, &data_->header.stats)) |
+ if (!InitStats()) |
return net::ERR_FAILED; |
disabled_ = !rankings_.Init(this, new_eviction_); |
@@ -329,7 +330,7 @@ |
timer_.reset(); |
if (init_) { |
- stats_.Store(); |
+ StoreStats(); |
if (data_) |
data_->header.crash = 0; |
@@ -607,7 +608,7 @@ |
cache_entry->BeginLogging(net_log_, true); |
// We are not failing the operation; let's add this to the map. |
- open_entries_[entry_address.value()] = cache_entry; |
+ open_entries_[entry_address.value()] = cache_entry.get(); |
// Save the entry. |
cache_entry->entry()->Store(); |
@@ -623,7 +624,7 @@ |
} |
// Link this entry through the lists. |
- eviction_.OnCreateEntry(cache_entry); |
+ eviction_.OnCreateEntry(cache_entry.get()); |
CACHE_UMA(AGE_MS, "CreateTime", 0, start); |
stats_.OnEvent(Stats::CREATE_HIT); |
@@ -1000,8 +1001,8 @@ |
disabled_ = true; |
if (!num_refs_) |
- MessageLoop::current()->PostTask(FROM_HERE, |
- base::Bind(&BackendImpl::RestartCache, GetWeakPtr(), true)); |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, base::Bind(&BackendImpl::RestartCache, GetWeakPtr(), true)); |
} |
void BackendImpl::ReportError(int error) { |
@@ -1066,7 +1067,7 @@ |
// Save stats to disk at 5 min intervals. |
if (time % 10 == 0) |
- stats_.Store(); |
+ StoreStats(); |
} |
void BackendImpl::IncrementIoCount() { |
@@ -1247,6 +1248,10 @@ |
item.second = base::StringPrintf("%d", data_->header.num_bytes); |
stats->push_back(item); |
+ item.first = "Cache type"; |
+ item.second = "Blockfile Cache"; |
+ stats->push_back(item); |
+ |
stats_.GetItems(stats); |
} |
@@ -1294,7 +1299,7 @@ |
bool ret = true; |
if (*file_created) |
- ret = CreateBackingStore(file); |
+ ret = CreateBackingStore(file.get()); |
file = NULL; |
if (!ret) |
@@ -1352,11 +1357,68 @@ |
max_size_= current_max_size; |
} |
+bool BackendImpl::InitStats() { |
+ Addr address(data_->header.stats); |
+ int size = stats_.StorageSize(); |
+ |
+ if (!address.is_initialized()) { |
+ FileType file_type = Addr::RequiredFileType(size); |
+ DCHECK_NE(file_type, EXTERNAL); |
+ int num_blocks = Addr::RequiredBlocks(size, file_type); |
+ |
+ if (!CreateBlock(file_type, num_blocks, &address)) |
+ return false; |
+ |
+ data_->header.stats = address.value(); |
+ return stats_.Init(NULL, 0, address); |
+ } |
+ |
+ if (!address.is_block_file()) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ // Load the required data. |
+ size = address.num_blocks() * address.BlockSize(); |
+ MappedFile* file = File(address); |
+ if (!file) |
+ return false; |
+ |
+ scoped_ptr<char[]> data(new char[size]); |
+ size_t offset = address.start_block() * address.BlockSize() + |
+ kBlockHeaderSize; |
+ if (!file->Read(data.get(), size, offset)) |
+ return false; |
+ |
+ if (!stats_.Init(data.get(), size, address)) |
+ return false; |
+ if (cache_type_ == net::DISK_CACHE && ShouldReportAgain()) |
+ stats_.InitSizeHistogram(); |
+ return true; |
+} |
+ |
+void BackendImpl::StoreStats() { |
+ int size = stats_.StorageSize(); |
+ scoped_ptr<char[]> data(new char[size]); |
+ Addr address; |
+ size = stats_.SerializeStats(data.get(), size, &address); |
+ DCHECK(size); |
+ if (!address.is_initialized()) |
+ return; |
+ |
+ MappedFile* file = File(address); |
+ if (!file) |
+ return; |
+ |
+ size_t offset = address.start_block() * address.BlockSize() + |
+ kBlockHeaderSize; |
+ file->Write(data.get(), size, offset); // ignore result. |
+} |
+ |
void BackendImpl::RestartCache(bool failure) { |
int64 errors = stats_.GetCounter(Stats::FATAL_ERROR); |
int64 full_dooms = stats_.GetCounter(Stats::DOOM_CACHE); |
int64 partial_dooms = stats_.GetCounter(Stats::DOOM_RECENT); |
- int64 ga_evictions = stats_.GetCounter(Stats::GAJS_EVICTED); |
int64 last_report = stats_.GetCounter(Stats::LAST_REPORT); |
PrepareForRestart(); |
@@ -1376,7 +1438,6 @@ |
stats_.SetCounter(Stats::FATAL_ERROR, errors); |
stats_.SetCounter(Stats::DOOM_CACHE, full_dooms); |
stats_.SetCounter(Stats::DOOM_RECENT, partial_dooms); |
- stats_.SetCounter(Stats::GAJS_EVICTED, ga_evictions); |
stats_.SetCounter(Stats::LAST_REPORT, last_report); |
} |
} |
@@ -1412,7 +1473,7 @@ |
STRESS_DCHECK(block_files_.IsValid(address)); |
- if (!address.SanityCheckForEntry()) { |
+ if (!address.SanityCheckForEntryV2()) { |
LOG(WARNING) << "Wrong entry address."; |
STRESS_NOTREACHED(); |
return ERR_INVALID_ADDRESS; |
@@ -1470,7 +1531,7 @@ |
address.value()); |
} |
- open_entries_[address.value()] = cache_entry; |
+ open_entries_[address.value()] = cache_entry.get(); |
cache_entry->BeginLogging(net_log_, false); |
cache_entry.swap(entry); |
@@ -1529,7 +1590,7 @@ |
if (!error) { |
// It is important to call DestroyInvalidEntry after removing this |
// entry from the table. |
- DestroyInvalidEntry(cache_entry); |
+ DestroyInvalidEntry(cache_entry.get()); |
cache_entry = NULL; |
} else { |
Trace("NewEntry failed on MatchEntry 0x%x", address.value()); |
@@ -1779,8 +1840,8 @@ |
num_refs_--; |
if (!num_refs_ && disabled_) |
- MessageLoop::current()->PostTask(FROM_HERE, |
- base::Bind(&BackendImpl::RestartCache, GetWeakPtr(), true)); |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, base::Bind(&BackendImpl::RestartCache, GetWeakPtr(), true)); |
} |
void BackendImpl::IncreaseNumEntries() { |
@@ -1834,12 +1895,9 @@ |
static_cast<int>(stats_.GetCounter(Stats::DOOM_CACHE))); |
CACHE_UMA(COUNTS_10000, "TotalDoomRecentEntries", 0, |
static_cast<int>(stats_.GetCounter(Stats::DOOM_RECENT))); |
- CACHE_UMA(COUNTS_10000, "TotalEvictionsGaJs", 0, |
- static_cast<int>(stats_.GetCounter(Stats::GAJS_EVICTED))); |
stats_.SetCounter(Stats::FATAL_ERROR, 0); |
stats_.SetCounter(Stats::DOOM_CACHE, 0); |
stats_.SetCounter(Stats::DOOM_RECENT, 0); |
- stats_.SetCounter(Stats::GAJS_EVICTED, 0); |
int64 total_hours = stats_.GetCounter(Stats::TIMER) / 120; |
if (!data_->header.create_time || !data_->header.lru.filled) { |