Index: net/sdch/sdch_owner.cc |
diff --git a/net/sdch/sdch_owner.cc b/net/sdch/sdch_owner.cc |
index 9d985816a9e0350e3930b7c17e7f4f0fdbb85630..09d06ec7b2550ae8334cb49270b6f5f204f12d40 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,28 @@ 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()); |
+} |
+ |
SdchOwner::SdchOwner(SdchManager* sdch_manager, URLRequestContext* context) |
: manager_(sdch_manager->GetWeakPtr()), |
fetcher_(new SdchDictionaryFetcher(context)), |
@@ -285,7 +256,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()); |
@@ -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,13 @@ SdchOwner::~SdchOwner() { |
if (external_pref_store_) |
external_pref_store_->RemoveObserver(this); |
+ int64 process_lifetime = |
+ (clock_->Now() - creation_time_).InMilliseconds(); |
+ for (auto& val : consumed_byte_seconds_) { |
Ilya Sherman
2015/04/03 20:42:17
nit: "const auto&"?
|
+ UMA_HISTOGRAM_COUNTS("Sdch3.TimeWeightedMemoryUse", |
+ val / process_lifetime); |
Ilya Sherman
2015/04/03 20:42:17
Optional: Maybe use UMA_HISTOGRAM_MEMORY_KB here?
|
+ } |
+ |
#if defined(OS_CHROMEOS) |
destroyed_ = 0xdeadbeef; |
#endif |
@@ -450,7 +430,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 +469,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 +702,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); |
} |