OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // ReportingService handles uploading serialized logs to a server. | 5 // ReportingService handles uploading serialized logs to a server. |
6 | 6 |
7 #include "components/metrics/reporting_service.h" | 7 #include "components/metrics/reporting_service.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 114 } |
115 if (!log_store()->has_staged_log()) | 115 if (!log_store()->has_staged_log()) |
116 log_store()->StageNextLog(); | 116 log_store()->StageNextLog(); |
117 | 117 |
118 // Proceed to stage the log for upload if log size satisfies cellular log | 118 // Proceed to stage the log for upload if log size satisfies cellular log |
119 // upload constrains. | 119 // upload constrains. |
120 bool upload_canceled = false; | 120 bool upload_canceled = false; |
121 bool is_cellular_logic = client_->IsUMACellularUploadLogicEnabled(); | 121 bool is_cellular_logic = client_->IsUMACellularUploadLogicEnabled(); |
122 if (is_cellular_logic && data_use_tracker_ && | 122 if (is_cellular_logic && data_use_tracker_ && |
123 !data_use_tracker_->ShouldUploadLogOnCellular( | 123 !data_use_tracker_->ShouldUploadLogOnCellular( |
124 log_store()->staged_log_hash().size())) { | 124 log_store()->staged_log_hash().size(), service_type())) { |
125 upload_scheduler_->UploadOverDataUsageCap(); | 125 upload_scheduler_->UploadOverDataUsageCap(); |
126 upload_canceled = true; | 126 upload_canceled = true; |
127 } else { | 127 } else { |
128 SendStagedLog(); | 128 SendStagedLog(); |
129 } | 129 } |
130 if (is_cellular_logic) { | 130 if (is_cellular_logic) { |
131 LogCellularConstraint(upload_canceled); | 131 LogCellularConstraint(upload_canceled); |
132 } | 132 } |
133 } | 133 } |
134 | 134 |
(...skipping 23 matching lines...) Expand all Loading... |
158 DVLOG(1) << "OnLogUploadComplete:" << response_code; | 158 DVLOG(1) << "OnLogUploadComplete:" << response_code; |
159 DCHECK(thread_checker_.CalledOnValidThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
160 DCHECK(log_upload_in_progress_); | 160 DCHECK(log_upload_in_progress_); |
161 log_upload_in_progress_ = false; | 161 log_upload_in_progress_ = false; |
162 | 162 |
163 // Log a histogram to track response success vs. failure rates. | 163 // Log a histogram to track response success vs. failure rates. |
164 LogResponseCode(response_code); | 164 LogResponseCode(response_code); |
165 | 165 |
166 bool upload_succeeded = response_code == 200; | 166 bool upload_succeeded = response_code == 200; |
167 | 167 |
168 // Provide boolean for error recovery (allow us to ignore response_code). | 168 // Staged log could have been removed already (such as by Purge() in some |
169 bool discard_log = false; | 169 // implementations), otherwise we may remove it here. |
170 const size_t log_size = log_store()->staged_log().length(); | 170 if (log_store()->has_staged_log()) { |
171 if (upload_succeeded) { | 171 // Provide boolean for error recovery (allow us to ignore response_code). |
172 LogSuccess(log_size); | 172 bool discard_log = false; |
173 } else if (log_size > max_retransmit_size_) { | 173 const size_t log_size = log_store()->staged_log().length(); |
174 LogLargeRejection(log_size); | 174 if (upload_succeeded) { |
175 discard_log = true; | 175 LogSuccess(log_size); |
176 } else if (response_code == 400) { | 176 } else if (log_size > max_retransmit_size_) { |
177 // Bad syntax. Retransmission won't work. | 177 LogLargeRejection(log_size); |
178 discard_log = true; | 178 discard_log = true; |
179 } | 179 } else if (response_code == 400) { |
| 180 // Bad syntax. Retransmission won't work. |
| 181 discard_log = true; |
| 182 } |
180 | 183 |
181 if (upload_succeeded || discard_log) { | 184 if (upload_succeeded || discard_log) { |
182 log_store()->DiscardStagedLog(); | 185 log_store()->DiscardStagedLog(); |
183 // Store the updated list to disk now that the removed log is uploaded. | 186 // Store the updated list to disk now that the removed log is uploaded. |
184 log_store()->PersistUnsentLogs(); | 187 log_store()->PersistUnsentLogs(); |
| 188 } |
185 } | 189 } |
186 | 190 |
187 // Error 400 indicates a problem with the log, not with the server, so | 191 // Error 400 indicates a problem with the log, not with the server, so |
188 // don't consider that a sign that the server is in trouble. | 192 // don't consider that a sign that the server is in trouble. |
189 bool server_is_healthy = upload_succeeded || response_code == 400; | 193 bool server_is_healthy = upload_succeeded || response_code == 400; |
190 if (!log_store()->has_unsent_logs()) { | 194 if (!log_store()->has_unsent_logs()) { |
191 DVLOG(1) << "Stopping upload_scheduler_."; | 195 DVLOG(1) << "Stopping upload_scheduler_."; |
192 upload_scheduler_->Stop(); | 196 upload_scheduler_->Stop(); |
193 } | 197 } |
194 upload_scheduler_->UploadFinished(server_is_healthy); | 198 upload_scheduler_->UploadFinished(server_is_healthy); |
195 } | 199 } |
196 | 200 |
197 } // namespace metrics | 201 } // namespace metrics |
OLD | NEW |