Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(898)

Side by Side Diff: components/offline_pages/background/request_coordinator.cc

Issue 2301703002: [Offline Pages] Adds UMA for number of started attempts and for network connection when Unsupported… (Closed)
Patch Set: Adjusted count histogram max arg Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #include "components/offline_pages/background/request_coordinator.h" 5 #include "components/offline_pages/background/request_coordinator.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 27 matching lines...) Expand all
38 // macro adapted to allow for a dynamically suffixed histogram name. 38 // macro adapted to allow for a dynamically suffixed histogram name.
39 // Note: The factory creates and owns the histogram. 39 // Note: The factory creates and owns the histogram.
40 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( 40 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
41 histogram_name, 1, 41 histogram_name, 1,
42 static_cast<int>(Offliner::RequestStatus::STATUS_COUNT), 42 static_cast<int>(Offliner::RequestStatus::STATUS_COUNT),
43 static_cast<int>(Offliner::RequestStatus::STATUS_COUNT) + 1, 43 static_cast<int>(Offliner::RequestStatus::STATUS_COUNT) + 1,
44 base::HistogramBase::kUmaTargetedHistogramFlag); 44 base::HistogramBase::kUmaTargetedHistogramFlag);
45 histogram->Add(static_cast<int>(request_status)); 45 histogram->Add(static_cast<int>(request_status));
46 } 46 }
47 47
48 // Records the number of started attempts for completed requests (whether
49 // successful or not).
50 void RecordAttemptCount(const SavePageRequest& request,
51 RequestNotifier::SavePageStatus status) {
52 if (status == RequestNotifier::SavePageStatus::SUCCESS) {
53 // TODO(dougarnett): Also record UMA for completed attempts here.
54 UMA_HISTOGRAM_CUSTOM_COUNTS(
55 "OfflinePages.Background.RequestSuccess.StartedAttemptCount",
56 request.started_attempt_count(), 1, 10, 11);
57 } else {
58 UMA_HISTOGRAM_CUSTOM_COUNTS(
59 "OfflinePages.Background.RequestFailure.StartedAttemptCount",
60 request.started_attempt_count(), 1, 10, 11);
61 }
62 }
63
48 // This should use the same algorithm as we use for OfflinePageItem, so the IDs 64 // This should use the same algorithm as we use for OfflinePageItem, so the IDs
49 // are similar. 65 // are similar.
50 int64_t GenerateOfflineId() { 66 int64_t GenerateOfflineId() {
51 return base::RandGenerator(std::numeric_limits<int64_t>::max()) + 1; 67 return base::RandGenerator(std::numeric_limits<int64_t>::max()) + 1;
52 } 68 }
53 69
54 // In case we start processing from SavePageLater, we need a callback, but there 70 // In case we start processing from SavePageLater, we need a callback, but there
55 // is nothing for it to do. 71 // is nothing for it to do.
56 void EmptySchedulerCallback(bool started) {} 72 void EmptySchedulerCallback(bool started) {}
57 73
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 128
113 void RequestCoordinator::GetQueuedRequestsCallback( 129 void RequestCoordinator::GetQueuedRequestsCallback(
114 const GetRequestsCallback& callback, 130 const GetRequestsCallback& callback,
115 RequestQueue::GetRequestsResult result, 131 RequestQueue::GetRequestsResult result,
116 const std::vector<SavePageRequest>& requests) { 132 const std::vector<SavePageRequest>& requests) {
117 callback.Run(requests); 133 callback.Run(requests);
118 } 134 }
119 135
120 void RequestCoordinator::StopPrerendering() { 136 void RequestCoordinator::StopPrerendering() {
121 if (offliner_ && is_busy_) { 137 if (offliner_ && is_busy_) {
138 DCHECK(active_request_.get());
122 offliner_->Cancel(); 139 offliner_->Cancel();
123 // Find current request and mark attempt aborted. 140 AbortRequestAttempt(active_request_.get());
124 active_request_->MarkAttemptAborted();
125 queue_->UpdateRequest(*(active_request_.get()),
126 base::Bind(&RequestCoordinator::UpdateRequestCallback,
127 weak_ptr_factory_.GetWeakPtr(),
128 active_request_->client_id()));
129 } 141 }
130 142
131 // Stopping offliner means it will not call callback. 143 // Stopping offliner means it will not call callback.
132 last_offlining_status_ = 144 last_offlining_status_ =
133 Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED; 145 Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED;
134 146
135 if (active_request_) { 147 if (active_request_) {
136 RecordOfflinerResultUMA(active_request_->client_id(), 148 RecordOfflinerResultUMA(active_request_->client_id(),
137 last_offlining_status_); 149 last_offlining_status_);
138 is_busy_ = false; 150 is_busy_ = false;
(...skipping 11 matching lines...) Expand all
150 if (request_ids.end() != std::find(request_ids.begin(), request_ids.end(), 162 if (request_ids.end() != std::find(request_ids.begin(), request_ids.end(),
151 active_request_->request_id())) { 163 active_request_->request_id())) {
152 StopPrerendering(); 164 StopPrerendering();
153 return true; 165 return true;
154 } 166 }
155 } 167 }
156 168
157 return false; 169 return false;
158 } 170 }
159 171
172 void RequestCoordinator::AbortRequestAttempt(SavePageRequest* request) {
173 request->MarkAttemptAborted();
174 if (request->started_attempt_count() >= policy_->GetMaxStartedTries()) {
175 RemoveAttemptedRequest(*request, SavePageStatus::START_COUNT_EXCEEDED);
176 } else {
177 queue_->UpdateRequest(
178 *request,
179 base::Bind(&RequestCoordinator::UpdateRequestCallback,
180 weak_ptr_factory_.GetWeakPtr(), request->client_id()));
181 }
182 }
183
184 void RequestCoordinator::RemoveAttemptedRequest(const SavePageRequest& request,
185 SavePageStatus status) {
186 std::vector<int64_t> remove_requests;
187 remove_requests.push_back(request.request_id());
188 queue_->RemoveRequests(remove_requests,
189 base::Bind(&RequestCoordinator::HandleRemovedRequests,
190 weak_ptr_factory_.GetWeakPtr(), status));
191 RecordAttemptCount(request, status);
192 }
193
160 void RequestCoordinator::RemoveRequests( 194 void RequestCoordinator::RemoveRequests(
161 const std::vector<int64_t>& request_ids, 195 const std::vector<int64_t>& request_ids,
162 const RemoveRequestsCallback& callback) { 196 const RemoveRequestsCallback& callback) {
163 bool canceled = CancelActiveRequestIfItMatches(request_ids); 197 bool canceled = CancelActiveRequestIfItMatches(request_ids);
164 queue_->RemoveRequests( 198 queue_->RemoveRequests(
165 request_ids, 199 request_ids,
166 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback, 200 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback,
167 weak_ptr_factory_.GetWeakPtr(), callback, 201 weak_ptr_factory_.GetWeakPtr(), callback,
168 SavePageStatus::REMOVED)); 202 SavePageStatus::REMOVED));
169 if (canceled) 203 if (canceled)
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 439
406 is_busy_ = false; 440 is_busy_ = false;
407 active_request_.reset(nullptr); 441 active_request_.reset(nullptr);
408 442
409 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED || 443 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED ||
410 status == Offliner::RequestStatus::PRERENDERING_CANCELED) { 444 status == Offliner::RequestStatus::PRERENDERING_CANCELED) {
411 // Update the request for the canceled attempt. 445 // Update the request for the canceled attempt.
412 // TODO(dougarnett): See if we can conclusively identify other attempt 446 // TODO(dougarnett): See if we can conclusively identify other attempt
413 // aborted cases to treat this way (eg, for Render Process Killed). 447 // aborted cases to treat this way (eg, for Render Process Killed).
414 SavePageRequest updated_request(request); 448 SavePageRequest updated_request(request);
415 updated_request.MarkAttemptAborted(); 449 AbortRequestAttempt(&updated_request);
416 queue_->UpdateRequest(updated_request,
417 base::Bind(&RequestCoordinator::UpdateRequestCallback,
418 weak_ptr_factory_.GetWeakPtr(),
419 updated_request.client_id()));
420 SavePageStatus notify_status = 450 SavePageStatus notify_status =
421 (status == Offliner::RequestStatus::FOREGROUND_CANCELED) 451 (status == Offliner::RequestStatus::FOREGROUND_CANCELED)
422 ? SavePageStatus::FOREGROUND_CANCELED 452 ? SavePageStatus::FOREGROUND_CANCELED
423 : SavePageStatus::PRERENDER_CANCELED; 453 : SavePageStatus::PRERENDER_CANCELED;
424 NotifyCompleted(updated_request, notify_status); 454 NotifyCompleted(updated_request, notify_status);
425
426 } else if (status == Offliner::RequestStatus::SAVED) { 455 } else if (status == Offliner::RequestStatus::SAVED) {
427 // Remove the request from the queue if it succeeded. 456 // Remove the request from the queue if it succeeded.
428 std::vector<int64_t> remove_requests; 457 RemoveAttemptedRequest(request, SavePageStatus::SUCCESS);
429 remove_requests.push_back(request.request_id());
430 queue_->RemoveRequests(
431 remove_requests,
432 base::Bind(&RequestCoordinator::HandleRemovedRequests,
433 weak_ptr_factory_.GetWeakPtr(), SavePageStatus::SUCCESS));
434 } else if (request.completed_attempt_count() + 1 >= 458 } else if (request.completed_attempt_count() + 1 >=
435 policy_->GetMaxCompletedTries()) { 459 policy_->GetMaxCompletedTries()) {
436 // Remove from the request queue if we exceeeded max retries. The +1 460 // Remove from the request queue if we exceeded max retries. The +1
437 // represents the request that just completed. Since we call 461 // represents the request that just completed. Since we call
438 // MarkAttemptCompleted within the if branches, the completed_attempt_count 462 // MarkAttemptCompleted within the if branches, the completed_attempt_count
439 // has not yet been updated when we are checking the if condition. 463 // has not yet been updated when we are checking the if condition.
440 std::vector<int64_t> remove_requests; 464 RemoveAttemptedRequest(request, SavePageStatus::RETRY_COUNT_EXCEEDED);
441 remove_requests.push_back(request.request_id());
442 queue_->RemoveRequests(
443 remove_requests, base::Bind(&RequestCoordinator::HandleRemovedRequests,
444 weak_ptr_factory_.GetWeakPtr(),
445 SavePageStatus::RETRY_COUNT_EXCEEDED));
446 } else { 465 } else {
447 // If we failed, but are not over the limit, update the request in the 466 // If we failed, but are not over the limit, update the request in the
448 // queue. 467 // queue.
449 SavePageRequest updated_request(request); 468 SavePageRequest updated_request(request);
450 updated_request.MarkAttemptCompleted(); 469 updated_request.MarkAttemptCompleted();
451 queue_->UpdateRequest(updated_request, 470 queue_->UpdateRequest(updated_request,
452 base::Bind(&RequestCoordinator::UpdateRequestCallback, 471 base::Bind(&RequestCoordinator::UpdateRequestCallback,
453 weak_ptr_factory_.GetWeakPtr(), 472 weak_ptr_factory_.GetWeakPtr(),
454 updated_request.client_id())); 473 updated_request.client_id()));
455 NotifyChanged(updated_request); 474 NotifyChanged(updated_request);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); 529 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request));
511 } 530 }
512 531
513 void RequestCoordinator::GetOffliner() { 532 void RequestCoordinator::GetOffliner() {
514 if (!offliner_) { 533 if (!offliner_) {
515 offliner_ = factory_->GetOffliner(policy_.get()); 534 offliner_ = factory_->GetOffliner(policy_.get());
516 } 535 }
517 } 536 }
518 537
519 } // namespace offline_pages 538 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/background/request_coordinator.h ('k') | components/offline_pages/background/request_notifier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698