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

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

Issue 2473553004: Request Picker task (Closed)
Patch Set: Rename queue_status.h to request_queue_status.h 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(SavePageRequest* request) { 305 void RequestCoordinator::AbortRequestAttempt(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, nothing to do. If it failed, we can't really do 336 // If the request succeeded, nothing to do. If it failed, we can't really do
337 // much, so just log it. 337 // much, so just log it.
338 if (!IsSingleSuccessResult(result.get())) { 338 if (!IsSingleSuccessResult(result.get())) {
339 DVLOG(1) << "Failed to mark request aborted: " << request_id; 339 DVLOG(1) << "Failed to mark request aborted: " << request_id;
340 RequestQueue::UpdateRequestResult request_result = 340 UpdateRequestResult request_result =
341 result->store_state != StoreState::LOADED 341 result->store_state != StoreState::LOADED
342 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 342 ? UpdateRequestResult::STORE_FAILURE
343 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 343 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
344 event_logger_.RecordUpdateRequestFailed(client_id.name_space, 344 event_logger_.RecordUpdateRequestFailed(client_id.name_space,
345 request_result); 345 request_result);
346 } 346 }
347 } 347 }
348 348
349 void RequestCoordinator::RemoveRequests( 349 void RequestCoordinator::RemoveRequests(
350 const std::vector<int64_t>& request_ids, 350 const std::vector<int64_t>& request_ids,
351 const RemoveRequestsCallback& callback) { 351 const RemoveRequestsCallback& callback) {
352 bool canceled = CancelActiveRequestIfItMatches(request_ids); 352 bool canceled = CancelActiveRequestIfItMatches(request_ids);
353 queue_->RemoveRequests( 353 queue_->RemoveRequests(
354 request_ids, 354 request_ids,
355 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback, 355 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback,
356 weak_ptr_factory_.GetWeakPtr(), callback, 356 weak_ptr_factory_.GetWeakPtr(), callback,
357 BackgroundSavePageResult::REMOVED)); 357 RequestNotifier::BackgroundSavePageResult::REMOVED));
358 358
359 // Record the network quality when this request is made. 359 // Record the network quality when this request is made.
360 if (network_quality_estimator_) { 360 if (network_quality_estimator_) {
361 UMA_HISTOGRAM_ENUMERATION( 361 UMA_HISTOGRAM_ENUMERATION(
362 "OfflinePages.Background.EffectiveConnectionType.RemoveRequests", 362 "OfflinePages.Background.EffectiveConnectionType.RemoveRequests",
363 network_quality_estimator_->GetEffectiveConnectionType(), 363 network_quality_estimator_->GetEffectiveConnectionType(),
364 net::EFFECTIVE_CONNECTION_TYPE_LAST); 364 net::EFFECTIVE_CONNECTION_TYPE_LAST);
365 } 365 }
366 366
367 if (canceled) 367 if (canceled)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 net::NetworkChangeNotifier::ConnectionType 410 net::NetworkChangeNotifier::ConnectionType
411 RequestCoordinator::GetConnectionType() { 411 RequestCoordinator::GetConnectionType() {
412 // If we have a connection type set for test, use that. 412 // If we have a connection type set for test, use that.
413 if (use_test_connection_type_) 413 if (use_test_connection_type_)
414 return test_connection_type_; 414 return test_connection_type_;
415 415
416 return net::NetworkChangeNotifier::GetConnectionType(); 416 return net::NetworkChangeNotifier::GetConnectionType();
417 } 417 }
418 418
419 void RequestCoordinator::AddRequestResultCallback( 419 void RequestCoordinator::AddRequestResultCallback(
420 RequestQueue::AddRequestResult result, 420 AddRequestResult result,
421 const SavePageRequest& request) { 421 const SavePageRequest& request) {
422 NotifyAdded(request); 422 NotifyAdded(request);
423 // Inform the scheduler that we have an outstanding task. 423 // Inform the scheduler that we have an outstanding task.
424 scheduler_->Schedule(GetTriggerConditions(kUserRequest)); 424 scheduler_->Schedule(GetTriggerConditions(kUserRequest));
425 425
426 if (request.user_requested()) 426 if (request.user_requested())
427 StartImmediatelyIfConnected(); 427 StartImmediatelyIfConnected();
428 } 428 }
429 429
430 void RequestCoordinator::MarkAttemptCompletedDoneCallback( 430 void RequestCoordinator::MarkAttemptCompletedDoneCallback(
431 int64_t request_id, 431 int64_t request_id,
432 const ClientId& client_id, 432 const ClientId& client_id,
433 std::unique_ptr<UpdateRequestsResult> result) { 433 std::unique_ptr<UpdateRequestsResult> result) {
434 if (IsSingleSuccessResult(result.get())) { 434 if (IsSingleSuccessResult(result.get())) {
435 NotifyChanged(result->updated_items.at(0)); 435 NotifyChanged(result->updated_items.at(0));
436 } else { 436 } else {
437 DVLOG(1) << "Failed to mark request completed " << request_id; 437 DVLOG(1) << "Failed to mark request completed " << request_id;
438 RequestQueue::UpdateRequestResult request_result = 438 UpdateRequestResult request_result =
439 result->store_state != StoreState::LOADED 439 result->store_state != StoreState::LOADED
440 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 440 ? UpdateRequestResult::STORE_FAILURE
441 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 441 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
442 event_logger_.RecordUpdateRequestFailed(client_id.name_space, 442 event_logger_.RecordUpdateRequestFailed(client_id.name_space,
443 request_result); 443 request_result);
444 } 444 }
445 } 445 }
446 446
447 void RequestCoordinator::UpdateMultipleRequestsCallback( 447 void RequestCoordinator::UpdateMultipleRequestsCallback(
448 std::unique_ptr<UpdateRequestsResult> result) { 448 std::unique_ptr<UpdateRequestsResult> result) {
449 for (const auto& request : result->updated_items) 449 for (const auto& request : result->updated_items)
450 NotifyChanged(request); 450 NotifyChanged(request);
451 451
(...skipping 11 matching lines...) Expand all
463 463
464 // When we successfully remove a request that completed successfully, move on to 464 // When we successfully remove a request that completed successfully, move on to
465 // the next request. 465 // the next request.
466 void RequestCoordinator::CompletedRequestCallback( 466 void RequestCoordinator::CompletedRequestCallback(
467 const MultipleItemStatuses& status) { 467 const MultipleItemStatuses& status) {
468 TryNextRequest(); 468 TryNextRequest();
469 } 469 }
470 470
471 void RequestCoordinator::HandleRemovedRequestsAndCallback( 471 void RequestCoordinator::HandleRemovedRequestsAndCallback(
472 const RemoveRequestsCallback& callback, 472 const RemoveRequestsCallback& callback,
473 BackgroundSavePageResult status, 473 RequestNotifier::BackgroundSavePageResult status,
474 std::unique_ptr<UpdateRequestsResult> result) { 474 std::unique_ptr<UpdateRequestsResult> result) {
475 // TODO(dougarnett): Define status code for user/api cancel and use here 475 // TODO(dougarnett): Define status code for user/api cancel and use here
476 // to determine whether to record cancel time UMA. 476 // to determine whether to record cancel time UMA.
477 for (const auto& request : result->updated_items) 477 for (const auto& request : result->updated_items)
478 RecordCancelTimeUMA(request); 478 RecordCancelTimeUMA(request);
479 callback.Run(result->item_statuses); 479 callback.Run(result->item_statuses);
480 HandleRemovedRequests(status, std::move(result)); 480 HandleRemovedRequests(status, std::move(result));
481 } 481 }
482 482
483 void RequestCoordinator::HandleRemovedRequests( 483 void RequestCoordinator::HandleRemovedRequests(
484 BackgroundSavePageResult status, 484 RequestNotifier::BackgroundSavePageResult status,
485 std::unique_ptr<UpdateRequestsResult> result) { 485 std::unique_ptr<UpdateRequestsResult> result) {
486 for (const auto& request : result->updated_items) 486 for (const auto& request : result->updated_items)
487 NotifyCompleted(request, status); 487 NotifyCompleted(request, status);
488 } 488 }
489 489
490 void RequestCoordinator::ScheduleAsNeeded() { 490 void RequestCoordinator::ScheduleAsNeeded() {
491 // Get all requests from queue (there is no filtering mechanism). 491 // Get all requests from queue (there is no filtering mechanism).
492 queue_->GetRequests( 492 queue_->GetRequests(
493 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback, 493 base::Bind(&RequestCoordinator::GetRequestsForSchedulingCallback,
494 weak_ptr_factory_.GetWeakPtr())); 494 weak_ptr_factory_.GetWeakPtr()));
(...skipping 10 matching lines...) Expand all
505 505
506 void RequestCoordinator::HandleWatchdogTimeout() { 506 void RequestCoordinator::HandleWatchdogTimeout() {
507 StopProcessing(Offliner::REQUEST_COORDINATOR_TIMED_OUT); 507 StopProcessing(Offliner::REQUEST_COORDINATOR_TIMED_OUT);
508 } 508 }
509 509
510 // Returns true if the caller should expect a callback, false otherwise. For 510 // Returns true if the caller should expect a callback, false otherwise. For
511 // instance, this would return false if a request is already in progress. 511 // instance, this would return false if a request is already in progress.
512 bool RequestCoordinator::StartProcessing( 512 bool RequestCoordinator::StartProcessing(
513 const DeviceConditions& device_conditions, 513 const DeviceConditions& device_conditions,
514 const base::Callback<void(bool)>& callback) { 514 const base::Callback<void(bool)>& callback) {
515 DVLOG(2) << "Scheduled " << __func__;
515 return StartProcessingInternal(ProcessingWindowState::SCHEDULED_WINDOW, 516 return StartProcessingInternal(ProcessingWindowState::SCHEDULED_WINDOW,
516 device_conditions, callback); 517 device_conditions, callback);
517 } 518 }
518 519
519 bool RequestCoordinator::StartProcessingInternal( 520 bool RequestCoordinator::StartProcessingInternal(
520 const ProcessingWindowState processing_state, 521 const ProcessingWindowState processing_state,
521 const DeviceConditions& device_conditions, 522 const DeviceConditions& device_conditions,
522 const base::Callback<void(bool)>& callback) { 523 const base::Callback<void(bool)>& callback) {
523 current_conditions_.reset(new DeviceConditions(device_conditions)); 524 current_conditions_.reset(new DeviceConditions(device_conditions));
524 if (is_starting_ || is_busy_) 525 if (is_starting_ || is_busy_)
(...skipping 12 matching lines...) Expand all
537 538
538 void RequestCoordinator::StartImmediatelyIfConnected() { 539 void RequestCoordinator::StartImmediatelyIfConnected() {
539 OfflinerImmediateStartStatus immediate_start_status = TryImmediateStart(); 540 OfflinerImmediateStartStatus immediate_start_status = TryImmediateStart();
540 UMA_HISTOGRAM_ENUMERATION( 541 UMA_HISTOGRAM_ENUMERATION(
541 "OfflinePages.Background.ImmediateStartStatus", immediate_start_status, 542 "OfflinePages.Background.ImmediateStartStatus", immediate_start_status,
542 RequestCoordinator::OfflinerImmediateStartStatus::STATUS_COUNT); 543 RequestCoordinator::OfflinerImmediateStartStatus::STATUS_COUNT);
543 } 544 }
544 545
545 RequestCoordinator::OfflinerImmediateStartStatus 546 RequestCoordinator::OfflinerImmediateStartStatus
546 RequestCoordinator::TryImmediateStart() { 547 RequestCoordinator::TryImmediateStart() {
548 DVLOG(2) << "Immediate " << __func__;
547 // Make sure not already busy processing. 549 // Make sure not already busy processing.
548 if (is_busy_) 550 if (is_busy_)
549 return OfflinerImmediateStartStatus::BUSY; 551 return OfflinerImmediateStartStatus::BUSY;
550 552
551 // Make sure we are not on svelte device to start immediately. 553 // Make sure we are not on svelte device to start immediately.
552 if (is_low_end_device_) { 554 if (is_low_end_device_) {
553 DVLOG(2) << "low end device, returning"; 555 DVLOG(2) << "low end device, returning";
554 // Let the scheduler know we are done processing and failed due to svelte. 556 // Let the scheduler know we are done processing and failed due to svelte.
555 immediate_schedule_callback_.Run(false); 557 immediate_schedule_callback_.Run(false);
556 return OfflinerImmediateStartStatus::NOT_STARTED_ON_SVELTE; 558 return OfflinerImmediateStartStatus::NOT_STARTED_ON_SVELTE;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 is_starting_ = false; 596 is_starting_ = false;
595 597
596 // Let the scheduler know we are done processing. 598 // Let the scheduler know we are done processing.
597 // TODO: Make sure the scheduler callback is valid before running it. 599 // TODO: Make sure the scheduler callback is valid before running it.
598 scheduler_callback_.Run(true); 600 scheduler_callback_.Run(true);
599 DVLOG(2) << " out of time, giving up. " << __func__; 601 DVLOG(2) << " out of time, giving up. " << __func__;
600 602
601 return; 603 return;
602 } 604 }
603 605
604 // Choose a request to process that meets the available conditions. 606 // Ask request queue to make a new PickRequestTask object, then put it on the
605 // This is an async call, and returns right away. 607 // task queue.
606 picker_->ChooseNextRequest(base::Bind(&RequestCoordinator::RequestPicked, 608 queue_->PickNextRequest(base::Bind(&RequestCoordinator::RequestPicked,
607 weak_ptr_factory_.GetWeakPtr()), 609 weak_ptr_factory_.GetWeakPtr()),
608 base::Bind(&RequestCoordinator::RequestNotPicked, 610 base::Bind(&RequestCoordinator::RequestNotPicked,
609 weak_ptr_factory_.GetWeakPtr()), 611 weak_ptr_factory_.GetWeakPtr()),
610 current_conditions_.get(), 612 *current_conditions_.get(), disabled_requests_);
611 disabled_requests_); 613 // TODO(petewil): Verify current_conditions has a good value on all calling
614 // paths. It is really more of a "last known conditions" than "current
615 // conditions". Consider having a call to Java to check the current
616 // conditions.
612 } 617 }
613 618
614 // Called by the request picker when a request has been picked. 619 // Called by the request picker when a request has been picked.
615 void RequestCoordinator::RequestPicked(const SavePageRequest& request) { 620 void RequestCoordinator::RequestPicked(const SavePageRequest& request) {
616 DVLOG(2) << request.url() << " " << __func__; 621 DVLOG(2) << request.url() << " " << __func__;
617 is_starting_ = false; 622 is_starting_ = false;
618 623
619 // Make sure we were not stopped while picking. 624 // Make sure we were not stopped while picking.
620 if (processing_state_ != ProcessingWindowState::STOPPED) { 625 if (processing_state_ != ProcessingWindowState::STOPPED) {
621 // Send the request on to the offliner. 626 // Send the request on to the offliner.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 const std::string& client_namespace, 683 const std::string& client_namespace,
679 std::unique_ptr<UpdateRequestsResult> update_result) { 684 std::unique_ptr<UpdateRequestsResult> update_result) {
680 if (update_result->store_state != StoreState::LOADED || 685 if (update_result->store_state != StoreState::LOADED ||
681 update_result->item_statuses.size() != 1 || 686 update_result->item_statuses.size() != 1 ||
682 update_result->item_statuses.at(0).first != request_id || 687 update_result->item_statuses.at(0).first != request_id ||
683 update_result->item_statuses.at(0).second != ItemActionStatus::SUCCESS) { 688 update_result->item_statuses.at(0).second != ItemActionStatus::SUCCESS) {
684 is_busy_ = false; 689 is_busy_ = false;
685 // TODO(fgorski): what is the best result? Do we create a new status? 690 // TODO(fgorski): what is the best result? Do we create a new status?
686 StopProcessing(Offliner::PRERENDERING_NOT_STARTED); 691 StopProcessing(Offliner::PRERENDERING_NOT_STARTED);
687 DVLOG(1) << "Failed to mark attempt started: " << request_id; 692 DVLOG(1) << "Failed to mark attempt started: " << request_id;
688 RequestQueue::UpdateRequestResult request_result = 693 UpdateRequestResult request_result =
689 update_result->store_state != StoreState::LOADED 694 update_result->store_state != StoreState::LOADED
690 ? RequestQueue::UpdateRequestResult::STORE_FAILURE 695 ? UpdateRequestResult::STORE_FAILURE
691 : RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; 696 : UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
692 event_logger_.RecordUpdateRequestFailed(client_namespace, request_result); 697 event_logger_.RecordUpdateRequestFailed(client_namespace, request_result);
693 return; 698 return;
694 } 699 }
695 700
696 // TODO(fgorski): Switch to request_id only, so that this value is not written 701 // TODO(fgorski): Switch to request_id only, so that this value is not written
697 // back to the store. 702 // back to the store.
698 active_request_.reset( 703 active_request_.reset(
699 new SavePageRequest(update_result->updated_items.at(0))); 704 new SavePageRequest(update_result->updated_items.at(0)));
700 705
701 // Start the load and save process in the offliner (Async). 706 // Start the load and save process in the offliner (Async).
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED || 748 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED ||
744 status == Offliner::RequestStatus::PRERENDERING_CANCELED) { 749 status == Offliner::RequestStatus::PRERENDERING_CANCELED) {
745 // Update the request for the canceled attempt. 750 // Update the request for the canceled attempt.
746 // TODO(dougarnett): See if we can conclusively identify other attempt 751 // TODO(dougarnett): See if we can conclusively identify other attempt
747 // aborted cases to treat this way (eg, for Render Process Killed). 752 // aborted cases to treat this way (eg, for Render Process Killed).
748 SavePageRequest updated_request(request); 753 SavePageRequest updated_request(request);
749 AbortRequestAttempt(&updated_request); 754 AbortRequestAttempt(&updated_request);
750 NotifyChanged(updated_request); 755 NotifyChanged(updated_request);
751 } else if (status == Offliner::RequestStatus::SAVED) { 756 } else if (status == Offliner::RequestStatus::SAVED) {
752 // Remove the request from the queue if it succeeded. 757 // Remove the request from the queue if it succeeded.
753 RemoveAttemptedRequest(request, BackgroundSavePageResult::SUCCESS); 758 RemoveAttemptedRequest(request,
759 RequestNotifier::BackgroundSavePageResult::SUCCESS);
754 } else if (status == Offliner::RequestStatus::PRERENDERING_FAILED_NO_RETRY) { 760 } else if (status == Offliner::RequestStatus::PRERENDERING_FAILED_NO_RETRY) {
755 RemoveAttemptedRequest(request, 761 RemoveAttemptedRequest(
756 BackgroundSavePageResult::PRERENDER_FAILURE); 762 request, RequestNotifier::BackgroundSavePageResult::PRERENDER_FAILURE);
757 } else if (request.completed_attempt_count() + 1 >= 763 } else if (request.completed_attempt_count() + 1 >=
758 policy_->GetMaxCompletedTries()) { 764 policy_->GetMaxCompletedTries()) {
759 // Remove from the request queue if we exceeded max retries. The +1 765 // Remove from the request queue if we exceeded max retries. The +1
760 // represents the request that just completed. Since we call 766 // represents the request that just completed. Since we call
761 // MarkAttemptCompleted within the if branches, the completed_attempt_count 767 // MarkAttemptCompleted within the if branches, the completed_attempt_count
762 // has not yet been updated when we are checking the if condition. 768 // has not yet been updated when we are checking the if condition.
763 const BackgroundSavePageResult result( 769 const RequestNotifier::BackgroundSavePageResult result(
764 BackgroundSavePageResult::RETRY_COUNT_EXCEEDED); 770 RequestNotifier::BackgroundSavePageResult::RETRY_COUNT_EXCEEDED);
765 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space, 771 event_logger_.RecordDroppedSavePageRequest(request.client_id().name_space,
766 result, request.request_id()); 772 result, request.request_id());
767 RemoveAttemptedRequest(request, result); 773 RemoveAttemptedRequest(request, result);
768 } else { 774 } else {
769 // If we failed, but are not over the limit, update the request in the 775 // If we failed, but are not over the limit, update the request in the
770 // queue. 776 // queue.
771 queue_->MarkAttemptCompleted( 777 queue_->MarkAttemptCompleted(
772 request.request_id(), 778 request.request_id(),
773 base::Bind(&RequestCoordinator::MarkAttemptCompletedDoneCallback, 779 base::Bind(&RequestCoordinator::MarkAttemptCompletedDoneCallback,
774 weak_ptr_factory_.GetWeakPtr(), request.request_id(), 780 weak_ptr_factory_.GetWeakPtr(), request.request_id(),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 818
813 void RequestCoordinator::MarkRequestCompleted(int64_t request_id) { 819 void RequestCoordinator::MarkRequestCompleted(int64_t request_id) {
814 // Since the recent tab helper might call multiple times, ignore subsequent 820 // Since the recent tab helper might call multiple times, ignore subsequent
815 // calls for a particular request_id. 821 // calls for a particular request_id.
816 if (disabled_requests_.find(request_id) == disabled_requests_.end()) 822 if (disabled_requests_.find(request_id) == disabled_requests_.end())
817 return; 823 return;
818 disabled_requests_.erase(request_id); 824 disabled_requests_.erase(request_id);
819 825
820 // Remove the request, but send out SUCCEEDED instead of removed. 826 // Remove the request, but send out SUCCEEDED instead of removed.
821 std::vector<int64_t> request_ids { request_id }; 827 std::vector<int64_t> request_ids { request_id };
822 queue_->RemoveRequests( 828 queue_->RemoveRequests(
823 request_ids, 829 request_ids,
824 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback, 830 base::Bind(&RequestCoordinator::HandleRemovedRequestsAndCallback,
825 weak_ptr_factory_.GetWeakPtr(), 831 weak_ptr_factory_.GetWeakPtr(),
826 base::Bind(&RequestCoordinator::CompletedRequestCallback, 832 base::Bind(&RequestCoordinator::CompletedRequestCallback,
827 weak_ptr_factory_.GetWeakPtr()), 833 weak_ptr_factory_.GetWeakPtr()),
828 BackgroundSavePageResult::SUCCESS)); 834 RequestNotifier::BackgroundSavePageResult::SUCCESS));
829 } 835 }
830 836
831 const Scheduler::TriggerConditions RequestCoordinator::GetTriggerConditions( 837 const Scheduler::TriggerConditions RequestCoordinator::GetTriggerConditions(
832 const bool user_requested) { 838 const bool user_requested) {
833 return Scheduler::TriggerConditions( 839 return Scheduler::TriggerConditions(
834 policy_->PowerRequired(user_requested), 840 policy_->PowerRequired(user_requested),
835 policy_->BatteryPercentageRequired(user_requested), 841 policy_->BatteryPercentageRequired(user_requested),
836 policy_->UnmeteredNetworkRequired(user_requested)); 842 policy_->UnmeteredNetworkRequired(user_requested));
837 } 843 }
838 844
839 void RequestCoordinator::AddObserver(Observer* observer) { 845 void RequestCoordinator::AddObserver(Observer* observer) {
840 DCHECK(observer); 846 DCHECK(observer);
841 observers_.AddObserver(observer); 847 observers_.AddObserver(observer);
842 } 848 }
843 849
844 void RequestCoordinator::RemoveObserver(Observer* observer) { 850 void RequestCoordinator::RemoveObserver(Observer* observer) {
845 observers_.RemoveObserver(observer); 851 observers_.RemoveObserver(observer);
846 } 852 }
847 853
848 void RequestCoordinator::NotifyAdded(const SavePageRequest& request) { 854 void RequestCoordinator::NotifyAdded(const SavePageRequest& request) {
849 for (Observer& observer : observers_) 855 for (Observer& observer : observers_)
850 observer.OnAdded(request); 856 observer.OnAdded(request);
851 } 857 }
852 858
853 void RequestCoordinator::NotifyCompleted(const SavePageRequest& request, 859 void RequestCoordinator::NotifyCompleted(
854 BackgroundSavePageResult status) { 860 const SavePageRequest& request,
861 RequestNotifier::BackgroundSavePageResult status) {
855 for (Observer& observer : observers_) 862 for (Observer& observer : observers_)
856 observer.OnCompleted(request, status); 863 observer.OnCompleted(request, status);
857 } 864 }
858 865
859 void RequestCoordinator::NotifyChanged(const SavePageRequest& request) { 866 void RequestCoordinator::NotifyChanged(const SavePageRequest& request) {
860 for (Observer& observer : observers_) 867 for (Observer& observer : observers_)
861 observer.OnChanged(request); 868 observer.OnChanged(request);
862 } 869 }
863 870
864 void RequestCoordinator::GetOffliner() { 871 void RequestCoordinator::GetOffliner() {
865 if (!offliner_) { 872 if (!offliner_) {
866 offliner_ = factory_->GetOffliner(policy_.get()); 873 offliner_ = factory_->GetOffliner(policy_.get());
867 } 874 }
868 } 875 }
869 876
870 ClientPolicyController* RequestCoordinator::GetPolicyController() { 877 ClientPolicyController* RequestCoordinator::GetPolicyController() {
871 return policy_controller_.get(); 878 return policy_controller_.get();
872 } 879 }
873 880
874 void RequestCoordinator::Shutdown() { 881 void RequestCoordinator::Shutdown() {
875 network_quality_estimator_ = nullptr; 882 network_quality_estimator_ = nullptr;
876 } 883 }
877 884
878 } // namespace offline_pages 885 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698