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

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

Issue 2473553004: Request Picker task (Closed)
Patch Set: CR feedback per EStade, FGorski, and DougArnett Created 4 years, 1 month 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 <limits> 7 #include <limits>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/rand_util.h" 14 #include "base/rand_util.h"
15 #include "base/sys_info.h" 15 #include "base/sys_info.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "components/offline_pages/background/offliner_factory.h" 17 #include "components/offline_pages/background/offliner_factory.h"
18 #include "components/offline_pages/background/offliner_policy.h" 18 #include "components/offline_pages/background/offliner_policy.h"
19 #include "components/offline_pages/background/request_picker.h"
20 #include "components/offline_pages/background/save_page_request.h" 19 #include "components/offline_pages/background/save_page_request.h"
21 #include "components/offline_pages/client_policy_controller.h" 20 #include "components/offline_pages/client_policy_controller.h"
22 #include "components/offline_pages/offline_page_item.h" 21 #include "components/offline_pages/offline_page_item.h"
23 #include "components/offline_pages/offline_page_model.h" 22 #include "components/offline_pages/offline_page_model.h"
24 23
25 namespace offline_pages { 24 namespace offline_pages {
26 25
27 namespace { 26 namespace {
28 const bool kUserRequest = true; 27 const bool kUserRequest = true;
29 const int kMinDurationSeconds = 1; 28 const int kMinDurationSeconds = 1;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 queue_(std::move(queue)), 172 queue_(std::move(queue)),
174 scheduler_(std::move(scheduler)), 173 scheduler_(std::move(scheduler)),
175 policy_controller_(new ClientPolicyController()), 174 policy_controller_(new ClientPolicyController()),
176 network_quality_estimator_(network_quality_estimator), 175 network_quality_estimator_(network_quality_estimator),
177 active_request_(nullptr), 176 active_request_(nullptr),
178 last_offlining_status_(Offliner::RequestStatus::UNKNOWN), 177 last_offlining_status_(Offliner::RequestStatus::UNKNOWN),
179 scheduler_callback_(base::Bind(&EmptySchedulerCallback)), 178 scheduler_callback_(base::Bind(&EmptySchedulerCallback)),
180 immediate_schedule_callback_(base::Bind(&EmptySchedulerCallback)), 179 immediate_schedule_callback_(base::Bind(&EmptySchedulerCallback)),
181 weak_ptr_factory_(this) { 180 weak_ptr_factory_(this) {
182 DCHECK(policy_ != nullptr); 181 DCHECK(policy_ != nullptr);
183 picker_.reset( 182 std::unique_ptr<PickRequestTaskFactory> picker_factory(
184 new RequestPicker(queue_.get(), policy_.get(), this, &event_logger_)); 183 new PickRequestTaskFactory(policy_.get(), this, &event_logger_));
184 queue_->SetPickerFactory(std::move(picker_factory));
185 } 185 }
186 186
187 RequestCoordinator::~RequestCoordinator() {} 187 RequestCoordinator::~RequestCoordinator() {}
188 188
189 int64_t RequestCoordinator::SavePageLater(const GURL& url, 189 int64_t RequestCoordinator::SavePageLater(const GURL& url,
190 const ClientId& client_id, 190 const ClientId& client_id,
191 bool user_requested, 191 bool user_requested,
192 RequestAvailability availability) { 192 RequestAvailability availability) {
193 DVLOG(2) << "URL is " << url << " " << __func__; 193 DVLOG(2) << "URL is " << url << " " << __func__;
194 194
(...skipping 29 matching lines...) Expand all
224 void RequestCoordinator::GetAllRequests(const GetRequestsCallback& callback) { 224 void RequestCoordinator::GetAllRequests(const GetRequestsCallback& callback) {
225 // Get all matching requests from the request queue, send them to our 225 // Get all matching requests from the request queue, send them to our
226 // callback. We bind the namespace and callback to the front of the callback 226 // callback. We bind the namespace and callback to the front of the callback
227 // param set. 227 // param set.
228 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback, 228 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback,
229 weak_ptr_factory_.GetWeakPtr(), callback)); 229 weak_ptr_factory_.GetWeakPtr(), callback));
230 } 230 }
231 231
232 void RequestCoordinator::GetQueuedRequestsCallback( 232 void RequestCoordinator::GetQueuedRequestsCallback(
233 const GetRequestsCallback& callback, 233 const GetRequestsCallback& callback,
234 RequestQueue::GetRequestsResult result, 234 GetRequestsResult result,
235 std::vector<std::unique_ptr<SavePageRequest>> requests) { 235 std::vector<std::unique_ptr<SavePageRequest>> requests) {
236 callback.Run(std::move(requests)); 236 callback.Run(std::move(requests));
237 } 237 }
238 238
239 void RequestCoordinator::StopPrerendering(Offliner::RequestStatus stop_status) { 239 void RequestCoordinator::StopPrerendering(Offliner::RequestStatus stop_status) {
240 if (offliner_ && is_busy_) { 240 if (offliner_ && is_busy_) {
241 DCHECK(active_request_.get()); 241 DCHECK(active_request_.get());
242 offliner_->Cancel(); 242 offliner_->Cancel();
243 243
244 // If we timed out, let the offliner done callback handle it. 244 // If we timed out, let the offliner done callback handle it.
(...skipping 14 matching lines...) Expand all
259 active_request_->request_id()); 259 active_request_->request_id());
260 RecordOfflinerResultUMA(active_request_->client_id(), 260 RecordOfflinerResultUMA(active_request_->client_id(),
261 active_request_->creation_time(), 261 active_request_->creation_time(),
262 last_offlining_status_); 262 last_offlining_status_);
263 is_busy_ = false; 263 is_busy_ = false;
264 active_request_.reset(); 264 active_request_.reset();
265 } 265 }
266 } 266 }
267 267
268 void RequestCoordinator::GetRequestsForSchedulingCallback( 268 void RequestCoordinator::GetRequestsForSchedulingCallback(
269 RequestQueue::GetRequestsResult result, 269 GetRequestsResult result,
270 std::vector<std::unique_ptr<SavePageRequest>> requests) { 270 std::vector<std::unique_ptr<SavePageRequest>> requests) {
271 bool user_requested = false; 271 bool user_requested = false;
272 272
273 // Examine all requests, if we find a user requested one, we will use the less 273 // Examine all requests, if we find a user requested one, we will use the less
274 // restrictive conditions for user_requested requests. Otherwise we will use 274 // restrictive conditions for user_requested requests. Otherwise we will use
275 // the more restrictive non-user-requested conditions. 275 // the more restrictive non-user-requested conditions.
276 for (const auto& request : requests) { 276 for (const auto& request : requests) {
277 if (request->user_requested()) { 277 if (request->user_requested()) {
278 user_requested = true; 278 user_requested = true;
279 break; 279 break;
(...skipping 17 matching lines...) Expand all
297 active_request_.reset(nullptr); 297 active_request_.reset(nullptr);
298 return true; 298 return true;
299 } 299 }
300 } 300 }
301 301
302 return false; 302 return false;
303 } 303 }
304 304
305 void RequestCoordinator::AbortRequestAttempt(const SavePageRequest& request) { 305 void RequestCoordinator::AbortRequestAttempt(const SavePageRequest& request) {
306 if (request.started_attempt_count() >= policy_->GetMaxStartedTries()) { 306 if (request.started_attempt_count() >= policy_->GetMaxStartedTries()) {
307 const BackgroundSavePageResult result( 307 const RequestNotifier::BackgroundSavePageResult result(
308 BackgroundSavePageResult::START_COUNT_EXCEEDED); 308 RequestNotifier::BackgroundSavePageResult::START_COUNT_EXCEEDED);
309 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space, 309 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space,
310 result, request.request_id()); 310 result, request.request_id());
311 RemoveAttemptedRequest(request, result); 311 RemoveAttemptedRequest(request, result);
312 } else { 312 } else {
313 queue_->MarkAttemptAborted( 313 queue_->MarkAttemptAborted(
314 request.request_id(), 314 request.request_id(),
315 base::Bind(&RequestCoordinator::MarkAttemptAbortedDone, 315 base::Bind(&RequestCoordinator::MarkAttemptAbortedDone,
316 weak_ptr_factory_.GetWeakPtr(), request.request_id(), 316 weak_ptr_factory_.GetWeakPtr(), request.request_id(),
317 request.client_id())); 317 request.client_id()));
318 } 318 }
319 } 319 }
320 320
321 void RequestCoordinator::RemoveAttemptedRequest( 321 void RequestCoordinator::RemoveAttemptedRequest(
322 const SavePageRequest& request, 322 const SavePageRequest& request,
323 BackgroundSavePageResult result) { 323 RequestNotifier::BackgroundSavePageResult result) {
324 std::vector<int64_t> remove_requests; 324 std::vector<int64_t> remove_requests;
325 remove_requests.push_back(request.request_id()); 325 remove_requests.push_back(request.request_id());
326 queue_->RemoveRequests(remove_requests, 326 queue_->RemoveRequests(remove_requests,
327 base::Bind(&RequestCoordinator::HandleRemovedRequests, 327 base::Bind(&RequestCoordinator::HandleRemovedRequests,
328 weak_ptr_factory_.GetWeakPtr(), result)); 328 weak_ptr_factory_.GetWeakPtr(), result));
329 RecordAttemptCount(request, result); 329 RecordAttemptCount(request, result);
330 } 330 }
331 331
332 void RequestCoordinator::MarkAttemptAbortedDone( 332 void RequestCoordinator::MarkAttemptAbortedDone(
333 int64_t request_id, 333 int64_t request_id,
334 const ClientId& client_id, 334 const ClientId& client_id,
335 std::unique_ptr<UpdateRequestsResult> result) { 335 std::unique_ptr<UpdateRequestsResult> result) {
336 // If the request succeeded, notify observer. If it failed, we can't really 336 // If the request succeeded, notify observer. If it failed, we can't really
337 // do much, so just log it. 337 // do much, so just log it.
338 if (IsSingleSuccessResult(result.get())) { 338 if (IsSingleSuccessResult(result.get())) {
339 NotifyChanged(result->updated_items.at(0)); 339 NotifyChanged(result->updated_items.at(0));
340 } else { 340 } else {
341 DVLOG(1) << "Failed to mark request aborted: " << request_id; 341 DVLOG(1) << "Failed to mark request aborted: " << request_id;
342 RequestQueue::UpdateRequestResult request_result = 342 UpdateRequestResult request_result =
343 result->store_state != StoreState::LOADED 343 result->store_state != StoreState::LOADED
344 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 344 ? UpdateRequestResult::STORE_FAILURE
345 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 345 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
346 event_logger_.RecordUpdateRequestFailed(client_id.name_space, 346 event_logger_.RecordUpdateRequestFailed(client_id.name_space,
347 request_result); 347 request_result);
348 } 348 }
349 } 349 }
350 350
351 void RequestCoordinator::RemoveRequests( 351 void RequestCoordinator::RemoveRequests(
352 const std::vector<int64_t>& request_ids, 352 const std::vector<int64_t>& request_ids,
353 const RemoveRequestsCallback& callback) { 353 const RemoveRequestsCallback& callback) {
354 bool canceled = CancelActiveRequestIfItMatches(request_ids); 354 bool canceled = CancelActiveRequestIfItMatches(request_ids);
355 queue_->RemoveRequests( 355 queue_->RemoveRequests(
356 request_ids, 356 request_ids,
357 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback, 357 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback,
358 weak_ptr_factory_.GetWeakPtr(), callback, 358 weak_ptr_factory_.GetWeakPtr(), callback,
359 BackgroundSavePageResult::REMOVED)); 359 RequestNotifier::BackgroundSavePageResult::REMOVED));
360 360
361 // Record the network quality when this request is made. 361 // Record the network quality when this request is made.
362 if (network_quality_estimator_) { 362 if (network_quality_estimator_) {
363 UMA_HISTOGRAM_ENUMERATION( 363 UMA_HISTOGRAM_ENUMERATION(
364 "OfflinePages.Background.EffectiveConnectionType.RemoveRequests", 364 "OfflinePages.Background.EffectiveConnectionType.RemoveRequests",
365 network_quality_estimator_->GetEffectiveConnectionType(), 365 network_quality_estimator_->GetEffectiveConnectionType(),
366 net::EFFECTIVE_CONNECTION_TYPE_LAST); 366 net::EFFECTIVE_CONNECTION_TYPE_LAST);
367 } 367 }
368 368
369 if (canceled) 369 if (canceled)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 net::NetworkChangeNotifier::ConnectionType 412 net::NetworkChangeNotifier::ConnectionType
413 RequestCoordinator::GetConnectionType() { 413 RequestCoordinator::GetConnectionType() {
414 // If we have a connection type set for test, use that. 414 // If we have a connection type set for test, use that.
415 if (use_test_connection_type_) 415 if (use_test_connection_type_)
416 return test_connection_type_; 416 return test_connection_type_;
417 417
418 return net::NetworkChangeNotifier::GetConnectionType(); 418 return net::NetworkChangeNotifier::GetConnectionType();
419 } 419 }
420 420
421 void RequestCoordinator::AddRequestResultCallback( 421 void RequestCoordinator::AddRequestResultCallback(
422 RequestQueue::AddRequestResult result, 422 AddRequestResult result,
423 const SavePageRequest& request) { 423 const SavePageRequest& request) {
424 NotifyAdded(request); 424 NotifyAdded(request);
425 // Inform the scheduler that we have an outstanding task. 425 // Inform the scheduler that we have an outstanding task.
426 scheduler_->Schedule(GetTriggerConditions(kUserRequest)); 426 scheduler_->Schedule(GetTriggerConditions(kUserRequest));
427 427
428 if (request.user_requested()) 428 if (request.user_requested())
429 StartImmediatelyIfConnected(); 429 StartImmediatelyIfConnected();
430 } 430 }
431 431
432 void RequestCoordinator::MarkAttemptCompletedDoneCallback( 432 void RequestCoordinator::MarkAttemptCompletedDoneCallback(
433 int64_t request_id, 433 int64_t request_id,
434 const ClientId& client_id, 434 const ClientId& client_id,
435 std::unique_ptr<UpdateRequestsResult> result) { 435 std::unique_ptr<UpdateRequestsResult> result) {
436 if (IsSingleSuccessResult(result.get())) { 436 if (IsSingleSuccessResult(result.get())) {
437 NotifyChanged(result->updated_items.at(0)); 437 NotifyChanged(result->updated_items.at(0));
438 } else { 438 } else {
439 DVLOG(1) << "Failed to mark request completed " << request_id; 439 DVLOG(1) << "Failed to mark request completed " << request_id;
440 RequestQueue::UpdateRequestResult request_result = 440 UpdateRequestResult request_result =
441 result->store_state != StoreState::LOADED 441 result->store_state != StoreState::LOADED
442 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 442 ? UpdateRequestResult::STORE_FAILURE
443 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 443 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
444 event_logger_.RecordUpdateRequestFailed(client_id.name_space, 444 event_logger_.RecordUpdateRequestFailed(client_id.name_space,
445 request_result); 445 request_result);
446 } 446 }
447 } 447 }
448 448
449 void RequestCoordinator::UpdateMultipleRequestsCallback( 449 void RequestCoordinator::UpdateMultipleRequestsCallback(
450 std::unique_ptr<UpdateRequestsResult> result) { 450 std::unique_ptr<UpdateRequestsResult> result) {
451 for (const auto& request : result->updated_items) 451 for (const auto& request : result->updated_items)
452 NotifyChanged(request); 452 NotifyChanged(request);
453 453
(...skipping 11 matching lines...) Expand all
465 465
466 // When we successfully remove a request that completed successfully, move on to 466 // When we successfully remove a request that completed successfully, move on to
467 // the next request. 467 // the next request.
468 void RequestCoordinator::CompletedRequestCallback( 468 void RequestCoordinator::CompletedRequestCallback(
469 const MultipleItemStatuses& status) { 469 const MultipleItemStatuses& status) {
470 TryNextRequest(); 470 TryNextRequest();
471 } 471 }
472 472
473 void RequestCoordinator::HandleRemovedRequestsAndCallback( 473 void RequestCoordinator::HandleRemovedRequestsAndCallback(
474 const RemoveRequestsCallback& callback, 474 const RemoveRequestsCallback& callback,
475 BackgroundSavePageResult status, 475 RequestNotifier::BackgroundSavePageResult status,
476 std::unique_ptr<UpdateRequestsResult> result) { 476 std::unique_ptr<UpdateRequestsResult> result) {
477 // TODO(dougarnett): Define status code for user/api cancel and use here 477 // TODO(dougarnett): Define status code for user/api cancel and use here
478 // to determine whether to record cancel time UMA. 478 // to determine whether to record cancel time UMA.
479 for (const auto& request : result->updated_items) 479 for (const auto& request : result->updated_items)
480 RecordCancelTimeUMA(request); 480 RecordCancelTimeUMA(request);
481 callback.Run(result->item_statuses); 481 callback.Run(result->item_statuses);
482 HandleRemovedRequests(status, std::move(result)); 482 HandleRemovedRequests(status, std::move(result));
483 } 483 }
484 484
485 void RequestCoordinator::HandleRemovedRequests( 485 void RequestCoordinator::HandleRemovedRequests(
486 BackgroundSavePageResult status, 486 RequestNotifier::BackgroundSavePageResult status,
487 std::unique_ptr<UpdateRequestsResult> result) { 487 std::unique_ptr<UpdateRequestsResult> result) {
488 for (const auto& request : result->updated_items) 488 for (const auto& request : result->updated_items)
489 NotifyCompleted(request, status); 489 NotifyCompleted(request, status);
490 } 490 }
491 491
492 void RequestCoordinator::ScheduleAsNeeded() { 492 void RequestCoordinator::ScheduleAsNeeded() {
493 // Get all requests from queue (there is no filtering mechanism). 493 // Get all requests from queue (there is no filtering mechanism).
494 queue_->GetRequests( 494 queue_->GetRequests(
495 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback, 495 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback,
496 weak_ptr_factory_.GetWeakPtr())); 496 weak_ptr_factory_.GetWeakPtr()));
(...skipping 10 matching lines...) Expand all
507 507
508 void RequestCoordinator::HandleWatchdogTimeout() { 508 void RequestCoordinator::HandleWatchdogTimeout() {
509 StopProcessing(Offliner::REQUEST_COORDINATOR_TIMED_OUT); 509 StopProcessing(Offliner::REQUEST_COORDINATOR_TIMED_OUT);
510 } 510 }
511 511
512 // Returns true if the caller should expect a callback, false otherwise. For 512 // Returns true if the caller should expect a callback, false otherwise. For
513 // instance, this would return false if a request is already in progress. 513 // instance, this would return false if a request is already in progress.
514 bool RequestCoordinator::StartProcessing( 514 bool RequestCoordinator::StartProcessing(
515 const DeviceConditions& device_conditions, 515 const DeviceConditions& device_conditions,
516 const base::Callback<void(bool)>& callback) { 516 const base::Callback<void(bool)>& callback) {
517 DVLOG(2) << "Scheduled " << __func__;
517 return StartProcessingInternal(ProcessingWindowState::SCHEDULED_WINDOW, 518 return StartProcessingInternal(ProcessingWindowState::SCHEDULED_WINDOW,
518 device_conditions, callback); 519 device_conditions, callback);
519 } 520 }
520 521
521 bool RequestCoordinator::StartProcessingInternal( 522 bool RequestCoordinator::StartProcessingInternal(
522 const ProcessingWindowState processing_state, 523 const ProcessingWindowState processing_state,
523 const DeviceConditions& device_conditions, 524 const DeviceConditions& device_conditions,
524 const base::Callback<void(bool)>& callback) { 525 const base::Callback<void(bool)>& callback) {
525 current_conditions_.reset(new DeviceConditions(device_conditions)); 526 current_conditions_.reset(new DeviceConditions(device_conditions));
526 if (is_starting_ || is_busy_) 527 if (is_starting_ || is_busy_)
(...skipping 12 matching lines...) Expand all
539 540
540 void RequestCoordinator::StartImmediatelyIfConnected() { 541 void RequestCoordinator::StartImmediatelyIfConnected() {
541 OfflinerImmediateStartStatus immediate_start_status = TryImmediateStart(); 542 OfflinerImmediateStartStatus immediate_start_status = TryImmediateStart();
542 UMA_HISTOGRAM_ENUMERATION( 543 UMA_HISTOGRAM_ENUMERATION(
543 "OfflinePages.Background.ImmediateStartStatus", immediate_start_status, 544 "OfflinePages.Background.ImmediateStartStatus", immediate_start_status,
544 RequestCoordinator::OfflinerImmediateStartStatus::STATUS_COUNT); 545 RequestCoordinator::OfflinerImmediateStartStatus::STATUS_COUNT);
545 } 546 }
546 547
547 RequestCoordinator::OfflinerImmediateStartStatus 548 RequestCoordinator::OfflinerImmediateStartStatus
548 RequestCoordinator::TryImmediateStart() { 549 RequestCoordinator::TryImmediateStart() {
550 DVLOG(2) << "Immediate " << __func__;
549 // Make sure not already busy processing. 551 // Make sure not already busy processing.
550 if (is_busy_) 552 if (is_busy_)
551 return OfflinerImmediateStartStatus::BUSY; 553 return OfflinerImmediateStartStatus::BUSY;
552 554
553 // Make sure we are not on svelte device to start immediately. 555 // Make sure we are not on svelte device to start immediately.
554 if (is_low_end_device_) { 556 if (is_low_end_device_) {
555 DVLOG(2) << "low end device, returning"; 557 DVLOG(2) << "low end device, returning";
556 // Let the scheduler know we are done processing and failed due to svelte. 558 // Let the scheduler know we are done processing and failed due to svelte.
557 immediate_schedule_callback_.Run(false); 559 immediate_schedule_callback_.Run(false);
558 return OfflinerImmediateStartStatus::NOT_STARTED_ON_SVELTE; 560 return OfflinerImmediateStartStatus::NOT_STARTED_ON_SVELTE;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 is_starting_ = false; 598 is_starting_ = false;
597 599
598 // Let the scheduler know we are done processing. 600 // Let the scheduler know we are done processing.
599 // TODO: Make sure the scheduler callback is valid before running it. 601 // TODO: Make sure the scheduler callback is valid before running it.
600 scheduler_callback_.Run(true); 602 scheduler_callback_.Run(true);
601 DVLOG(2) << " out of time, giving up. " << __func__; 603 DVLOG(2) << " out of time, giving up. " << __func__;
602 604
603 return; 605 return;
604 } 606 }
605 607
606 // Choose a request to process that meets the available conditions. 608 // Ask request queue to make a new PickRequestTask object, then put it on the
607 // This is an async call, and returns right away. 609 // task queue.
608 picker_->ChooseNextRequest(base::Bind(&RequestCoordinator::RequestPicked, 610 queue_->PickNextRequest(base::Bind(&RequestCoordinator::RequestPicked,
609 weak_ptr_factory_.GetWeakPtr()), 611 weak_ptr_factory_.GetWeakPtr()),
610 base::Bind(&RequestCoordinator::RequestNotPicked, 612 base::Bind(&RequestCoordinator::RequestNotPicked,
611 weak_ptr_factory_.GetWeakPtr()), 613 weak_ptr_factory_.GetWeakPtr()),
612 current_conditions_.get(), 614 *current_conditions_.get(), disabled_requests_);
613 disabled_requests_); 615 // TODO(petewil): Verify current_conditions has a good value on all calling
616 // paths. It is really more of a "last known conditions" than "current
617 // conditions". Consider having a call to Java to check the current
618 // conditions.
614 } 619 }
615 620
616 // Called by the request picker when a request has been picked. 621 // Called by the request picker when a request has been picked.
617 void RequestCoordinator::RequestPicked(const SavePageRequest& request) { 622 void RequestCoordinator::RequestPicked(const SavePageRequest& request) {
618 DVLOG(2) << request.url() << " " << __func__; 623 DVLOG(2) << request.url() << " " << __func__;
619 is_starting_ = false; 624 is_starting_ = false;
620 625
621 // Make sure we were not stopped while picking. 626 // Make sure we were not stopped while picking.
622 if (processing_state_ != ProcessingWindowState::STOPPED) { 627 if (processing_state_ != ProcessingWindowState::STOPPED) {
623 // Send the request on to the offliner. 628 // Send the request on to the offliner.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 const std::string& client_namespace, 685 const std::string& client_namespace,
681 std::unique_ptr<UpdateRequestsResult> update_result) { 686 std::unique_ptr<UpdateRequestsResult> update_result) {
682 if (update_result->store_state != StoreState::LOADED || 687 if (update_result->store_state != StoreState::LOADED ||
683 update_result->item_statuses.size() != 1 || 688 update_result->item_statuses.size() != 1 ||
684 update_result->item_statuses.at(0).first != request_id || 689 update_result->item_statuses.at(0).first != request_id ||
685 update_result->item_statuses.at(0).second != ItemActionStatus::SUCCESS) { 690 update_result->item_statuses.at(0).second != ItemActionStatus::SUCCESS) {
686 is_busy_ = false; 691 is_busy_ = false;
687 // TODO(fgorski): what is the best result? Do we create a new status? 692 // TODO(fgorski): what is the best result? Do we create a new status?
688 StopProcessing(Offliner::PRERENDERING_NOT_STARTED); 693 StopProcessing(Offliner::PRERENDERING_NOT_STARTED);
689 DVLOG(1) << "Failed to mark attempt started: " << request_id; 694 DVLOG(1) << "Failed to mark attempt started: " << request_id;
690 RequestQueue::UpdateRequestResult request_result = 695 UpdateRequestResult request_result =
691 update_result->store_state != StoreState::LOADED 696 update_result->store_state != StoreState::LOADED
692 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 697 ? UpdateRequestResult::STORE_FAILURE
693 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 698 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
694 event_logger_.RecordUpdateRequestFailed(client_namespace, request_result); 699 event_logger_.RecordUpdateRequestFailed(client_namespace, request_result);
695 return; 700 return;
696 } 701 }
697 702
698 // TODO(fgorski): Switch to request_id only, so that this value is not written 703 // TODO(fgorski): Switch to request_id only, so that this value is not written
699 // back to the store. 704 // back to the store.
700 active_request_.reset( 705 active_request_.reset(
701 new SavePageRequest(update_result->updated_items.at(0))); 706 new SavePageRequest(update_result->updated_items.at(0)));
702 707
703 // Inform observer of active request. 708 // Inform observer of active request.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 active_request_.reset(nullptr); 751 active_request_.reset(nullptr);
747 752
748 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED || 753 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED ||
749 status == Offliner::RequestStatus::PRERENDERING_CANCELED) { 754 status == Offliner::RequestStatus::PRERENDERING_CANCELED) {
750 // Update the request for the canceled attempt. 755 // Update the request for the canceled attempt.
751 // TODO(dougarnett): See if we can conclusively identify other attempt 756 // TODO(dougarnett): See if we can conclusively identify other attempt
752 // aborted cases to treat this way (eg, for Render Process Killed). 757 // aborted cases to treat this way (eg, for Render Process Killed).
753 AbortRequestAttempt(request); 758 AbortRequestAttempt(request);
754 } else if (status == Offliner::RequestStatus::SAVED) { 759 } else if (status == Offliner::RequestStatus::SAVED) {
755 // Remove the request from the queue if it succeeded. 760 // Remove the request from the queue if it succeeded.
756 RemoveAttemptedRequest(request, BackgroundSavePageResult::SUCCESS); 761 RemoveAttemptedRequest(request,
762 RequestNotifier::BackgroundSavePageResult::SUCCESS);
757 } else if (status == Offliner::RequestStatus::PRERENDERING_FAILED_NO_RETRY) { 763 } else if (status == Offliner::RequestStatus::PRERENDERING_FAILED_NO_RETRY) {
758 RemoveAttemptedRequest(request, 764 RemoveAttemptedRequest(
759 BackgroundSavePageResult::PRERENDER_FAILURE); 765 request, RequestNotifier::BackgroundSavePageResult::PRERENDER_FAILURE);
760 } else if (request.completed_attempt_count() + 1 >= 766 } else if (request.completed_attempt_count() + 1 >=
761 policy_->GetMaxCompletedTries()) { 767 policy_->GetMaxCompletedTries()) {
762 // Remove from the request queue if we exceeded max retries. The +1 768 // Remove from the request queue if we exceeded max retries. The +1
763 // represents the request that just completed. Since we call 769 // represents the request that just completed. Since we call
764 // MarkAttemptCompleted within the if branches, the completed_attempt_count 770 // MarkAttemptCompleted within the if branches, the completed_attempt_count
765 // has not yet been updated when we are checking the if condition. 771 // has not yet been updated when we are checking the if condition.
766 const BackgroundSavePageResult result( 772 const RequestNotifier::BackgroundSavePageResult result(
767 BackgroundSavePageResult::RETRY_COUNT_EXCEEDED); 773 RequestNotifier::BackgroundSavePageResult::RETRY_COUNT_EXCEEDED);
768 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space, 774 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space,
769 result, request.request_id()); 775 result, request.request_id());
770 RemoveAttemptedRequest(request, result); 776 RemoveAttemptedRequest(request, result);
771 } else { 777 } else {
772 // If we failed, but are not over the limit, update the request in the 778 // If we failed, but are not over the limit, update the request in the
773 // queue. 779 // queue.
774 queue_->MarkAttemptCompleted( 780 queue_->MarkAttemptCompleted(
775 request.request_id(), 781 request.request_id(),
776 base::Bind(&RequestCoordinator::MarkAttemptCompletedDoneCallback, 782 base::Bind(&RequestCoordinator::MarkAttemptCompletedDoneCallback,
777 weak_ptr_factory_.GetWeakPtr(), request.request_id(), 783 weak_ptr_factory_.GetWeakPtr(), request.request_id(),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 void RequestCoordinator::MarkRequestCompleted(int64_t request_id) { 822 void RequestCoordinator::MarkRequestCompleted(int64_t request_id) {
817 // Since the recent tab helper might call multiple times, ignore subsequent 823 // Since the recent tab helper might call multiple times, ignore subsequent
818 // calls for a particular request_id. 824 // calls for a particular request_id.
819 if (disabled_requests_.find(request_id) == disabled_requests_.end()) 825 if (disabled_requests_.find(request_id) == disabled_requests_.end())
820 return; 826 return;
821 disabled_requests_.erase(request_id); 827 disabled_requests_.erase(request_id);
822 828
823 // Remove the request, but send out SUCCEEDED instead of removed. 829 // Remove the request, but send out SUCCEEDED instead of removed.
824 std::vector<int64_t> request_ids { request_id }; 830 std::vector<int64_t> request_ids { request_id };
825 queue_->RemoveRequests( 831 queue_->RemoveRequests(
826 request_ids, 832 request_ids,
827 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback, 833 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback,
828 weak_ptr_factory_.GetWeakPtr(), 834 weak_ptr_factory_.GetWeakPtr(),
829 base::Bind(&RequestCoordinator::CompletedRequestCallback, 835 base::Bind(&RequestCoordinator::CompletedRequestCallback,
830 weak_ptr_factory_.GetWeakPtr()), 836 weak_ptr_factory_.GetWeakPtr()),
831 BackgroundSavePageResult::SUCCESS)); 837 RequestNotifier::BackgroundSavePageResult::SUCCESS));
832 } 838 }
833 839
834 const Scheduler::TriggerConditions RequestCoordinator::GetTriggerConditions( 840 const Scheduler::TriggerConditions RequestCoordinator::GetTriggerConditions(
835 const bool user_requested) { 841 const bool user_requested) {
836 return Scheduler::TriggerConditions( 842 return Scheduler::TriggerConditions(
837 policy_->PowerRequired(user_requested), 843 policy_->PowerRequired(user_requested),
838 policy_->BatteryPercentageRequired(user_requested), 844 policy_->BatteryPercentageRequired(user_requested),
839 policy_->UnmeteredNetworkRequired(user_requested)); 845 policy_->UnmeteredNetworkRequired(user_requested));
840 } 846 }
841 847
842 void RequestCoordinator::AddObserver(Observer* observer) { 848 void RequestCoordinator::AddObserver(Observer* observer) {
843 DCHECK(observer); 849 DCHECK(observer);
844 observers_.AddObserver(observer); 850 observers_.AddObserver(observer);
845 } 851 }
846 852
847 void RequestCoordinator::RemoveObserver(Observer* observer) { 853 void RequestCoordinator::RemoveObserver(Observer* observer) {
848 observers_.RemoveObserver(observer); 854 observers_.RemoveObserver(observer);
849 } 855 }
850 856
851 void RequestCoordinator::NotifyAdded(const SavePageRequest& request) { 857 void RequestCoordinator::NotifyAdded(const SavePageRequest& request) {
852 for (Observer& observer : observers_) 858 for (Observer& observer : observers_)
853 observer.OnAdded(request); 859 observer.OnAdded(request);
854 } 860 }
855 861
856 void RequestCoordinator::NotifyCompleted(const SavePageRequest& request, 862 void RequestCoordinator::NotifyCompleted(
857 BackgroundSavePageResult status) { 863 const SavePageRequest& request,
864 RequestNotifier::BackgroundSavePageResult status) {
858 for (Observer& observer : observers_) 865 for (Observer& observer : observers_)
859 observer.OnCompleted(request, status); 866 observer.OnCompleted(request, status);
860 } 867 }
861 868
862 void RequestCoordinator::NotifyChanged(const SavePageRequest& request) { 869 void RequestCoordinator::NotifyChanged(const SavePageRequest& request) {
863 for (Observer& observer : observers_) 870 for (Observer& observer : observers_)
864 observer.OnChanged(request); 871 observer.OnChanged(request);
865 } 872 }
866 873
867 void RequestCoordinator::GetOffliner() { 874 void RequestCoordinator::GetOffliner() {
868 if (!offliner_) { 875 if (!offliner_) {
869 offliner_ = factory_->GetOffliner(policy_.get()); 876 offliner_ = factory_->GetOffliner(policy_.get());
870 } 877 }
871 } 878 }
872 879
873 ClientPolicyController* RequestCoordinator::GetPolicyController() { 880 ClientPolicyController* RequestCoordinator::GetPolicyController() {
874 return policy_controller_.get(); 881 return policy_controller_.get();
875 } 882 }
876 883
877 void RequestCoordinator::Shutdown() { 884 void RequestCoordinator::Shutdown() {
878 network_quality_estimator_ = nullptr; 885 network_quality_estimator_ = nullptr;
879 } 886 }
880 887
881 } // namespace offline_pages 888 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698