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

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

Issue 2282973003: [OfflinePages] Resuming a SavePageRequest now may start processing if network is connected. (Closed)
Patch Set: Added TODO for double loop Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/offline_pages/background/request_coordinator.h" 5 #include "components/offline_pages/background/request_coordinator.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 return net::NetworkChangeNotifier::GetConnectionType(); 200 return net::NetworkChangeNotifier::GetConnectionType();
201 } 201 }
202 202
203 void RequestCoordinator::AddRequestResultCallback( 203 void RequestCoordinator::AddRequestResultCallback(
204 RequestQueue::AddRequestResult result, 204 RequestQueue::AddRequestResult result,
205 const SavePageRequest& request) { 205 const SavePageRequest& request) {
206 NotifyAdded(request); 206 NotifyAdded(request);
207 // Inform the scheduler that we have an outstanding task.. 207 // Inform the scheduler that we have an outstanding task..
208 scheduler_->Schedule(GetTriggerConditionsForUserRequest()); 208 scheduler_->Schedule(GetTriggerConditionsForUserRequest());
209 209
210 // If it makes sense, start processing now. 210 if (request.user_requested())
211 if (is_busy_) return; 211 StartProcessingIfConnected();
212
213 // Check for network
214 net::NetworkChangeNotifier::ConnectionType connection = GetConnectionType();
215
216 if ((connection !=
217 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE) &&
218 request.user_requested()) {
219 // Create device conditions.
220 DeviceConditions device_conditions(false, 0, connection);
221
222 // Start processing if it makes sense. (net, user requested)
223 StartProcessing(device_conditions, base::Bind(&EmptySchedulerCallback));
224 }
225 } 212 }
226 213
227 // Called in response to updating a request in the request queue. 214 // Called in response to updating a request in the request queue.
228 void RequestCoordinator::UpdateRequestCallback( 215 void RequestCoordinator::UpdateRequestCallback(
229 const ClientId& client_id, 216 const ClientId& client_id,
230 RequestQueue::UpdateRequestResult result) { 217 RequestQueue::UpdateRequestResult result) {
231 // If the request succeeded, nothing to do. If it failed, we can't really do 218 // If the request succeeded, nothing to do. If it failed, we can't really do
232 // much, so just log it. 219 // much, so just log it.
233 if (result != RequestQueue::UpdateRequestResult::SUCCESS) { 220 if (result != RequestQueue::UpdateRequestResult::SUCCESS) {
234 DVLOG(1) << "Failed to update request attempt details. " 221 DVLOG(1) << "Failed to update request attempt details. "
235 << static_cast<int>(result); 222 << static_cast<int>(result);
236 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result); 223 event_logger_.RecordUpdateRequestFailed(client_id.name_space, result);
237 } 224 }
238 } 225 }
239 226
240 // Called in response to updating multiple requests in the request queue. 227 // Called in response to updating multiple requests in the request queue.
241 void RequestCoordinator::UpdateMultipleRequestsCallback( 228 void RequestCoordinator::UpdateMultipleRequestsCallback(
242 const RequestQueue::UpdateMultipleRequestResults& results, 229 const RequestQueue::UpdateMultipleRequestResults& results,
243 const std::vector<SavePageRequest>& requests) { 230 const std::vector<SavePageRequest>& requests) {
244 for (SavePageRequest request : requests) 231 bool available_user_request = false;
232 for (SavePageRequest request : requests) {
245 NotifyChanged(request); 233 NotifyChanged(request);
234 if (!available_user_request && request.user_requested() &&
235 request.request_state() == SavePageRequest::RequestState::AVAILABLE) {
236 // TODO(dougarnett): Consider avoiding prospect of N^2 in case
237 // size of bulk requests can get large (perhaps with easier to consume
238 // callback interface).
239 for (std::pair<int64_t, RequestQueue::UpdateRequestResult> pair :
240 results) {
241 if (pair.first == request.request_id() &&
242 pair.second == RequestQueue::UpdateRequestResult::SUCCESS) {
243 // We have a successfully updated, available, user request.
244 available_user_request = true;
245 }
246 }
247 }
248 }
249
250 if (available_user_request)
251 StartProcessingIfConnected();
246 } 252 }
247 253
248 void RequestCoordinator::HandleRemovedRequestsAndCallback( 254 void RequestCoordinator::HandleRemovedRequestsAndCallback(
249 const RemoveRequestsCallback& callback, 255 const RemoveRequestsCallback& callback,
250 SavePageStatus status, 256 SavePageStatus status,
251 const RequestQueue::UpdateMultipleRequestResults& results, 257 const RequestQueue::UpdateMultipleRequestResults& results,
252 const std::vector<SavePageRequest>& requests) { 258 const std::vector<SavePageRequest>& requests) {
253 callback.Run(results); 259 callback.Run(results);
254 HandleRemovedRequests(status, results, requests); 260 HandleRemovedRequests(status, results, requests);
255 } 261 }
(...skipping 27 matching lines...) Expand all
283 operation_start_time_ = base::Time::Now(); 289 operation_start_time_ = base::Time::Now();
284 290
285 is_stopped_ = false; 291 is_stopped_ = false;
286 scheduler_callback_ = callback; 292 scheduler_callback_ = callback;
287 293
288 TryNextRequest(); 294 TryNextRequest();
289 295
290 return true; 296 return true;
291 } 297 }
292 298
299 void RequestCoordinator::StartProcessingIfConnected() {
300 // Makes sure not already busy processing.
301 if (is_busy_) return;
302
303 // Check for network connectivity.
304 net::NetworkChangeNotifier::ConnectionType connection = GetConnectionType();
305
306 if ((connection !=
307 net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE)) {
308 // Create conservative device conditions for the connectivity
309 // (assume no battery).
310 DeviceConditions device_conditions(false, 0, connection);
311 StartProcessing(device_conditions, base::Bind(&EmptySchedulerCallback));
312 }
313 }
314
293 void RequestCoordinator::TryNextRequest() { 315 void RequestCoordinator::TryNextRequest() {
294 // If there is no time left in the budget, return to the scheduler. 316 // If there is no time left in the budget, return to the scheduler.
295 // We do not remove the pending task that was set up earlier in case 317 // We do not remove the pending task that was set up earlier in case
296 // we run out of time, so the background scheduler will return to us 318 // we run out of time, so the background scheduler will return to us
297 // at the next opportunity to run background tasks. 319 // at the next opportunity to run background tasks.
298 if (base::Time::Now() - operation_start_time_ > 320 if (base::Time::Now() - operation_start_time_ >
299 base::TimeDelta::FromSeconds( 321 base::TimeDelta::FromSeconds(
300 policy_->GetBackgroundProcessingTimeBudgetSeconds())) { 322 policy_->GetBackgroundProcessingTimeBudgetSeconds())) {
301 // Let the scheduler know we are done processing. 323 // Let the scheduler know we are done processing.
302 scheduler_callback_.Run(true); 324 scheduler_callback_.Run(true);
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request)); 505 FOR_EACH_OBSERVER(Observer, observers_, OnChanged(request));
484 } 506 }
485 507
486 void RequestCoordinator::GetOffliner() { 508 void RequestCoordinator::GetOffliner() {
487 if (!offliner_) { 509 if (!offliner_) {
488 offliner_ = factory_->GetOffliner(policy_.get()); 510 offliner_ = factory_->GetOffliner(policy_.get());
489 } 511 }
490 } 512 }
491 513
492 } // namespace offline_pages 514 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698