Index: components/metrics/reporting_service.cc |
diff --git a/components/metrics/reporting_service.cc b/components/metrics/reporting_service.cc |
index a541b298be8ffc829b7ba076f429ded46ffb0f29..fcff1f7f35719901baae1711ce303b4c57408182 100644 |
--- a/components/metrics/reporting_service.cc |
+++ b/components/metrics/reporting_service.cc |
@@ -121,7 +121,7 @@ void ReportingService::SendNextLog() { |
bool is_cellular_logic = client_->IsUMACellularUploadLogicEnabled(); |
if (is_cellular_logic && data_use_tracker_ && |
!data_use_tracker_->ShouldUploadLogOnCellular( |
- log_store()->staged_log_hash().size())) { |
+ log_store()->staged_log_hash().size(), service_type())) { |
upload_scheduler_->UploadOverDataUsageCap(); |
upload_canceled = true; |
} else { |
@@ -165,23 +165,27 @@ void ReportingService::OnLogUploadComplete(int response_code) { |
bool upload_succeeded = response_code == 200; |
- // Provide boolean for error recovery (allow us to ignore response_code). |
- bool discard_log = false; |
- const size_t log_size = log_store()->staged_log().length(); |
- if (upload_succeeded) { |
- LogSuccess(log_size); |
- } else if (log_size > max_retransmit_size_) { |
- LogLargeRejection(log_size); |
- discard_log = true; |
- } else if (response_code == 400) { |
- // Bad syntax. Retransmission won't work. |
- discard_log = true; |
- } |
- |
- if (upload_succeeded || discard_log) { |
- log_store()->DiscardStagedLog(); |
- // Store the updated list to disk now that the removed log is uploaded. |
- log_store()->PersistUnsentLogs(); |
+ // Staged log could have been removed already (such as by Purge() in some |
+ // implementations), otherwise we may remove it here. |
+ if (log_store()->has_staged_log()) { |
+ // Provide boolean for error recovery (allow us to ignore response_code). |
+ bool discard_log = false; |
+ const size_t log_size = log_store()->staged_log().length(); |
+ if (upload_succeeded) { |
+ LogSuccess(log_size); |
+ } else if (log_size > max_retransmit_size_) { |
+ LogLargeRejection(log_size); |
+ discard_log = true; |
+ } else if (response_code == 400) { |
+ // Bad syntax. Retransmission won't work. |
+ discard_log = true; |
+ } |
+ |
+ if (upload_succeeded || discard_log) { |
+ log_store()->DiscardStagedLog(); |
+ // Store the updated list to disk now that the removed log is uploaded. |
+ log_store()->PersistUnsentLogs(); |
+ } |
} |
// Error 400 indicates a problem with the log, not with the server, so |