| Index: chrome/common/metrics/metrics_log_manager.cc
|
| ===================================================================
|
| --- chrome/common/metrics/metrics_log_manager.cc (revision 228712)
|
| +++ chrome/common/metrics/metrics_log_manager.cc (working copy)
|
| @@ -7,9 +7,36 @@
|
| #include <algorithm>
|
|
|
| #include "base/metrics/histogram.h"
|
| +#include "base/sha1.h"
|
| #include "base/strings/string_util.h"
|
| #include "chrome/common/metrics/metrics_log_base.h"
|
|
|
| +MetricsLogManager::SerializedLog::SerializedLog() {}
|
| +MetricsLogManager::SerializedLog::~SerializedLog() {}
|
| +
|
| +bool MetricsLogManager::SerializedLog::IsEmpty() const {
|
| + return log_text_.empty();
|
| +}
|
| +
|
| +void MetricsLogManager::SerializedLog::SetLogText(const std::string& log_text) {
|
| + log_text_ = log_text;
|
| + if (log_text_.empty())
|
| + log_hash_.clear();
|
| + else
|
| + log_hash_ = base::SHA1HashString(log_text);
|
| +}
|
| +
|
| +void MetricsLogManager::SerializedLog::Clear() {
|
| + log_text_.clear();
|
| + log_hash_.clear();
|
| +}
|
| +
|
| +void MetricsLogManager::SerializedLog::Swap(
|
| + MetricsLogManager::SerializedLog* other) {
|
| + log_text_.swap(other->log_text_);
|
| + log_hash_.swap(other->log_hash_);
|
| +}
|
| +
|
| MetricsLogManager::MetricsLogManager()
|
| : current_log_type_(NO_LOG),
|
| paused_log_type_(NO_LOG),
|
| @@ -32,9 +59,9 @@
|
| DCHECK(current_log_.get());
|
| DCHECK(current_log_type_ != NO_LOG);
|
| current_log_->CloseLog();
|
| - std::string compressed_log;
|
| + SerializedLog compressed_log;
|
| CompressCurrentLog(&compressed_log);
|
| - if (!compressed_log.empty())
|
| + if (!compressed_log.IsEmpty())
|
| StoreLog(&compressed_log, current_log_type_, NORMAL_STORE);
|
| current_log_.reset();
|
| current_log_type_ = NO_LOG;
|
| @@ -42,7 +69,7 @@
|
|
|
| void MetricsLogManager::StageNextLogForUpload() {
|
| // Prioritize initial logs for uploading.
|
| - std::vector<std::string>* source_list =
|
| + std::vector<SerializedLog>* source_list =
|
| unsent_initial_logs_.empty() ? &unsent_ongoing_logs_
|
| : &unsent_initial_logs_;
|
| LogType source_type = (source_list == &unsent_ongoing_logs_) ? ONGOING_LOG
|
| @@ -50,9 +77,9 @@
|
| // CHECK, rather than DCHECK, because swap()ing with an empty list causes
|
| // hard-to-identify crashes much later.
|
| CHECK(!source_list->empty());
|
| - DCHECK(staged_log_text_.empty());
|
| + DCHECK(staged_log_.IsEmpty());
|
| DCHECK(staged_log_type_ == NO_LOG);
|
| - staged_log_text_.swap(source_list->back());
|
| + staged_log_.Swap(&source_list->back());
|
| staged_log_type_ = source_type;
|
| source_list->pop_back();
|
|
|
| @@ -67,11 +94,11 @@
|
| }
|
|
|
| bool MetricsLogManager::has_staged_log() const {
|
| - return !staged_log_text().empty();
|
| + return !staged_log_.IsEmpty();
|
| }
|
|
|
| void MetricsLogManager::DiscardStagedLog() {
|
| - staged_log_text_.clear();
|
| + staged_log_.Clear();
|
| staged_log_type_ = NO_LOG;
|
| }
|
|
|
| @@ -101,22 +128,22 @@
|
| DCHECK(has_staged_log());
|
|
|
| // If compressing the log failed, there's nothing to store.
|
| - if (staged_log_text_.empty())
|
| + if (staged_log_.IsEmpty())
|
| return;
|
|
|
| - StoreLog(&staged_log_text_, staged_log_type_, store_type);
|
| + StoreLog(&staged_log_, staged_log_type_, store_type);
|
| DiscardStagedLog();
|
| }
|
|
|
| -void MetricsLogManager::StoreLog(std::string* log_text,
|
| +void MetricsLogManager::StoreLog(SerializedLog* log,
|
| LogType log_type,
|
| StoreType store_type) {
|
| DCHECK(log_type != NO_LOG);
|
| - std::vector<std::string>* destination_list =
|
| + std::vector<SerializedLog>* destination_list =
|
| (log_type == INITIAL_LOG) ? &unsent_initial_logs_
|
| : &unsent_ongoing_logs_;
|
| - destination_list->push_back(std::string());
|
| - destination_list->back().swap(*log_text);
|
| + destination_list->push_back(SerializedLog());
|
| + destination_list->back().Swap(log);
|
|
|
| if (store_type == PROVISIONAL_STORE) {
|
| last_provisional_store_index_ = destination_list->size() - 1;
|
| @@ -127,7 +154,7 @@
|
| void MetricsLogManager::DiscardLastProvisionalStore() {
|
| if (last_provisional_store_index_ == -1)
|
| return;
|
| - std::vector<std::string>* source_list =
|
| + std::vector<SerializedLog>* source_list =
|
| (last_provisional_store_type_ == ONGOING_LOG) ? &unsent_ongoing_logs_
|
| : &unsent_initial_logs_;
|
| DCHECK_LT(static_cast<unsigned int>(last_provisional_store_index_),
|
| @@ -142,9 +169,9 @@
|
| return;
|
| // Remove any ongoing logs that are over the serialization size limit.
|
| if (max_ongoing_log_store_size_) {
|
| - for (std::vector<std::string>::iterator it = unsent_ongoing_logs_.begin();
|
| + for (std::vector<SerializedLog>::iterator it = unsent_ongoing_logs_.begin();
|
| it != unsent_ongoing_logs_.end();) {
|
| - size_t log_size = it->length();
|
| + size_t log_size = it->log_text().length();
|
| if (log_size > max_ongoing_log_store_size_) {
|
| UMA_HISTOGRAM_COUNTS("UMA.Large Accumulated Log Not Persisted",
|
| static_cast<int>(log_size));
|
| @@ -166,6 +193,8 @@
|
| log_serializer_->DeserializeLogs(ONGOING_LOG, &unsent_ongoing_logs_);
|
| }
|
|
|
| -void MetricsLogManager::CompressCurrentLog(std::string* compressed_log) {
|
| - current_log_->GetEncodedLog(compressed_log);
|
| +void MetricsLogManager::CompressCurrentLog(SerializedLog* compressed_log) {
|
| + std::string log_text;
|
| + current_log_->GetEncodedLog(&log_text);
|
| + compressed_log->SetLogText(log_text);
|
| }
|
|
|