| Index: chrome/browser/sync/engine/syncer_thread.cc
|
| ===================================================================
|
| --- chrome/browser/sync/engine/syncer_thread.cc (revision 71618)
|
| +++ chrome/browser/sync/engine/syncer_thread.cc (working copy)
|
| @@ -7,6 +7,8 @@
|
| #include <algorithm>
|
| #include <map>
|
| #include <queue>
|
| +#include <string>
|
| +#include <vector>
|
|
|
| #include "base/rand_util.h"
|
| #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
|
| @@ -54,6 +56,19 @@
|
|
|
| const int SyncerThread::kMaxBackoffSeconds = 60 * 60 * 4; // 4 hours.
|
|
|
| +void SyncerThread::NudgeSyncerWithPayloads(
|
| + int milliseconds_from_now,
|
| + NudgeSource source,
|
| + const std::map<syncable::ModelType, std::string>& payloads) {
|
| + base::AutoLock lock(lock_);
|
| + if (vault_.syncer_ == NULL) {
|
| + return;
|
| + }
|
| +
|
| + syncable::ModelTypeBitSet model_types; // All false by default.
|
| + NudgeSyncImpl(milliseconds_from_now, source, model_types, payloads);
|
| +}
|
| +
|
| void SyncerThread::NudgeSyncerWithDataTypes(
|
| int milliseconds_from_now,
|
| NudgeSource source,
|
| @@ -63,7 +78,8 @@
|
| return;
|
| }
|
|
|
| - NudgeSyncImpl(milliseconds_from_now, source, model_types);
|
| + std::map<syncable::ModelType, std::string> empty_payload;
|
| + NudgeSyncImpl(milliseconds_from_now, source, model_types, empty_payload);
|
| }
|
|
|
| void SyncerThread::NudgeSyncer(
|
| @@ -74,8 +90,10 @@
|
| return;
|
| }
|
|
|
| - syncable::ModelTypeBitSet model_types; // All false by default.
|
| - NudgeSyncImpl(milliseconds_from_now, source, model_types);
|
| + syncable::ModelTypeBitSet model_types;
|
| + model_types.set(); // The default nudge acts on all datatypes.
|
| + std::map<syncable::ModelType, std::string> empty_payload;
|
| + NudgeSyncImpl(milliseconds_from_now, source, model_types, empty_payload);
|
| }
|
|
|
| SyncerThread::SyncerThread(sessions::SyncSessionContext* context)
|
| @@ -342,12 +360,14 @@
|
| // Update timing information for how often these datatypes are triggering
|
| // nudges.
|
| base::TimeTicks now = TimeTicks::Now();
|
| - for (size_t i = syncable::FIRST_REAL_MODEL_TYPE;
|
| - i < session->source().second.size();
|
| - ++i) {
|
| - if (session->source().second[i]) {
|
| - syncable::PostTimeToTypeHistogram(syncable::ModelType(i),
|
| - now - last_sync_time);
|
| + if (!last_sync_time.is_null()) {
|
| + for (size_t i = syncable::FIRST_REAL_MODEL_TYPE;
|
| + i < session->source().types.size();
|
| + ++i) {
|
| + if (session->source().types[i]) {
|
| + syncable::PostTimeToTypeHistogram(syncable::ModelType(i),
|
| + now - last_sync_time);
|
| + }
|
| }
|
| }
|
|
|
| @@ -575,6 +595,7 @@
|
| bool nudged = false;
|
| NudgeSource nudge_source = kUnknown;
|
| syncable::ModelTypeBitSet model_types;
|
| + std::map<syncable::ModelType, std::string> payloads;
|
| // Has the previous sync cycle completed?
|
| if (continue_sync_cycle)
|
| nudge_source = kContinuation;
|
| @@ -584,12 +605,14 @@
|
| if (!was_throttled) {
|
| nudge_source = vault_.pending_nudge_source_;
|
| model_types = vault_.pending_nudge_types_;
|
| + payloads = vault_.datatype_payloads_;
|
| nudged = true;
|
| }
|
| VLOG(1) << "Clearing pending nudge from " << vault_.pending_nudge_source_
|
| << " at tick " << vault_.pending_nudge_time_.ToInternalValue();
|
| vault_.pending_nudge_source_ = kUnknown;
|
| vault_.pending_nudge_types_.reset();
|
| + vault_.datatype_payloads_.clear();
|
| vault_.pending_nudge_time_ = base::TimeTicks();
|
| }
|
|
|
| @@ -599,11 +622,12 @@
|
| // from syncer having more work to do. This will be handled properly with
|
| // the message loop based syncer thread, bug 26339.
|
| return MakeSyncSourceInfo(nudged || nudge_source == kContinuation,
|
| - nudge_source, model_types, initial_sync);
|
| + nudge_source, model_types, payloads, initial_sync);
|
| }
|
|
|
| SyncSourceInfo SyncerThread::MakeSyncSourceInfo(bool nudged,
|
| NudgeSource nudge_source, const syncable::ModelTypeBitSet& nudge_types,
|
| + const std::map<syncable::ModelType, std::string>& payloads,
|
| bool* initial_sync) {
|
| sync_pb::GetUpdatesCallerInfo::GetUpdatesSource updates_source =
|
| sync_pb::GetUpdatesCallerInfo::UNKNOWN;
|
| @@ -632,7 +656,22 @@
|
| break;
|
| }
|
| }
|
| - return SyncSourceInfo(updates_source, nudge_types);
|
| +
|
| + syncable::ModelTypeBitSet sync_source_types;
|
| + if (nudge_types.none()) {
|
| + // No datatypes requested. This must be a poll so set all enabled datatypes.
|
| + DCHECK(payloads.empty()); // There should be no payloads
|
| + ModelSafeRoutingInfo routes;
|
| + session_context_->registrar()->GetModelSafeRoutingInfo(&routes);
|
| + for (ModelSafeRoutingInfo::const_iterator i = routes.begin();
|
| + i != routes.end(); ++i) {
|
| + sync_source_types.set(i->first);
|
| + }
|
| + } else {
|
| + sync_source_types = nudge_types;
|
| + }
|
| +
|
| + return SyncSourceInfo(updates_source, sync_source_types, payloads);
|
| }
|
|
|
| void SyncerThread::CreateSyncer(const std::string& dirname) {
|
| @@ -735,8 +774,8 @@
|
|
|
| // Called with mutex_ already locked.
|
| void SyncerThread::NudgeSyncImpl(int milliseconds_from_now,
|
| - NudgeSource source,
|
| - const syncable::ModelTypeBitSet& model_types) {
|
| + NudgeSource source, const syncable::ModelTypeBitSet& model_types,
|
| + const std::map<syncable::ModelType, std::string>& payloads) {
|
| // TODO(sync): Add the option to reset the backoff state machine.
|
| // This is needed so nudges that are a result of the user's desire
|
| // to download updates for a new data type can be satisfied quickly.
|
| @@ -753,6 +792,19 @@
|
| // if pending_source is kLocal and |source| is kClearPrivateData).
|
| vault_.pending_nudge_types_ |= model_types;
|
|
|
| + // Any datatype that does actually have a payload signifies that we are
|
| + // requesting that datatype (and hence the corresponding
|
| + // |pending_nudge_types_| slot should be set).
|
| + for (std::map<syncable::ModelType, std::string>::const_iterator i =
|
| + payloads.begin();
|
| + i != payloads.end();
|
| + ++i) {
|
| + // This datatype has a payload we should hold on to.
|
| + // Overwrite old payloads as we only need the most recent one.
|
| + vault_.pending_nudge_types_.set(i->first);
|
| + vault_.datatype_payloads_[i->first] = i->second;
|
| + }
|
| +
|
| const TimeTicks nudge_time = TimeTicks::Now() +
|
| TimeDelta::FromMilliseconds(milliseconds_from_now);
|
| if (nudge_time <= vault_.pending_nudge_time_) {
|
|
|