Index: chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
index ee83bbec10818a9ff1394a64093f5545bc254fa5..ffa38d45e50216f6b5f0fe4f13dfdee6f6abde30 100644 |
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc |
@@ -34,7 +34,8 @@ CloudPolicyInvalidator::CloudPolicyInvalidator( |
enterprise_management::DeviceRegisterRequest::Type type, |
CloudPolicyCore* core, |
const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
- scoped_ptr<base::Clock> clock) |
+ scoped_ptr<base::Clock> clock, |
+ int64 highest_handled_invalidation_version) |
: state_(UNINITIALIZED), |
type_(type), |
core_(core), |
@@ -47,6 +48,8 @@ CloudPolicyInvalidator::CloudPolicyInvalidator( |
invalid_(false), |
invalidation_version_(0), |
unknown_version_invalidation_count_(0), |
+ highest_handled_invalidation_version_( |
+ highest_handled_invalidation_version), |
weak_factory_(this), |
max_fetch_delay_(kMaxFetchDelayDefault), |
policy_hash_value_(0) { |
@@ -154,10 +157,16 @@ void CloudPolicyInvalidator::OnStoreLoaded(CloudPolicyStore* store) { |
METRIC_POLICY_REFRESH_SIZE); |
} |
+ const int64 store_invalidation_version = store->invalidation_version(); |
+ |
// If the policy was invalid and the version stored matches the latest |
// invalidation version, acknowledge the latest invalidation. |
- if (invalid_ && store->invalidation_version() == invalidation_version_) |
+ if (invalid_ && store_invalidation_version == invalidation_version_) |
AcknowledgeInvalidation(); |
+ |
+ // Update the highest invalidation version that was handled already. |
+ if (store_invalidation_version > highest_handled_invalidation_version_) |
+ highest_handled_invalidation_version_ = store_invalidation_version; |
} |
UpdateRegistration(store->policy()); |
@@ -175,6 +184,14 @@ void CloudPolicyInvalidator::HandleInvalidation( |
return; |
} |
+ if (!invalidation.is_unknown_version() && |
+ invalidation.version() <= highest_handled_invalidation_version_) { |
+ // If this invalidation version was handled already, acknowledge the |
+ // invalidation but ignore it otherwise. |
+ invalidation.Acknowledge(); |
+ return; |
+ } |
+ |
// If there is still a pending invalidation, acknowledge it, since we only |
// care about the latest invalidation. |
if (invalid_) |