summaryrefslogtreecommitdiffstats
path: root/sync/engine/sync_scheduler_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sync/engine/sync_scheduler_impl.cc')
-rw-r--r--sync/engine/sync_scheduler_impl.cc81
1 files changed, 4 insertions, 77 deletions
diff --git a/sync/engine/sync_scheduler_impl.cc b/sync/engine/sync_scheduler_impl.cc
index 6db3260..ff177b4 100644
--- a/sync/engine/sync_scheduler_impl.cc
+++ b/sync/engine/sync_scheduler_impl.cc
@@ -12,7 +12,7 @@
#include "base/location.h"
#include "base/logging.h"
#include "base/message_loop.h"
-#include "base/rand_util.h"
+#include "sync/engine/backoff_delay_provider.h"
#include "sync/engine/syncer.h"
#include "sync/engine/throttled_data_type_tracker.h"
#include "sync/protocol/proto_enum_conversions.h"
@@ -32,11 +32,6 @@ using sync_pb::GetUpdatesCallerInfo;
namespace {
-// For integration tests only. Override initial backoff value.
-// TODO(tim): Remove this egregiousness, use command line flag and plumb
-// through. Done this way to reduce diffs in hotfix.
-static bool g_force_short_retry = false;
-
bool ShouldRequestEarlyExit(const SyncProtocolError& error) {
switch (error.error_type) {
case SYNC_SUCCESS:
@@ -85,9 +80,6 @@ ConfigurationParams::ConfigurationParams(
}
ConfigurationParams::~ConfigurationParams() {}
-SyncSchedulerImpl::DelayProvider::DelayProvider() {}
-SyncSchedulerImpl::DelayProvider::~DelayProvider() {}
-
SyncSchedulerImpl::WaitInterval::WaitInterval()
: mode(UNKNOWN),
had_nudge(false) {
@@ -140,11 +132,6 @@ const char* SyncSchedulerImpl::SyncSessionJob::GetPurposeString(
return "";
}
-TimeDelta SyncSchedulerImpl::DelayProvider::GetDelay(
- const base::TimeDelta& last_delay) {
- return SyncSchedulerImpl::GetRecommendedDelay(last_delay);
-}
-
GetUpdatesCallerInfo::GetUpdatesSource GetUpdatesFromNudgeSource(
NudgeSource source) {
switch (source) {
@@ -197,6 +184,7 @@ bool IsConfigRelatedUpdateSourceValue(
} // namespace
SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name,
+ BackoffDelayProvider* delay_provider,
sessions::SyncSessionContext* context,
Syncer* syncer)
: weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
@@ -216,7 +204,7 @@ SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name,
// Start with assuming everything is fine with the connection.
// At the end of the sync cycle we would have the correct status.
connection_code_(HttpResponse::SERVER_CONNECTION_OK),
- delay_provider_(new DelayProvider()),
+ delay_provider_(delay_provider),
syncer_(syncer),
session_context_(context) {
DCHECK(sync_loop_);
@@ -903,43 +891,6 @@ void SyncSchedulerImpl::RestartWaiting() {
this, &SyncSchedulerImpl::DoCanaryJob);
}
-namespace {
-// TODO(tim): Move this function to syncer_error.h.
-// Return true if the command in question was attempted and did not complete
-// successfully.
-bool IsError(SyncerError error) {
- return error != UNSET && error != SYNCER_OK;
-}
-} // namespace
-
-// static
-void SyncSchedulerImpl::ForceShortInitialBackoffRetry() {
- g_force_short_retry = true;
-}
-
-TimeDelta SyncSchedulerImpl::GetInitialBackoffDelay(
- const sessions::ModelNeutralState& state) const {
- // TODO(tim): Remove this, provide integration-test-only mechanism
- // for override.
- if (g_force_short_retry) {
- return TimeDelta::FromSeconds(kInitialBackoffShortRetrySeconds);
- }
-
- if (IsError(state.last_get_key_result))
- return TimeDelta::FromSeconds(kInitialBackoffRetrySeconds);
- // Note: If we received a MIGRATION_DONE on download updates, then commit
- // should not have taken place. Moreover, if we receive a MIGRATION_DONE
- // on commit, it means that download updates succeeded. Therefore, we only
- // need to check if either code is equal to SERVER_RETURN_MIGRATION_DONE,
- // and not if there were any more serious errors requiring the long retry.
- if (state.last_download_updates_result == SERVER_RETURN_MIGRATION_DONE ||
- state.commit_result == SERVER_RETURN_MIGRATION_DONE) {
- return TimeDelta::FromSeconds(kInitialBackoffShortRetrySeconds);
- }
-
- return TimeDelta::FromSeconds(kInitialBackoffRetrySeconds);
-}
-
void SyncSchedulerImpl::HandleContinuationError(
const SyncSessionJob& old_job) {
DCHECK_EQ(MessageLoop::current(), sync_loop_);
@@ -951,7 +902,7 @@ void SyncSchedulerImpl::HandleContinuationError(
TimeDelta length = delay_provider_->GetDelay(
IsBackingOff() ? wait_interval_->length :
- GetInitialBackoffDelay(
+ delay_provider_->GetInitialDelay(
old_job.session->status_controller().model_neutral_state()));
SDVLOG(2) << "In handle continuation error with "
@@ -984,30 +935,6 @@ void SyncSchedulerImpl::HandleContinuationError(
RestartWaiting();
}
-// static
-TimeDelta SyncSchedulerImpl::GetRecommendedDelay(const TimeDelta& last_delay) {
- if (last_delay.InSeconds() >= kMaxBackoffSeconds)
- return TimeDelta::FromSeconds(kMaxBackoffSeconds);
-
- // This calculates approx. base_delay_seconds * 2 +/- base_delay_seconds / 2
- int64 backoff_s =
- std::max(static_cast<int64>(1),
- last_delay.InSeconds() * kBackoffRandomizationFactor);
-
- // Flip a coin to randomize backoff interval by +/- 50%.
- int rand_sign = base::RandInt(0, 1) * 2 - 1;
-
- // Truncation is adequate for rounding here.
- backoff_s = backoff_s +
- (rand_sign * (last_delay.InSeconds() / kBackoffRandomizationFactor));
-
- // Cap the backoff interval.
- backoff_s = std::max(static_cast<int64>(1),
- std::min(backoff_s, kMaxBackoffSeconds));
-
- return TimeDelta::FromSeconds(backoff_s);
-}
-
void SyncSchedulerImpl::RequestStop(const base::Closure& callback) {
syncer_->RequestEarlyExit(); // Safe to call from any thread.
DCHECK(weak_handle_this_.IsInitialized());