| Index: components/offline_pages/core/background/request_coordinator.cc
|
| diff --git a/components/offline_pages/core/background/request_coordinator.cc b/components/offline_pages/core/background/request_coordinator.cc
|
| index 8060d6af4ab0678672c381b76ee821aabf821870..e6ee9db5954ddfbf8a3b2673399f95631a9a6fde 100644
|
| --- a/components/offline_pages/core/background/request_coordinator.cc
|
| +++ b/components/offline_pages/core/background/request_coordinator.cc
|
| @@ -197,8 +197,7 @@ RequestCoordinator::RequestCoordinator(
|
| net::NetworkQualityEstimator::NetworkQualityProvider*
|
| network_quality_estimator)
|
| : is_low_end_device_(base::SysInfo::IsLowEndDevice()),
|
| - is_busy_(false),
|
| - is_starting_(false),
|
| + state_(RequestCoordinatorState::IDLE),
|
| processing_state_(ProcessingWindowState::STOPPED),
|
| use_test_device_conditions_(false),
|
| offliner_(std::move(offliner)),
|
| @@ -287,7 +286,7 @@ void RequestCoordinator::GetQueuedRequestsCallback(
|
| void RequestCoordinator::StopPrerendering(
|
| const Offliner::CancelCallback& final_callback,
|
| Offliner::RequestStatus stop_status) {
|
| - if (offliner_ && is_busy_) {
|
| + if (offliner_ && state_ == RequestCoordinatorState::OFFLINING) {
|
| DCHECK(active_request_.get());
|
| offliner_->Cancel(base::Bind(
|
| &RequestCoordinator::HandleCancelUpdateStatusCallback,
|
| @@ -555,9 +554,9 @@ void RequestCoordinator::UpdateStatusForCancel(
|
| RecordOfflinerResultUMA(active_request_->client_id(),
|
| active_request_->creation_time(),
|
| last_offlining_status_);
|
| - is_busy_ = false;
|
| active_request_.reset();
|
| }
|
| + state_ = RequestCoordinatorState::IDLE;
|
| }
|
|
|
| void RequestCoordinator::ResetActiveRequestCallback(int64_t offline_id) {
|
| @@ -624,7 +623,7 @@ bool RequestCoordinator::StartImmediateProcessing(
|
| bool RequestCoordinator::StartProcessingInternal(
|
| const ProcessingWindowState processing_state,
|
| const base::Callback<void(bool)>& callback) {
|
| - if (is_starting_ || is_busy_)
|
| + if (state_ != RequestCoordinatorState::IDLE)
|
| return false;
|
| processing_state_ = processing_state;
|
| scheduler_callback_ = callback;
|
| @@ -647,7 +646,7 @@ RequestCoordinator::TryImmediateStart(
|
| const base::Callback<void(bool)>& callback) {
|
| DVLOG(2) << "Immediate " << __func__;
|
| // Make sure not already busy processing.
|
| - if (is_busy_)
|
| + if (state_ == RequestCoordinatorState::OFFLINING)
|
| return OfflinerImmediateStartStatus::BUSY;
|
|
|
| // Make sure we are not on svelte device to start immediately.
|
| @@ -702,7 +701,7 @@ void RequestCoordinator::UpdateCurrentConditionsFromAndroid() {
|
| }
|
|
|
| void RequestCoordinator::TryNextRequest(bool is_start_of_processing) {
|
| - is_starting_ = true;
|
| + state_ = RequestCoordinatorState::PICKING;
|
|
|
| // If this is the first call, the device conditions are current, no need to
|
| // update them.
|
| @@ -737,7 +736,7 @@ void RequestCoordinator::TryNextRequest(bool is_start_of_processing) {
|
| if (connection_type ==
|
| net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE ||
|
| (base::Time::Now() - operation_start_time_) > processing_time_budget) {
|
| - is_starting_ = false;
|
| + state_ = RequestCoordinatorState::IDLE;
|
|
|
| // If we were doing immediate processing, try to start it again
|
| // when we get connected.
|
| @@ -773,10 +772,11 @@ void RequestCoordinator::TryNextRequest(bool is_start_of_processing) {
|
| void RequestCoordinator::RequestPicked(const SavePageRequest& request,
|
| bool cleanup_needed) {
|
| DVLOG(2) << request.url() << " " << __func__;
|
| - is_starting_ = false;
|
|
|
| - // Make sure we were not stopped while picking.
|
| - if (processing_state_ != ProcessingWindowState::STOPPED) {
|
| + // Make sure we were not stopped while picking, since any kind of cancel/stop
|
| + // will reset the state back to IDLE.
|
| + if (state_ == RequestCoordinatorState::PICKING) {
|
| + state_ = RequestCoordinatorState::OFFLINING;
|
| // Send the request on to the offliner.
|
| SendRequestToOffliner(request);
|
| }
|
| @@ -790,7 +790,7 @@ void RequestCoordinator::RequestNotPicked(
|
| bool non_user_requested_tasks_remaining,
|
| bool cleanup_needed) {
|
| DVLOG(2) << __func__;
|
| - is_starting_ = false;
|
| + state_ = RequestCoordinatorState::IDLE;
|
|
|
| // Clear the outstanding "safety" task in the scheduler.
|
| scheduler_->Unschedule();
|
| @@ -860,21 +860,7 @@ void RequestCoordinator::RequestCounts(bool is_start_of_processing,
|
| }
|
|
|
| void RequestCoordinator::SendRequestToOffliner(const SavePageRequest& request) {
|
| - // Check that offlining didn't get cancelled while performing some async
|
| - // steps.
|
| - if (processing_state_ == ProcessingWindowState::STOPPED)
|
| - return;
|
| -
|
| - if (!offliner_) {
|
| - // TODO(chili,petewil): We should have UMA here to track frequency of this,
|
| - // if it happens at all.
|
| - DVLOG(0) << "Offliner crashed. Cannot background offline page.";
|
| - return;
|
| - }
|
| -
|
| - DCHECK(!is_busy_);
|
| - is_busy_ = true;
|
| -
|
| + DCHECK(state_ == RequestCoordinatorState::OFFLINING);
|
| // Record start time if this is first attempt.
|
| if (request.started_attempt_count() == 0) {
|
| RecordStartTimeUMA(request);
|
| @@ -896,7 +882,7 @@ void RequestCoordinator::StartOffliner(
|
| update_result->item_statuses.size() != 1 ||
|
| update_result->item_statuses.at(0).first != request_id ||
|
| update_result->item_statuses.at(0).second != ItemActionStatus::SUCCESS) {
|
| - is_busy_ = false;
|
| + state_ = RequestCoordinatorState::IDLE;
|
| StopProcessing(Offliner::QUEUE_UPDATE_FAILED);
|
| DVLOG(1) << "Failed to mark attempt started: " << request_id;
|
| UpdateRequestResult request_result =
|
| @@ -936,7 +922,7 @@ void RequestCoordinator::StartOffliner(
|
| watchdog_timer_.Start(FROM_HERE, timeout, this,
|
| &RequestCoordinator::HandleWatchdogTimeout);
|
| } else {
|
| - is_busy_ = false;
|
| + state_ = RequestCoordinatorState::IDLE;
|
| DVLOG(0) << "Unable to start LoadAndSave";
|
| StopProcessing(Offliner::LOADING_NOT_ACCEPTED);
|
|
|
| @@ -959,7 +945,7 @@ void RequestCoordinator::OfflinerDoneCallback(const SavePageRequest& request,
|
| RecordOfflinerResultUMA(request.client_id(), request.creation_time(),
|
| last_offlining_status_);
|
| watchdog_timer_.Stop();
|
| - is_busy_ = false;
|
| + state_ = RequestCoordinatorState::IDLE;
|
| active_request_.reset(nullptr);
|
|
|
| UpdateRequestForCompletedAttempt(request, status);
|
|
|