| Index: net/sdch/sdch_owner.cc
|
| diff --git a/net/sdch/sdch_owner.cc b/net/sdch/sdch_owner.cc
|
| index 9d985816a9e0350e3930b7c17e7f4f0fdbb85630..9e2ac16d2423ef3f9843d51760cade6d02ebe432 100644
|
| --- a/net/sdch/sdch_owner.cc
|
| +++ b/net/sdch/sdch_owner.cc
|
| @@ -20,43 +20,6 @@ namespace net {
|
|
|
| namespace {
|
|
|
| -enum DictionaryFate {
|
| - // A Get-Dictionary header wasn't acted on.
|
| - DICTIONARY_FATE_GET_IGNORED = 1,
|
| -
|
| - // A fetch was attempted, but failed.
|
| - // TODO(rdsmith): Actually record this case.
|
| - DICTIONARY_FATE_FETCH_FAILED = 2,
|
| -
|
| - // A successful fetch was dropped on the floor, no space.
|
| - DICTIONARY_FATE_FETCH_IGNORED_NO_SPACE = 3,
|
| -
|
| - // A successful fetch was refused by the SdchManager.
|
| - DICTIONARY_FATE_FETCH_MANAGER_REFUSED = 4,
|
| -
|
| - // A dictionary was successfully added based on
|
| - // a Get-Dictionary header in a response.
|
| - DICTIONARY_FATE_ADD_RESPONSE_TRIGGERED = 5,
|
| -
|
| - // A dictionary was evicted by an incoming dict.
|
| - DICTIONARY_FATE_EVICT_FOR_DICT = 6,
|
| -
|
| - // A dictionary was evicted by memory pressure.
|
| - DICTIONARY_FATE_EVICT_FOR_MEMORY = 7,
|
| -
|
| - // A dictionary was evicted on destruction.
|
| - DICTIONARY_FATE_EVICT_FOR_DESTRUCTION = 8,
|
| -
|
| - // A dictionary was successfully added based on
|
| - // persistence from a previous browser revision.
|
| - DICTIONARY_FATE_ADD_PERSISTENCE_TRIGGERED = 9,
|
| -
|
| - // A dictionary was unloaded on destruction, but is still present on disk.
|
| - DICTIONARY_FATE_UNLOAD_FOR_DESTRUCTION = 10,
|
| -
|
| - DICTIONARY_FATE_MAX = 11
|
| -};
|
| -
|
| enum PersistenceFailureReason {
|
| // File didn't exist; is being created.
|
| PERSISTENCE_FAILURE_REASON_NO_FILE = 1,
|
| @@ -77,25 +40,11 @@ const int kFreshnessLifetimeHours = 24;
|
| // Dictionaries that have never been used only stay fresh for one hour.
|
| const int kNeverUsedFreshnessLifetimeHours = 1;
|
|
|
| -void RecordDictionaryFate(enum DictionaryFate fate) {
|
| - UMA_HISTOGRAM_ENUMERATION("Sdch3.DictionaryFate", fate, DICTIONARY_FATE_MAX);
|
| -}
|
| -
|
| void RecordPersistenceFailure(PersistenceFailureReason failure_reason) {
|
| UMA_HISTOGRAM_ENUMERATION("Sdch3.PersistenceFailureReason", failure_reason,
|
| PERSISTENCE_FAILURE_REASON_MAX);
|
| }
|
|
|
| -void RecordDictionaryEvictionOrUnload(int use_count, DictionaryFate fate) {
|
| - DCHECK(fate == DICTIONARY_FATE_EVICT_FOR_DICT ||
|
| - fate == DICTIONARY_FATE_EVICT_FOR_MEMORY ||
|
| - fate == DICTIONARY_FATE_EVICT_FOR_DESTRUCTION ||
|
| - fate == DICTIONARY_FATE_UNLOAD_FOR_DESTRUCTION);
|
| -
|
| - UMA_HISTOGRAM_COUNTS_100("Sdch3.DictionaryUseCount", use_count);
|
| - RecordDictionaryFate(fate);
|
| -}
|
| -
|
| // Schema specifications and access routines.
|
|
|
| // The persistent prefs store is conceptually shared with any other network
|
| @@ -266,6 +215,29 @@ const size_t SdchOwner::kMaxTotalDictionarySize = 20 * 1000 * 1000;
|
| // amount of space available in storage.
|
| const size_t SdchOwner::kMinSpaceForDictionaryFetch = 50 * 1000;
|
|
|
| +void SdchOwner::RecordDictionaryFate(enum DictionaryFate fate) {
|
| + UMA_HISTOGRAM_ENUMERATION("Sdch3.DictionaryFate", fate, DICTIONARY_FATE_MAX);
|
| +}
|
| +
|
| +void SdchOwner::RecordDictionaryEvictionOrUnload(const std::string& server_hash,
|
| + size_t size,
|
| + int use_count,
|
| + DictionaryFate fate) {
|
| + DCHECK(fate == DICTIONARY_FATE_EVICT_FOR_DICT ||
|
| + fate == DICTIONARY_FATE_EVICT_FOR_MEMORY ||
|
| + fate == DICTIONARY_FATE_EVICT_FOR_DESTRUCTION ||
|
| + fate == DICTIONARY_FATE_UNLOAD_FOR_DESTRUCTION);
|
| +
|
| + UMA_HISTOGRAM_COUNTS_100("Sdch3.DictionaryUseCount", use_count);
|
| + RecordDictionaryFate(fate);
|
| +
|
| + DCHECK(load_times_.count(server_hash) == 1);
|
| + base::Time now = clock_->Now();
|
| + base::TimeDelta dict_lifetime = now - load_times_[server_hash];
|
| + consumed_byte_seconds_.push_back(size * dict_lifetime.InMilliseconds());
|
| + load_times_.erase(server_hash);
|
| +}
|
| +
|
| SdchOwner::SdchOwner(SdchManager* sdch_manager, URLRequestContext* context)
|
| : manager_(sdch_manager->GetWeakPtr()),
|
| fetcher_(new SdchDictionaryFetcher(context)),
|
| @@ -285,7 +257,8 @@ SdchOwner::SdchOwner(SdchManager* sdch_manager, URLRequestContext* context)
|
| base::Unretained(this))),
|
| in_memory_pref_store_(new ValueMapPrefStore()),
|
| external_pref_store_(nullptr),
|
| - pref_store_(in_memory_pref_store_.get()) {
|
| + pref_store_(in_memory_pref_store_.get()),
|
| + creation_time_(clock_->Now()) {
|
| #if defined(OS_CHROMEOS)
|
| // For debugging http://crbug.com/454198; remove when resolved.
|
| CHECK(clock_.get());
|
| @@ -299,7 +272,6 @@ SdchOwner::~SdchOwner() {
|
| // For debugging http://crbug.com/454198; remove when resolved.
|
| CHECK_EQ(0u, destroyed_);
|
| CHECK(clock_.get());
|
| - clock_.reset();
|
| CHECK(manager_.get());
|
| #endif
|
|
|
| @@ -309,7 +281,8 @@ SdchOwner::~SdchOwner() {
|
| DictionaryFate fate = IsPersistingDictionaries() ?
|
| DICTIONARY_FATE_UNLOAD_FOR_DESTRUCTION :
|
| DICTIONARY_FATE_EVICT_FOR_DESTRUCTION;
|
| - RecordDictionaryEvictionOrUnload(new_uses, fate);
|
| + RecordDictionaryEvictionOrUnload(it.server_hash(), it.size(), new_uses,
|
| + fate);
|
| }
|
| manager_->RemoveObserver(this);
|
|
|
| @@ -318,6 +291,17 @@ SdchOwner::~SdchOwner() {
|
| if (external_pref_store_)
|
| external_pref_store_->RemoveObserver(this);
|
|
|
| + int64 object_lifetime =
|
| + (clock_->Now() - creation_time_).InMilliseconds();
|
| + for (const auto& val : consumed_byte_seconds_) {
|
| + if (object_lifetime > 0) {
|
| + // Objects that are created and immediately destroyed don't add any memory
|
| + // pressure over time (and also cause a crash here).
|
| + UMA_HISTOGRAM_MEMORY_KB("Sdch3.TimeWeightedMemoryUse",
|
| + val / object_lifetime);
|
| + }
|
| + }
|
| +
|
| #if defined(OS_CHROMEOS)
|
| destroyed_ = 0xdeadbeef;
|
| #endif
|
| @@ -450,7 +434,9 @@ void SdchOwner::OnDictionaryFetched(base::Time last_used,
|
|
|
| int new_uses = stale_it->use_count -
|
| use_counts_at_load_[stale_it->server_hash];
|
| - RecordDictionaryEvictionOrUnload(new_uses,
|
| + RecordDictionaryEvictionOrUnload(stale_it->server_hash,
|
| + stale_it->dictionary_size,
|
| + new_uses,
|
| DICTIONARY_FATE_EVICT_FOR_DICT);
|
|
|
| ++stale_it;
|
| @@ -487,6 +473,7 @@ void SdchOwner::OnDictionaryFetched(base::Time last_used,
|
| dictionary_description->SetInteger(kDictionarySizeKey,
|
| dictionary_text.size());
|
| pref_dictionary_map->Set(server_hash, dictionary_description.Pass());
|
| + load_times_[server_hash] = clock_->Now();
|
| }
|
|
|
| void SdchOwner::OnDictionaryUsed(SdchManager* manager,
|
| @@ -719,7 +706,9 @@ void SdchOwner::OnMemoryPressure(
|
| for (DictionaryPreferenceIterator it(pref_store_); !it.IsAtEnd();
|
| it.Advance()) {
|
| int new_uses = it.use_count() - use_counts_at_load_[it.server_hash()];
|
| - RecordDictionaryEvictionOrUnload(new_uses,
|
| + RecordDictionaryEvictionOrUnload(it.server_hash(),
|
| + it.size(),
|
| + new_uses,
|
| DICTIONARY_FATE_EVICT_FOR_MEMORY);
|
| }
|
|
|
|
|