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

Side by Side Diff: components/offline_pages/core/background/pick_request_task.cc

Issue 2729763002: [Offline Pages] Pick correct request when resuming. (Closed)
Patch Set: Moving logic to pick_request_task. Created 3 years, 9 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/core/background/pick_request_task.h" 5 #include "components/offline_pages/core/background/pick_request_task.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "components/offline_pages/core/background/device_conditions.h" 10 #include "components/offline_pages/core/background/device_conditions.h"
(...skipping 17 matching lines...) Expand all
28 } // namespace 28 } // namespace
29 29
30 namespace offline_pages { 30 namespace offline_pages {
31 31
32 PickRequestTask::PickRequestTask(RequestQueueStore* store, 32 PickRequestTask::PickRequestTask(RequestQueueStore* store,
33 OfflinerPolicy* policy, 33 OfflinerPolicy* policy,
34 RequestPickedCallback picked_callback, 34 RequestPickedCallback picked_callback,
35 RequestNotPickedCallback not_picked_callback, 35 RequestNotPickedCallback not_picked_callback,
36 RequestCountCallback request_count_callback, 36 RequestCountCallback request_count_callback,
37 DeviceConditions& device_conditions, 37 DeviceConditions& device_conditions,
38 const std::set<int64_t>& disabled_requests) 38 const std::set<int64_t>& disabled_requests,
39 std::list<int64_t>& priortized_requests)
39 : store_(store), 40 : store_(store),
40 policy_(policy), 41 policy_(policy),
41 picked_callback_(picked_callback), 42 picked_callback_(picked_callback),
42 not_picked_callback_(not_picked_callback), 43 not_picked_callback_(not_picked_callback),
43 request_count_callback_(request_count_callback), 44 request_count_callback_(request_count_callback),
44 disabled_requests_(disabled_requests), 45 disabled_requests_(disabled_requests),
46 priortized_requests_(priortized_requests),
45 weak_ptr_factory_(this) { 47 weak_ptr_factory_(this) {
46 device_conditions_.reset(new DeviceConditions(device_conditions)); 48 device_conditions_.reset(new DeviceConditions(device_conditions));
47 } 49 }
48 50
49 PickRequestTask::~PickRequestTask() {} 51 PickRequestTask::~PickRequestTask() {}
50 52
51 void PickRequestTask::Run() { 53 void PickRequestTask::Run() {
52 GetRequests(); 54 GetRequests();
53 } 55 }
54 56
(...skipping 21 matching lines...) Expand all
76 78
77 // Choose which comparison function to use based on policy. 79 // Choose which comparison function to use based on policy.
78 if (policy_->RetryCountIsMoreImportantThanRecency()) 80 if (policy_->RetryCountIsMoreImportantThanRecency())
79 comparator = &PickRequestTask::RetryCountFirstCompareFunction; 81 comparator = &PickRequestTask::RetryCountFirstCompareFunction;
80 else 82 else
81 comparator = &PickRequestTask::RecencyFirstCompareFunction; 83 comparator = &PickRequestTask::RecencyFirstCompareFunction;
82 84
83 // TODO(petewil): Consider replacing this bool with a better named enum. 85 // TODO(petewil): Consider replacing this bool with a better named enum.
84 bool non_user_requested_tasks_remaining = false; 86 bool non_user_requested_tasks_remaining = false;
85 bool cleanup_needed = false; 87 bool cleanup_needed = false;
88 bool is_priortized_request_picked = false;
Pete Williamson 2017/03/06 18:30:57 nit: was_prioritized_request_picked might be bette
romax 2017/03/07 18:40:44 Done.
86 89
87 size_t available_request_count = 0; 90 size_t available_request_count = 0;
88 91
89 // Iterate once through the requests, keeping track of best candidate. 92 // Search for the priortized requests before iterating all the requests.
Pete Williamson 2017/03/06 18:30:57 There is an implicit assumption here that we shoul
romax 2017/03/07 18:40:44 Done.
93 while (!picked_request && !priortized_requests_.empty()) {
94 int64_t id = priortized_requests_.front();
95 for (unsigned i = 0; i < requests.size(); ++i) {
96 if (requests[i]->request_id() == id) {
97 picked_request = requests[i].get();
98 is_priortized_request_picked = true;
99 break;
100 }
101 }
102 // Remove the priortized requests which are not in request queue.
103 priortized_requests_.pop_front();
104 }
105
106 // Iterate once through the requests, keeping track of best candidate if no
107 // priortized request has been chosen.
fgorski 2017/03/06 18:12:45 if statement should probably happen outside of the
Pete Williamson 2017/03/06 18:30:57 Agreed, if a prioritized request is found, we shou
romax 2017/03/07 18:40:44 Refactored a little bit. Not sure if it's necessar
90 for (unsigned i = 0; i < requests.size(); ++i) { 108 for (unsigned i = 0; i < requests.size(); ++i) {
91 // If the request is expired or has exceeded the retry count, skip it. 109 // If the request is expired or has exceeded the retry count, skip it.
92 if (OfflinerPolicyUtils::CheckRequestExpirationStatus(requests[i].get(), 110 if (OfflinerPolicyUtils::CheckRequestExpirationStatus(requests[i].get(),
93 policy_) != 111 policy_) !=
94 OfflinerPolicyUtils::RequestExpirationStatus::VALID) { 112 OfflinerPolicyUtils::RequestExpirationStatus::VALID) {
95 cleanup_needed = true; 113 cleanup_needed = true;
96 continue; 114 continue;
97 } 115 }
98 116
99 // If the request is on the disabled list, skip it. 117 // If the request is on the disabled list, skip it.
100 auto search = disabled_requests_.find(requests[i]->request_id()); 118 auto search = disabled_requests_.find(requests[i]->request_id());
101 if (search != disabled_requests_.end()) 119 if (search != disabled_requests_.end())
fgorski 2017/03/06 18:12:45 Is there a chance that prioritized request is on t
romax 2017/03/07 18:40:44 yeah there might be. added a check
102 continue; 120 continue;
103 121
104 // If there are non-user-requested tasks remaining, we need to make sure 122 // If there are non-user-requested tasks remaining, we need to make sure
105 // that they are scheduled after we run out of user requested tasks. Here we 123 // that they are scheduled after we run out of user requested tasks. Here we
106 // detect if any exist. If we don't find any user-requested tasks, we will 124 // detect if any exist. If we don't find any user-requested tasks, we will
107 // inform the "not_picked_callback_" that it needs to schedule a task for 125 // inform the "not_picked_callback_" that it needs to schedule a task for
108 // non-user-requested items, which have different network and power needs. 126 // non-user-requested items, which have different network and power needs.
109 if (!requests[i]->user_requested()) 127 if (!requests[i]->user_requested())
110 non_user_requested_tasks_remaining = true; 128 non_user_requested_tasks_remaining = true;
111 if (requests[i]->request_state() == 129 if (requests[i]->request_state() ==
112 SavePageRequest::RequestState::AVAILABLE) { 130 SavePageRequest::RequestState::AVAILABLE) {
113 available_request_count++; 131 available_request_count++;
114 } 132 }
115 if (!RequestConditionsSatisfied(requests[i].get())) 133
116 continue; 134 if (!is_priortized_request_picked) {
117 if (IsNewRequestBetter(picked_request, requests[i].get(), comparator)) 135 if (!RequestConditionsSatisfied(requests[i].get()))
118 picked_request = requests[i].get(); 136 continue;
137 if (IsNewRequestBetter(picked_request, requests[i].get(), comparator))
138 picked_request = requests[i].get();
139 }
119 } 140 }
120 141
121 // Report the request queue counts. 142 // Report the request queue counts.
122 request_count_callback_.Run(requests.size(), available_request_count); 143 request_count_callback_.Run(requests.size(), available_request_count);
123 144
124 // If we have a best request to try next, get the request coodinator to 145 // If we have a best request to try next, get the request coodinator to
125 // start it. Otherwise return that we have no candidates. 146 // start it. Otherwise return that we have no candidates.
126 if (picked_request != nullptr) { 147 if (picked_request != nullptr) {
127 picked_callback_.Run(*picked_request, cleanup_needed); 148 picked_callback_.Run(*picked_request, cleanup_needed);
128 } else { 149 } else {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 int result = signum(difference.InMilliseconds()); 267 int result = signum(difference.InMilliseconds());
247 268
248 // Flip the direction of comparison if policy prefers fewer retries. 269 // Flip the direction of comparison if policy prefers fewer retries.
249 if (policy_->ShouldPreferEarlierRequests()) 270 if (policy_->ShouldPreferEarlierRequests())
250 result *= -1; 271 result *= -1;
251 272
252 return result; 273 return result;
253 } 274 }
254 275
255 } // namespace offline_pages 276 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698