| Index: third_party/cacheinvalidation/src/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc
|
| diff --git a/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc b/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eac021854985ed93aeeaf616395effa1df2e9596
|
| --- /dev/null
|
| +++ b/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/exponential-backoff-delay-generator.cc
|
| @@ -0,0 +1,40 @@
|
| +// Copyright 2012 Google Inc.
|
| +//
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +// you may not use this file except in compliance with the License.
|
| +// You may obtain a copy of the License at
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +// distributed under the License is distributed on an "AS IS" BASIS,
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// See the License for the specific language governing permissions and
|
| +// limitations under the License.
|
| +
|
| +#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
|
| +
|
| +namespace invalidation {
|
| +
|
| +TimeDelta ExponentialBackoffDelayGenerator::GetNextDelay() {
|
| + TimeDelta delay = Scheduler::NoDelay(); // After a reset, delay is zero.
|
| + if (in_retry_mode) {
|
| + // We used to multiply the current_max_delay_ by the double, but this
|
| + // implicitly truncated the double to an integer, which would always be 0.
|
| + // By converting to and from milliseconds, we avoid this problem.
|
| + delay = TimeDelta::FromMilliseconds(
|
| + random_->RandDouble() * current_max_delay_.InMilliseconds());
|
| +
|
| + // Adjust the max for the next run.
|
| + TimeDelta max_delay = initial_max_delay_ * max_exponential_factor_;
|
| + if (current_max_delay_ <= max_delay) { // Guard against overflow.
|
| + current_max_delay_ *= 2;
|
| + if (current_max_delay_ > max_delay) {
|
| + current_max_delay_ = max_delay;
|
| + }
|
| + }
|
| + }
|
| + in_retry_mode = true;
|
| + return delay;
|
| +}
|
| +}
|
|
|