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

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

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

Powered by Google App Engine
This is Rietveld 408576698