| Index: components/metrics/metrics_service.cc
|
| diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
|
| index 797ec70fdc09d959ec804e018d67d2070b4675c0..ae2c80ff46cd6ad446d64c35565985951db2c760 100644
|
| --- a/components/metrics/metrics_service.cc
|
| +++ b/components/metrics/metrics_service.cc
|
| @@ -557,6 +557,8 @@ void MetricsService::InitializeMetricsState() {
|
| local_state_->SetInt64(metrics::prefs::kStabilityStatsBuildTime,
|
| MetricsLog::GetBuildTime());
|
|
|
| + log_manager_.LoadPersistedUnsentLogs();
|
| +
|
| session_id_ = local_state_->GetInteger(metrics::prefs::kMetricsSessionID);
|
|
|
| if (!local_state_->GetBoolean(metrics::prefs::kStabilityExitedCleanly)) {
|
| @@ -741,8 +743,7 @@ void MetricsService::CloseCurrentLog() {
|
| // end of all log transmissions (initial log handles this separately).
|
| // RecordIncrementalStabilityElements only exists on the derived
|
| // MetricsLog class.
|
| - MetricsLog* current_log =
|
| - static_cast<MetricsLog*>(log_manager_.current_log());
|
| + MetricsLog* current_log = log_manager_.current_log();
|
| DCHECK(current_log);
|
| std::vector<variations::ActiveGroupId> synthetic_trials;
|
| GetCurrentSyntheticFieldTrials(&synthetic_trials);
|
| @@ -888,13 +889,9 @@ void MetricsService::StageNewLog() {
|
| // There's an initial stability log, ready to send.
|
| log_manager_.StageNextLogForUpload();
|
| has_initial_stability_log_ = false;
|
| - // Note: No need to call LoadPersistedUnsentLogs() here because unsent
|
| - // logs have already been loaded by PrepareInitialStabilityLog().
|
| state_ = SENDING_INITIAL_STABILITY_LOG;
|
| } else {
|
| PrepareInitialMetricsLog();
|
| - // Load unsent logs (if any) from local state.
|
| - log_manager_.LoadPersistedUnsentLogs();
|
| state_ = SENDING_INITIAL_METRICS_LOG;
|
| }
|
| break;
|
| @@ -930,8 +927,6 @@ void MetricsService::PrepareInitialStabilityLog() {
|
| if (!initial_stability_log->LoadSavedEnvironmentFromPrefs())
|
| return;
|
|
|
| - log_manager_.LoadPersistedUnsentLogs();
|
| -
|
| log_manager_.PauseCurrentLog();
|
| log_manager_.BeginLoggingWithLog(initial_stability_log.Pass());
|
|
|
| @@ -973,8 +968,7 @@ void MetricsService::PrepareInitialMetricsLog() {
|
|
|
| // Note: Some stability providers may record stability stats via histograms,
|
| // so this call has to be after BeginLoggingWithLog().
|
| - MetricsLog* current_log =
|
| - static_cast<MetricsLog*>(log_manager_.current_log());
|
| + MetricsLog* current_log = log_manager_.current_log();
|
| current_log->RecordStabilityMetrics(metrics_providers_.get(),
|
| base::TimeDelta(), base::TimeDelta());
|
| RecordCurrentHistograms();
|
| @@ -984,6 +978,10 @@ void MetricsService::PrepareInitialMetricsLog() {
|
| log_manager_.FinishCurrentLog();
|
| log_manager_.ResumePausedLog();
|
|
|
| + // Store unsent logs, including the initial log that was just saved, so
|
| + // that they're not lost in case of a crash before upload time.
|
| + log_manager_.PersistUnsentLogs();
|
| +
|
| DCHECK(!log_manager_.has_staged_log());
|
| log_manager_.StageNextLogForUpload();
|
| }
|
| @@ -1047,31 +1045,26 @@ void MetricsService::OnLogUploadComplete(int response_code) {
|
| discard_log = true;
|
| }
|
|
|
| - if (upload_succeeded || discard_log)
|
| + if (upload_succeeded || discard_log) {
|
| log_manager_.DiscardStagedLog();
|
| + // Store the updated list to disk now that the removed log is uploaded.
|
| + log_manager_.PersistUnsentLogs();
|
| + }
|
|
|
| if (!log_manager_.has_staged_log()) {
|
| switch (state_) {
|
| case SENDING_INITIAL_STABILITY_LOG:
|
| - // Store the updated list to disk now that the removed log is uploaded.
|
| - log_manager_.PersistUnsentLogs();
|
| PrepareInitialMetricsLog();
|
| SendStagedLog();
|
| state_ = SENDING_INITIAL_METRICS_LOG;
|
| break;
|
|
|
| case SENDING_INITIAL_METRICS_LOG:
|
| - // The initial metrics log never gets persisted to local state, so it's
|
| - // not necessary to call log_manager_.PersistUnsentLogs() here.
|
| - // TODO(asvitkine): It should be persisted like the initial stability
|
| - // log and old unsent logs. http://crbug.com/328417
|
| state_ = log_manager_.has_unsent_logs() ? SENDING_OLD_LOGS
|
| : SENDING_CURRENT_LOGS;
|
| break;
|
|
|
| case SENDING_OLD_LOGS:
|
| - // Store the updated list to disk now that the removed log is uploaded.
|
| - log_manager_.PersistUnsentLogs();
|
| if (!log_manager_.has_unsent_logs())
|
| state_ = SENDING_CURRENT_LOGS;
|
| break;
|
| @@ -1151,8 +1144,7 @@ void MetricsService::GetCurrentSyntheticFieldTrials(
|
| std::vector<variations::ActiveGroupId>* synthetic_trials) {
|
| DCHECK(synthetic_trials);
|
| synthetic_trials->clear();
|
| - const MetricsLog* current_log =
|
| - static_cast<const MetricsLog*>(log_manager_.current_log());
|
| + const MetricsLog* current_log = log_manager_.current_log();
|
| for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) {
|
| if (synthetic_trial_groups_[i].start_time <= current_log->creation_time())
|
| synthetic_trials->push_back(synthetic_trial_groups_[i].id);
|
|
|