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

Side by Side Diff: chrome/browser/policy/cloud/cloud_policy_invalidator.cc

Issue 23441042: Refactor common invalidation framework types (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Another browser test fix Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 5 #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/hash.h" 9 #include "base/hash.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 DCHECK(state_ == STARTED); 85 DCHECK(state_ == STARTED);
86 DCHECK(thread_checker_.CalledOnValidThread()); 86 DCHECK(thread_checker_.CalledOnValidThread());
87 invalidation_service_enabled_ = state == syncer::INVALIDATIONS_ENABLED; 87 invalidation_service_enabled_ = state == syncer::INVALIDATIONS_ENABLED;
88 UpdateInvalidationsEnabled(); 88 UpdateInvalidationsEnabled();
89 } 89 }
90 90
91 void CloudPolicyInvalidator::OnIncomingInvalidation( 91 void CloudPolicyInvalidator::OnIncomingInvalidation(
92 const syncer::ObjectIdInvalidationMap& invalidation_map) { 92 const syncer::ObjectIdInvalidationMap& invalidation_map) {
93 DCHECK(state_ == STARTED); 93 DCHECK(state_ == STARTED);
94 DCHECK(thread_checker_.CalledOnValidThread()); 94 DCHECK(thread_checker_.CalledOnValidThread());
95 const syncer::ObjectIdInvalidationMap::const_iterator invalidation = 95 const syncer::SingleObjectInvalidationSet& list =
96 invalidation_map.find(object_id_); 96 invalidation_map.ForObject(object_id_);
97 if (invalidation == invalidation_map.end()) { 97 if (list.IsEmpty()) {
98 NOTREACHED(); 98 NOTREACHED();
99 return; 99 return;
100 } 100 }
101 HandleInvalidation(invalidation->second); 101 HandleInvalidation(list.back());
102 } 102 }
103 103
104 void CloudPolicyInvalidator::OnCoreConnected(CloudPolicyCore* core) {} 104 void CloudPolicyInvalidator::OnCoreConnected(CloudPolicyCore* core) {}
105 105
106 void CloudPolicyInvalidator::OnRefreshSchedulerStarted(CloudPolicyCore* core) { 106 void CloudPolicyInvalidator::OnRefreshSchedulerStarted(CloudPolicyCore* core) {
107 DCHECK(state_ == STOPPED); 107 DCHECK(state_ == STOPPED);
108 DCHECK(thread_checker_.CalledOnValidThread()); 108 DCHECK(thread_checker_.CalledOnValidThread());
109 state_ = STARTED; 109 state_ = STARTED;
110 OnStoreLoaded(core_->store()); 110 OnStoreLoaded(core_->store());
111 core_->store()->AddObserver(this); 111 core_->store()->AddObserver(this);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 UpdateRegistration(store->policy()); 149 UpdateRegistration(store->policy());
150 UpdateMaxFetchDelay(store->policy_map()); 150 UpdateMaxFetchDelay(store->policy_map());
151 } 151 }
152 152
153 void CloudPolicyInvalidator::OnStoreError(CloudPolicyStore* store) {} 153 void CloudPolicyInvalidator::OnStoreError(CloudPolicyStore* store) {}
154 154
155 void CloudPolicyInvalidator::HandleInvalidation( 155 void CloudPolicyInvalidator::HandleInvalidation(
156 const syncer::Invalidation& invalidation) { 156 const syncer::Invalidation& invalidation) {
157 // The invalidation service may send an invalidation more than once if there 157 // The invalidation service may send an invalidation more than once if there
158 // is a delay in acknowledging it. Duplicate invalidations are ignored. 158 // is a delay in acknowledging it. Duplicate invalidations are ignored.
159 if (invalid_ && ack_handle_.Equals(invalidation.ack_handle)) 159 if (invalid_ && ack_handle_.Equals(invalidation.ack_handle()))
160 return; 160 return;
161 161
162 // If there is still a pending invalidation, acknowledge it, since we only 162 // If there is still a pending invalidation, acknowledge it, since we only
163 // care about the latest invalidation. 163 // care about the latest invalidation.
164 if (invalid_) 164 if (invalid_)
165 AcknowledgeInvalidation(); 165 AcknowledgeInvalidation();
166 166
167 // Update invalidation state. 167 // Update invalidation state.
168 invalid_ = true; 168 invalid_ = true;
169 ack_handle_ = invalidation.ack_handle; 169 ack_handle_ = invalidation.ack_handle();
170 invalidation_version_ = invalidation.version;
171 170
172 // When an invalidation with unknown version is received, use negative 171 // When an invalidation with unknown version is received, use negative
173 // numbers based on the number of such invalidations received. This 172 // numbers based on the number of such invalidations received. This
174 // ensures that the version numbers do not collide with "real" versions 173 // ensures that the version numbers do not collide with "real" versions
175 // (which are positive) or previous invalidations with unknown version. 174 // (which are positive) or previous invalidations with unknown version.
176 if (invalidation_version_ == syncer::Invalidation::kUnknownVersion) 175 if (invalidation.is_unknown_version()) {
177 invalidation_version_ = -(++unknown_version_invalidation_count_); 176 invalidation_version_ = -(++unknown_version_invalidation_count_);
177 } else {
178 invalidation_version_ = invalidation.version();
179 }
178 180
179 // In order to prevent the cloud policy server from becoming overwhelmed when 181 // In order to prevent the cloud policy server from becoming overwhelmed when
180 // a policy with many users is modified, delay for a random period of time 182 // a policy with many users is modified, delay for a random period of time
181 // before fetching the policy. Delay for at least 20ms so that if multiple 183 // before fetching the policy. Delay for at least 20ms so that if multiple
182 // invalidations are received in quick succession, only one fetch will be 184 // invalidations are received in quick succession, only one fetch will be
183 // performed. 185 // performed.
184 base::TimeDelta delay = base::TimeDelta::FromMilliseconds( 186 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(
185 base::RandInt(20, max_fetch_delay_)); 187 base::RandInt(20, max_fetch_delay_));
186 188
187 // If there is a payload, the policy can be refreshed at any time, so set 189 std::string payload;
188 // the version and payload on the client immediately. Otherwise, the refresh 190 if (!invalidation.is_unknown_version())
191 payload = invalidation.payload();
Steve Condie 2013/10/01 18:53:10 Optional. To avoid making an unnecessary copy of t
rlarocque 2013/10/01 19:29:57 That's a good suggestion, but I'd prefer to leave
192
193 // If there is a payload, the invalidate callback can run at any time, so set
Steve Condie 2013/10/01 18:53:10 It looks like you accidentally modified this comme
rlarocque 2013/10/01 19:29:57 Sorry about that. Reverted.
194 // the version and payload on the client immediately. Otherwise, the callback
189 // must only run after at least kMissingPayloadDelay minutes. 195 // must only run after at least kMissingPayloadDelay minutes.
190 const std::string& payload = invalidation.payload; 196 if (!payload.empty())
191 if (!invalidation.payload.empty())
192 core_->client()->SetInvalidationInfo(invalidation_version_, payload); 197 core_->client()->SetInvalidationInfo(invalidation_version_, payload);
193 else 198 else
194 delay += base::TimeDelta::FromMinutes(kMissingPayloadDelay); 199 delay += base::TimeDelta::FromMinutes(kMissingPayloadDelay);
195 200
196 // Schedule the policy to be refreshed. 201 // Schedule the policy to be refreshed.
197 task_runner_->PostDelayedTask( 202 task_runner_->PostDelayedTask(
198 FROM_HERE, 203 FROM_HERE,
199 base::Bind( 204 base::Bind(
200 &CloudPolicyInvalidator::RefreshPolicy, 205 &CloudPolicyInvalidator::RefreshPolicy,
201 weak_factory_.GetWeakPtr(), 206 weak_factory_.GetWeakPtr(),
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 if (invalidations_enabled_) 346 if (invalidations_enabled_)
342 return METRIC_POLICY_REFRESH_CHANGED; 347 return METRIC_POLICY_REFRESH_CHANGED;
343 return METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS; 348 return METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS;
344 } 349 }
345 if (invalid_) 350 if (invalid_)
346 return METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED; 351 return METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED;
347 return METRIC_POLICY_REFRESH_UNCHANGED; 352 return METRIC_POLICY_REFRESH_UNCHANGED;
348 } 353 }
349 354
350 } // namespace policy 355 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698