Index: chrome/browser/sync/engine/syncer_thread.h |
=================================================================== |
--- chrome/browser/sync/engine/syncer_thread.h (revision 28645) |
+++ chrome/browser/sync/engine/syncer_thread.h (working copy) |
@@ -74,6 +74,30 @@ |
friend class SyncerThreadWithSyncerTest; |
friend class SyncerThreadFactory; |
public: |
+ // Encapsulates the parameters that make up an interval on which the |
+ // syncer thread is sleeping. |
+ struct WaitInterval { |
+ enum Mode { |
+ // A wait interval whose duration has not been affected by exponential |
+ // backoff. The base case for exponential backoff falls in to this case |
+ // (e.g when the exponent is 1). So far, we don't need a separate case. |
+ // NORMAL intervals are not nudge-rate limited. |
+ NORMAL, |
+ // A wait interval whose duration has been affected by exponential |
+ // backoff. |
+ // EXPONENTIAL_BACKOFF intervals are nudge-rate limited to 1 per interval. |
+ EXPONENTIAL_BACKOFF, |
+ }; |
+ |
+ Mode mode; |
+ // This bool is set to true if we have observed a nudge during during this |
+ // interval and mode == EXPONENTIAL_BACKOFF. |
+ bool had_nudge_during_backoff; |
+ base::TimeDelta poll_delta; // The wait duration until the next poll. |
+ |
+ WaitInterval() : mode(NORMAL), had_nudge_during_backoff(false) { } |
+ }; |
+ |
enum NudgeSource { |
kUnknown = 0, |
kNotification, |
@@ -103,7 +127,7 @@ |
// Nudges the syncer to sync with a delay specified. This API is for access |
// from the SyncerThread's controller and will cause a mutex lock. |
- virtual bool NudgeSyncer(int milliseconds_from_now, NudgeSource source); |
+ virtual void NudgeSyncer(int milliseconds_from_now, NudgeSource source); |
// Registers this thread to watch talk mediator events. |
virtual void WatchTalkMediator(TalkMediator* talk_mediator); |
@@ -172,6 +196,13 @@ |
// NudgeQueue(). |
NudgeQueue nudge_queue_; |
+ // The wait interval for to the current iteration of our main loop. This is |
+ // only written to by the syncer thread, and since the only reader from a |
+ // different thread (NudgeSync) is called at totally random times, we don't |
+ // really need to access mutually exclusively as the data races that exist |
+ // are intrinsic, but do so anyway and avoid using 'volatile'. |
+ WaitInterval current_wait_interval_; |
+ |
ProtectedFields() |
: stop_syncer_thread_(false), syncer_(NULL), connected_(false) {} |
} vault_; |
@@ -184,12 +215,6 @@ |
Lock lock_; |
private: |
- // A few members to gate the rate at which we nudge the syncer. |
- enum { |
- kNudgeRateLimitCount = 6, |
- kNudgeRateLimitTime = 180, |
- }; |
- |
// Threshold multipler for how long before user should be considered idle. |
static const int kPollBackoffThresholdMultiplier = 10; |
@@ -206,25 +231,30 @@ |
void SyncMain(Syncer* syncer); |
- // Calculates the next sync wait time in seconds. last_poll_wait is the time |
- // duration of the previous polling timeout which was used. |
- // user_idle_milliseconds is updated by this method, and is a report of the |
- // full amount of time since the last period of activity for the user. The |
- // continue_sync_cycle parameter is used to determine whether or not we are |
- // calculating a polling wait time that is a continuation of an sync cycle |
- // which terminated while the syncer still had work to do. |
- virtual int CalculatePollingWaitTime( |
+ // Calculates the next sync wait time and exponential backoff state. |
+ // last_poll_wait is the time duration of the previous polling timeout which |
+ // was used. user_idle_milliseconds is updated by this method, and is a report |
+ // of the full amount of time since the last period of activity for the user. |
+ // The continue_sync_cycle parameter is used to determine whether or not we |
+ // are calculating a polling wait time that is a continuation of an sync cycle |
+ // which terminated while the syncer still had work to do. was_nudged is used |
+ // in case of exponential backoff so we only allow one nudge per backoff |
+ // interval. |
+ WaitInterval CalculatePollingWaitTime( |
const AllStatus::Status& status, |
int last_poll_wait, // in s |
int* user_idle_milliseconds, |
- bool* continue_sync_cycle); |
+ bool* continue_sync_cycle, |
+ bool was_nudged); |
+ |
// Helper to above function, considers effect of user idle time. |
virtual int CalculateSyncWaitTime(int last_wait, int user_idle_ms); |
// Sets the source value of the controlled syncer's updates_source value. |
// The initial sync boolean is updated if read as a sentinel. The following |
- // two methods work in concert to achieve this goal. |
- void UpdateNudgeSource(bool* continue_sync_cycle, |
+ // two methods work in concert to achieve this goal. Returns true if it |
+ // determines a nudge actually occurred. |
+ bool UpdateNudgeSource(bool continue_sync_cycle, |
bool* initial_sync); |
void SetUpdatesSource(bool nudged, NudgeSource nudge_source, |
bool* initial_sync); |