diff options
author | skym <skym@chromium.org> | 2016-02-10 08:13:21 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-10 16:14:36 +0000 |
commit | fe95d93a38c040091a6d8bcc55e2c66f29d4ce27 (patch) | |
tree | 1febe365eada682ae3dfef6805465cc77102dc31 | |
parent | cfe52d9360013f0078ad6aa7ae7317e6b524b72c (diff) | |
download | chromium_src-fe95d93a38c040091a6d8bcc55e2c66f29d4ce27.zip chromium_src-fe95d93a38c040091a6d8bcc55e2c66f29d4ce27.tar.gz chromium_src-fe95d93a38c040091a6d8bcc55e2c66f29d4ce27.tar.bz2 |
[Sync] Moving DataTypeState to be a proto so that it can easily be
serialized to storage by model types.
BUG=543405
Review URL: https://codereview.chromium.org/1678343002
Cr-Commit-Position: refs/heads/master@{#374667}
22 files changed, 162 insertions, 133 deletions
diff --git a/sync/api/metadata_batch.cc b/sync/api/metadata_batch.cc index 072ad5e..a172d1e 100644 --- a/sync/api/metadata_batch.cc +++ b/sync/api/metadata_batch.cc @@ -18,11 +18,11 @@ void MetadataBatch::AddMetadata(const std::string& client_tag, metadata_map_.insert(std::make_pair(client_tag, metadata)); } -const DataTypeState& MetadataBatch::GetDataTypeState() const { +const sync_pb::DataTypeState& MetadataBatch::GetDataTypeState() const { return state_; } -void MetadataBatch::SetDataTypeState(const DataTypeState& state) { +void MetadataBatch::SetDataTypeState(const sync_pb::DataTypeState& state) { state_ = state; } diff --git a/sync/api/metadata_batch.h b/sync/api/metadata_batch.h index 56ab2a7..dd4b8d0 100644 --- a/sync/api/metadata_batch.h +++ b/sync/api/metadata_batch.h @@ -6,9 +6,10 @@ #define SYNC_API_METADATA_BATCH_H_ #include <map> +#include <string> #include "sync/base/sync_export.h" -#include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/entity_metadata.pb.h" namespace syncer_v2 { @@ -32,14 +33,14 @@ class SYNC_EXPORT MetadataBatch { const sync_pb::EntityMetadata& metadata); // Get the DataTypeState for this batch. - const DataTypeState& GetDataTypeState() const; + const sync_pb::DataTypeState& GetDataTypeState() const; // Set the DataTypeState for this batch. - void SetDataTypeState(const DataTypeState& state); + void SetDataTypeState(const sync_pb::DataTypeState& state); private: EntityMetadataMap metadata_map_; - DataTypeState state_; + sync_pb::DataTypeState state_; }; } // namespace syncer_v2 diff --git a/sync/api/metadata_change_list.h b/sync/api/metadata_change_list.h index a8c0d95..53c8e24 100644 --- a/sync/api/metadata_change_list.h +++ b/sync/api/metadata_change_list.h @@ -10,11 +10,11 @@ #include "sync/base/sync_export.h" namespace sync_pb { +class DataTypeState; class EntityMetadata; } // namespace sync_pb namespace syncer_v2 { -struct DataTypeState; // Interface used by the processor and service to communicate about metadata. // The purpose of the interface is to record changes to data type global and @@ -30,7 +30,8 @@ class SYNC_EXPORT MetadataChangeList { virtual ~MetadataChangeList() {} // Requests DataTypeState to be updated in the storage. - virtual void UpdateDataTypeState(const DataTypeState& data_type_state) = 0; + virtual void UpdateDataTypeState( + const sync_pb::DataTypeState& data_type_state) = 0; // Requests DataTypeState to be cleared from the storage. virtual void ClearDataTypeState() = 0; diff --git a/sync/engine/model_type_worker.cc b/sync/engine/model_type_worker.cc index e661588..5b6e7eb 100644 --- a/sync/engine/model_type_worker.cc +++ b/sync/engine/model_type_worker.cc @@ -33,7 +33,7 @@ using syncer::SyncerError; ModelTypeWorker::ModelTypeWorker( ModelType type, - const DataTypeState& initial_state, + const sync_pb::DataTypeState& initial_state, const UpdateResponseDataList& saved_pending_updates, scoped_ptr<Cryptographer> cryptographer, NudgeHandler* nudge_handler, @@ -45,7 +45,7 @@ ModelTypeWorker::ModelTypeWorker( nudge_handler_(nudge_handler), weak_ptr_factory_(this) { // Request an initial sync if it hasn't been completed yet. - if (!data_type_state_.initial_sync_done) { + if (!data_type_state_.initial_sync_done()) { nudge_handler_->NudgeForInitialDownload(type_); } @@ -94,13 +94,13 @@ void ModelTypeWorker::UpdateCryptographer( void ModelTypeWorker::GetDownloadProgress( sync_pb::DataTypeProgressMarker* progress_marker) const { DCHECK(CalledOnValidThread()); - progress_marker->CopyFrom(data_type_state_.progress_marker); + progress_marker->CopyFrom(data_type_state_.progress_marker()); } void ModelTypeWorker::GetDataTypeContext( sync_pb::DataTypeContext* context) const { DCHECK(CalledOnValidThread()); - context->CopyFrom(data_type_state_.type_context); + context->CopyFrom(data_type_state_.type_context()); } SyncerError ModelTypeWorker::ProcessGetUpdatesResponse( @@ -111,8 +111,8 @@ SyncerError ModelTypeWorker::ProcessGetUpdatesResponse( DCHECK(CalledOnValidThread()); // TODO(rlarocque): Handle data type context conflicts. - data_type_state_.type_context = mutated_context; - data_type_state_.progress_marker = progress_marker; + *data_type_state_.mutable_type_context() = mutated_context; + *data_type_state_.mutable_progress_marker() = progress_marker; UpdateResponseDataList response_datas; UpdateResponseDataList pending_updates; @@ -206,10 +206,10 @@ void ModelTypeWorker::ApplyUpdates(syncer::sessions::StatusController* status) { // got a response with changes_remaining == 0. If this is our first download // cycle, we should update our state so the ModelTypeProcessor knows that // it's safe to commit items now. - if (!data_type_state_.initial_sync_done) { + if (!data_type_state_.initial_sync_done()) { DVLOG(1) << "Delivering 'initial sync done' ping."; - data_type_state_.initial_sync_done = true; + data_type_state_.set_initial_sync_done(true); model_type_processor_->OnUpdateReceived( data_type_state_, UpdateResponseDataList(), UpdateResponseDataList()); @@ -271,7 +271,8 @@ scoped_ptr<CommitContribution> ModelTypeWorker::GetContribution( return scoped_ptr<CommitContribution>(); return scoped_ptr<CommitContribution>(new NonBlockingTypeCommitContribution( - data_type_state_.type_context, commit_entities, sequence_numbers, this)); + data_type_state_.type_context(), commit_entities, sequence_numbers, + this)); } void ModelTypeWorker::StorePendingCommit(const CommitRequestData& request) { @@ -327,8 +328,8 @@ base::WeakPtr<ModelTypeWorker> ModelTypeWorker::AsWeakPtr() { } bool ModelTypeWorker::IsTypeInitialized() const { - return data_type_state_.initial_sync_done && - !data_type_state_.progress_marker.token().empty(); + return data_type_state_.initial_sync_done() && + !data_type_state_.progress_marker().token().empty(); } bool ModelTypeWorker::CanCommitItems() const { @@ -392,10 +393,11 @@ void ModelTypeWorker::OnCryptographerUpdated() { const std::string& new_key_name = cryptographer_->GetDefaultNigoriKeyName(); // Handle a change in encryption key. - if (data_type_state_.encryption_key_name != new_key_name) { + if (data_type_state_.encryption_key_name() != new_key_name) { DVLOG(1) << ModelTypeToString(type_) << ": Updating encryption key " - << data_type_state_.encryption_key_name << " -> " << new_key_name; - data_type_state_.encryption_key_name = new_key_name; + << data_type_state_.encryption_key_name() << " -> " + << new_key_name; + data_type_state_.set_encryption_key_name(new_key_name); new_encryption_key = true; } diff --git a/sync/engine/model_type_worker.h b/sync/engine/model_type_worker.h index ee6e3dc..be0430f 100644 --- a/sync/engine/model_type_worker.h +++ b/sync/engine/model_type_worker.h @@ -21,6 +21,7 @@ #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/non_blocking_sync_common.h" #include "sync/internal_api/public/sync_encryption_handler.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/sync.pb.h" #include "sync/util/cryptographer.h" @@ -59,7 +60,7 @@ class SYNC_EXPORT ModelTypeWorker : public syncer::UpdateHandler, public base::NonThreadSafe { public: ModelTypeWorker(syncer::ModelType type, - const DataTypeState& initial_state, + const sync_pb::DataTypeState& initial_state, const UpdateResponseDataList& saved_pending_updates, scoped_ptr<syncer::Cryptographer> cryptographer, syncer::NudgeHandler* nudge_handler, @@ -139,7 +140,7 @@ class SYNC_EXPORT ModelTypeWorker : public syncer::UpdateHandler, syncer::ModelType type_; // State that applies to the entire model type. - DataTypeState data_type_state_; + sync_pb::DataTypeState data_type_state_; // Pointer to the ModelTypeProcessor associated with this worker. // This is NULL when no proxy is connected.. diff --git a/sync/engine/model_type_worker_unittest.cc b/sync/engine/model_type_worker_unittest.cc index cc452d8..cd19fc5 100644 --- a/sync/engine/model_type_worker_unittest.cc +++ b/sync/engine/model_type_worker_unittest.cc @@ -13,6 +13,7 @@ #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/model_type_processor.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/sync.pb.h" #include "sync/sessions/status_controller.h" #include "sync/syncable/syncable_util.h" @@ -84,7 +85,7 @@ class ModelTypeWorkerTest : public ::testing::Test { const UpdateResponseDataList& initial_pending_updates); // Initialize with a custom initial DataTypeState and pending updates. - void InitializeWithState(const DataTypeState& state, + void InitializeWithState(const sync_pb::DataTypeState& state, const UpdateResponseDataList& pending_updates); // Introduce a new key that the local cryptographer can't decrypt. @@ -148,7 +149,7 @@ class ModelTypeWorkerTest : public ::testing::Test { size_t GetNumModelThreadUpdateResponses() const; UpdateResponseDataList GetNthModelThreadUpdateResponse(size_t n) const; UpdateResponseDataList GetNthModelThreadPendingUpdates(size_t n) const; - DataTypeState GetNthModelThreadUpdateState(size_t n) const; + sync_pb::DataTypeState GetNthModelThreadUpdateState(size_t n) const; // Reads the latest update response datas on the model thread. // Note that if the model thread is in non-blocking mode, this data will not @@ -162,7 +163,7 @@ class ModelTypeWorkerTest : public ::testing::Test { // be updated until the response is actually processed by the model thread. size_t GetNumModelThreadCommitResponses() const; CommitResponseDataList GetNthModelThreadCommitResponse(size_t n) const; - DataTypeState GetNthModelThreadCommitState(size_t n) const; + sync_pb::DataTypeState GetNthModelThreadCommitState(size_t n) const; // Reads the latest commit response datas on the model thread. // Note that if the model thread is in non-blocking mode, this data will not @@ -243,8 +244,8 @@ ModelTypeWorkerTest::ModelTypeWorkerTest() ModelTypeWorkerTest::~ModelTypeWorkerTest() {} void ModelTypeWorkerTest::FirstInitialize() { - DataTypeState initial_state; - initial_state.progress_marker.set_data_type_id( + sync_pb::DataTypeState initial_state; + initial_state.mutable_progress_marker()->set_data_type_id( GetSpecificsFieldNumberFromModelType(kModelType)); InitializeWithState(initial_state, UpdateResponseDataList()); @@ -256,12 +257,13 @@ void ModelTypeWorkerTest::NormalInitialize() { void ModelTypeWorkerTest::InitializeWithPendingUpdates( const UpdateResponseDataList& initial_pending_updates) { - DataTypeState initial_state; - initial_state.progress_marker.set_data_type_id( + sync_pb::DataTypeState initial_state; + initial_state.mutable_progress_marker()->set_data_type_id( GetSpecificsFieldNumberFromModelType(kModelType)); - initial_state.progress_marker.set_token("some_saved_progress_token"); + initial_state.mutable_progress_marker()->set_token( + "some_saved_progress_token"); - initial_state.initial_sync_done = true; + initial_state.set_initial_sync_done(true); InitializeWithState(initial_state, initial_pending_updates); @@ -269,7 +271,7 @@ void ModelTypeWorkerTest::InitializeWithPendingUpdates( } void ModelTypeWorkerTest::InitializeWithState( - const DataTypeState& state, + const sync_pb::DataTypeState& state, const UpdateResponseDataList& initial_pending_updates) { DCHECK(!worker_); @@ -513,7 +515,7 @@ UpdateResponseDataList ModelTypeWorkerTest::GetNthModelThreadPendingUpdates( return mock_type_processor_->GetNthPendingUpdates(n); } -DataTypeState ModelTypeWorkerTest::GetNthModelThreadUpdateState( +sync_pb::DataTypeState ModelTypeWorkerTest::GetNthModelThreadUpdateState( size_t n) const { DCHECK_LT(n, GetNumModelThreadUpdateResponses()); return mock_type_processor_->GetNthTypeStateReceivedInUpdateResponse(n); @@ -541,7 +543,7 @@ CommitResponseDataList ModelTypeWorkerTest::GetNthModelThreadCommitResponse( return mock_type_processor_->GetNthCommitResponse(n); } -DataTypeState ModelTypeWorkerTest::GetNthModelThreadCommitState( +sync_pb::DataTypeState ModelTypeWorkerTest::GetNthModelThreadCommitState( size_t n) const { DCHECK_LT(n, GetNumModelThreadCommitResponses()); return mock_type_processor_->GetNthTypeStateReceivedInCommitResponse(n); @@ -768,9 +770,9 @@ TEST_F(ModelTypeWorkerTest, SendInitialSyncDone) { EXPECT_EQ(0U, GetNthModelThreadUpdateResponse(0).size()); EXPECT_EQ(0U, GetNthModelThreadUpdateResponse(1).size()); - const DataTypeState& state = GetNthModelThreadUpdateState(1); - EXPECT_FALSE(state.progress_marker.token().empty()); - EXPECT_TRUE(state.initial_sync_done); + const sync_pb::DataTypeState& state = GetNthModelThreadUpdateState(1); + EXPECT_FALSE(state.progress_marker().token().empty()); + EXPECT_TRUE(state.initial_sync_done()); } // Commit two new entities in two separate commit messages. @@ -851,7 +853,7 @@ TEST_F(ModelTypeWorkerTest, EncryptedCommit) { ASSERT_EQ(1U, GetNumModelThreadUpdateResponses()); EXPECT_EQ(GetLocalCryptographerKeyName(), - GetNthModelThreadUpdateState(0).encryption_key_name); + GetNthModelThreadUpdateState(0).encryption_key_name()); // Normal commit request stuff. CommitRequest("tag1", "value1"); @@ -952,7 +954,7 @@ TEST_F(ModelTypeWorkerTest, InitializeWithCryptographer) { // necessary. ASSERT_EQ(1U, GetNumModelThreadUpdateResponses()); EXPECT_EQ(GetLocalCryptographerKeyName(), - GetNthModelThreadUpdateState(0).encryption_key_name); + GetNthModelThreadUpdateState(0).encryption_key_name()); } // Receive updates that are initially undecryptable, then ensure they get diff --git a/sync/internal_api/public/activation_context.h b/sync/internal_api/public/activation_context.h index 798d851..48d9476 100644 --- a/sync/internal_api/public/activation_context.h +++ b/sync/internal_api/public/activation_context.h @@ -11,6 +11,7 @@ #include "sync/base/sync_export.h" #include "sync/internal_api/public/model_type_processor.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" namespace syncer_v2 { @@ -21,7 +22,7 @@ struct SYNC_EXPORT ActivationContext { ~ActivationContext(); // Initial DataTypeState at the moment of activation. - DataTypeState data_type_state; + sync_pb::DataTypeState data_type_state; // Pending updates from the previous session. // TODO(stanisc): crbug.com/529498: should remove pending updates. diff --git a/sync/internal_api/public/model_type_processor.h b/sync/internal_api/public/model_type_processor.h index 121055f..297b48f 100644 --- a/sync/internal_api/public/model_type_processor.h +++ b/sync/internal_api/public/model_type_processor.h @@ -8,6 +8,7 @@ #include "base/memory/scoped_ptr.h" #include "sync/base/sync_export.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" namespace syncer_v2 { class CommitQueue; @@ -24,13 +25,13 @@ class SYNC_EXPORT ModelTypeProcessor { // Informs this object that some of its commit requests have been // successfully serviced. virtual void OnCommitCompleted( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) = 0; // Informs this object that there are some incoming updates is should // handle. virtual void OnUpdateReceived( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) = 0; }; diff --git a/sync/internal_api/public/non_blocking_sync_common.cc b/sync/internal_api/public/non_blocking_sync_common.cc index f76895c..a8ad64f 100644 --- a/sync/internal_api/public/non_blocking_sync_common.cc +++ b/sync/internal_api/public/non_blocking_sync_common.cc @@ -6,10 +6,6 @@ namespace syncer_v2 { -DataTypeState::DataTypeState() {} - -DataTypeState::~DataTypeState() {} - CommitRequestData::CommitRequestData() {} CommitRequestData::~CommitRequestData() {} diff --git a/sync/internal_api/public/non_blocking_sync_common.h b/sync/internal_api/public/non_blocking_sync_common.h index 799dfca..b12ff01 100644 --- a/sync/internal_api/public/non_blocking_sync_common.h +++ b/sync/internal_api/public/non_blocking_sync_common.h @@ -19,32 +19,6 @@ namespace syncer_v2 { static const int64_t kUncommittedVersion = -1; -// Data-type global state that must be accessed and updated on the sync thread, -// but persisted on or through the model thread. -struct SYNC_EXPORT DataTypeState { - DataTypeState(); - ~DataTypeState(); - - // The latest progress markers received from the server. - sync_pb::DataTypeProgressMarker progress_marker; - - // A data type context. Sent to the server in every commit or update - // request. May be updated by either by responses from the server or - // requests made on the model thread. The interpretation of this value may - // be data-type specific. Many data types ignore it. - sync_pb::DataTypeContext type_context; - - // This value is set if this type's data should be encrypted on the server. - // If this key changes, the client will need to re-commit all of its local - // data to the server using the new encryption key. - std::string encryption_key_name; - - // This flag is set to true when the first download cycle is complete. The - // ModelTypeProcessor should not attempt to commit any items until this - // flag is set. - bool initial_sync_done = false; -}; - struct SYNC_EXPORT CommitRequestData { CommitRequestData(); ~CommitRequestData(); diff --git a/sync/internal_api/public/shared_model_type_processor.h b/sync/internal_api/public/shared_model_type_processor.h index 855e964..0d8ba15 100644 --- a/sync/internal_api/public/shared_model_type_processor.h +++ b/sync/internal_api/public/shared_model_type_processor.h @@ -20,6 +20,7 @@ #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/model_type_processor.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/sync.pb.h" namespace syncer_v2 { @@ -85,9 +86,9 @@ class SYNC_EXPORT SharedModelTypeProcessor : public ModelTypeProcessor, // ModelTypeProcessor implementation. void OnConnect(scoped_ptr<CommitQueue> worker) override; - void OnCommitCompleted(const DataTypeState& type_state, + void OnCommitCompleted(const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) override; - void OnUpdateReceived(const DataTypeState& type_state, + void OnUpdateReceived(const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) override; @@ -101,7 +102,7 @@ class SYNC_EXPORT SharedModelTypeProcessor : public ModelTypeProcessor, void FinishStart(); // Handle the first update received from the server after being enabled. - void OnInitialUpdateReceived(const DataTypeState& type_state, + void OnInitialUpdateReceived(const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates); @@ -114,7 +115,7 @@ class SYNC_EXPORT SharedModelTypeProcessor : public ModelTypeProcessor, void ClearTransientSyncState(); syncer::ModelType type_; - DataTypeState data_type_state_; + sync_pb::DataTypeState data_type_state_; // Stores the start callback in between Start() and FinishStart(). StartCallback start_callback_; diff --git a/sync/internal_api/public/simple_metadata_change_list.cc b/sync/internal_api/public/simple_metadata_change_list.cc index c1bb25f..999eda6 100644 --- a/sync/internal_api/public/simple_metadata_change_list.cc +++ b/sync/internal_api/public/simple_metadata_change_list.cc @@ -11,7 +11,7 @@ SimpleMetadataChangeList::SimpleMetadataChangeList() {} SimpleMetadataChangeList::~SimpleMetadataChangeList() {} void SimpleMetadataChangeList::UpdateDataTypeState( - const DataTypeState& data_type_state) { + const sync_pb::DataTypeState& data_type_state) { // TODO(skym): Implementation. } diff --git a/sync/internal_api/public/simple_metadata_change_list.h b/sync/internal_api/public/simple_metadata_change_list.h index aca0e69..f302b12 100644 --- a/sync/internal_api/public/simple_metadata_change_list.h +++ b/sync/internal_api/public/simple_metadata_change_list.h @@ -5,6 +5,8 @@ #ifndef SYNC_INTERNAL_API_PUBLIC_SIMPLE_METADATA_CHANGE_LIST_H_ #define SYNC_INTERNAL_API_PUBLIC_SIMPLE_METADATA_CHANGE_LIST_H_ +#include <string> + #include "sync/api/metadata_change_list.h" #include "sync/api/model_type_store.h" #include "sync/base/sync_export.h" @@ -19,7 +21,8 @@ class SYNC_EXPORT SimpleMetadataChangeList : public MetadataChangeList { SimpleMetadataChangeList(); ~SimpleMetadataChangeList() override; - void UpdateDataTypeState(const DataTypeState& data_type_state) override; + void UpdateDataTypeState( + const sync_pb::DataTypeState& data_type_state) override; void ClearDataTypeState() override; void UpdateMetadata(const std::string& client_tag, const sync_pb::EntityMetadata& metadata) override; diff --git a/sync/internal_api/public/test/fake_metadata_change_list.h b/sync/internal_api/public/test/fake_metadata_change_list.h index 6359602..3941f0a 100644 --- a/sync/internal_api/public/test/fake_metadata_change_list.h +++ b/sync/internal_api/public/test/fake_metadata_change_list.h @@ -5,10 +5,12 @@ #ifndef SYNC_INTERNAL_API_PUBLIC_TEST_FAKE_METADATA_CHANGE_LIST_H_ #define SYNC_INTERNAL_API_PUBLIC_TEST_FAKE_METADATA_CHANGE_LIST_H_ +#include <string> #include <vector> #include "sync/api/metadata_change_list.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/entity_metadata.pb.h" namespace syncer_v2 { @@ -22,7 +24,8 @@ class FakeMetadataChangeList : public MetadataChangeList { FakeMetadataChangeList(); ~FakeMetadataChangeList() override; - void UpdateDataTypeState(const DataTypeState& data_type_state) override; + void UpdateDataTypeState( + const sync_pb::DataTypeState& data_type_state) override; void ClearDataTypeState() override; void UpdateMetadata(const std::string& client_tag, const sync_pb::EntityMetadata& metadata) override; @@ -41,7 +44,7 @@ class FakeMetadataChangeList : public MetadataChangeList { Action action; std::string tag; - DataTypeState data_type_state; + sync_pb::DataTypeState data_type_state; sync_pb::EntityMetadata metadata; }; diff --git a/sync/internal_api/shared_model_type_processor.cc b/sync/internal_api/shared_model_type_processor.cc index dbf7bf8..4b6b983 100644 --- a/sync/internal_api/shared_model_type_processor.cc +++ b/sync/internal_api/shared_model_type_processor.cc @@ -26,9 +26,9 @@ class ModelTypeProcessorProxy : public ModelTypeProcessor { ~ModelTypeProcessorProxy() override; void OnConnect(scoped_ptr<CommitQueue> worker) override; - void OnCommitCompleted(const DataTypeState& type_state, + void OnCommitCompleted(const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) override; - void OnUpdateReceived(const DataTypeState& type_state, + void OnUpdateReceived(const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) override; @@ -51,7 +51,7 @@ void ModelTypeProcessorProxy::OnConnect(scoped_ptr<CommitQueue> worker) { } void ModelTypeProcessorProxy::OnCommitCompleted( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) { processor_task_runner_->PostTask( FROM_HERE, base::Bind(&ModelTypeProcessor::OnCommitCompleted, processor_, @@ -59,7 +59,7 @@ void ModelTypeProcessorProxy::OnCommitCompleted( } void ModelTypeProcessorProxy::OnUpdateReceived( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) { processor_task_runner_->PostTask( @@ -101,7 +101,7 @@ void SharedModelTypeProcessor::OnMetadataLoaded( DCHECK(entities_.empty()); DCHECK(!IsConnected()); - if (batch->GetDataTypeState().initial_sync_done) { + if (batch->GetDataTypeState().initial_sync_done()) { EntityMetadataMap metadata_map(batch->TakeAllMetadata()); for (auto it = metadata_map.begin(); it != metadata_map.end(); it++) { entities_.insert(std::make_pair( @@ -114,7 +114,7 @@ void SharedModelTypeProcessor::OnMetadataLoaded( // we have data but no metadata? } else { // First time syncing; initialize metadata. - data_type_state_.progress_marker.set_data_type_id( + data_type_state_.mutable_progress_marker()->set_data_type_id( GetSpecificsFieldNumberFromModelType(type_)); } @@ -274,7 +274,7 @@ void SharedModelTypeProcessor::FlushPendingCommitRequests() { return; // Don't send anything if the type is not ready to handle commits. - if (!data_type_state_.initial_sync_done) + if (!data_type_state_.initial_sync_done()) return; // TODO(rlarocque): Do something smarter than iterate here. @@ -292,7 +292,7 @@ void SharedModelTypeProcessor::FlushPendingCommitRequests() { } void SharedModelTypeProcessor::OnCommitCompleted( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) { scoped_ptr<MetadataChangeList> change_list = service_->CreateMetadataChangeList(); @@ -311,9 +311,10 @@ void SharedModelTypeProcessor::OnCommitCompleted( << " type: " << type_ << " client_tag: " << client_tag_hash; return; } else { - it->second->ReceiveCommitResponse( - response_data.id, response_data.sequence_number, - response_data.response_version, data_type_state_.encryption_key_name); + it->second->ReceiveCommitResponse(response_data.id, + response_data.sequence_number, + response_data.response_version, + data_type_state_.encryption_key_name()); // TODO(stanisc): crbug.com/573333: Delete case. // This might be the right place to clear a metadata entry that has // been deleted locally and confirmed deleted by the server. @@ -329,11 +330,10 @@ void SharedModelTypeProcessor::OnCommitCompleted( } void SharedModelTypeProcessor::OnUpdateReceived( - const DataTypeState& data_type_state, + const sync_pb::DataTypeState& data_type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) { - - if (!data_type_state_.initial_sync_done) { + if (!data_type_state_.initial_sync_done()) { OnInitialUpdateReceived(data_type_state, response_list, pending_updates); } @@ -342,8 +342,9 @@ void SharedModelTypeProcessor::OnUpdateReceived( EntityChangeList entity_changes; metadata_changes->UpdateDataTypeState(data_type_state); - bool got_new_encryption_requirements = data_type_state_.encryption_key_name != - data_type_state.encryption_key_name; + bool got_new_encryption_requirements = + data_type_state_.encryption_key_name() != + data_type_state.encryption_key_name(); data_type_state_ = data_type_state; for (auto list_it = response_list.begin(); list_it != response_list.end(); @@ -401,14 +402,14 @@ void SharedModelTypeProcessor::OnUpdateReceived( // If the received entity has out of date encryption, we schedule another // commit to fix it. - if (data_type_state_.encryption_key_name != + if (data_type_state_.encryption_key_name() != response_data.encryption_key_name) { DVLOG(2) << ModelTypeToString(type_) << ": Requesting re-encrypt commit " << response_data.encryption_key_name << " -> " - << data_type_state_.encryption_key_name; + << data_type_state_.encryption_key_name(); auto it2 = entities_.find(client_tag_hash); it2->second->UpdateDesiredEncryptionKey( - data_type_state_.encryption_key_name); + data_type_state_.encryption_key_name()); } } @@ -435,7 +436,7 @@ void SharedModelTypeProcessor::OnUpdateReceived( if (got_new_encryption_requirements) { for (auto it = entities_.begin(); it != entities_.end(); ++it) { it->second->UpdateDesiredEncryptionKey( - data_type_state_.encryption_key_name); + data_type_state_.encryption_key_name()); } } @@ -448,7 +449,7 @@ void SharedModelTypeProcessor::OnUpdateReceived( } void SharedModelTypeProcessor::OnInitialUpdateReceived( - const DataTypeState& data_type_state, + const sync_pb::DataTypeState& data_type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) { // TODO(maxbogue): crbug.com/569675: Generate metadata for all entities. diff --git a/sync/internal_api/shared_model_type_processor_unittest.cc b/sync/internal_api/shared_model_type_processor_unittest.cc index 741cfda..776179a 100644 --- a/sync/internal_api/shared_model_type_processor_unittest.cc +++ b/sync/internal_api/shared_model_type_processor_unittest.cc @@ -16,6 +16,7 @@ #include "sync/internal_api/public/non_blocking_sync_common.h" #include "sync/internal_api/public/test/fake_metadata_change_list.h" #include "sync/internal_api/public/test/fake_model_type_service.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/protocol/sync.pb.h" #include "sync/syncable/syncable_util.h" #include "sync/test/engine/mock_commit_queue.h" @@ -168,7 +169,7 @@ class SharedModelTypeProcessorTest : public ::testing::Test, MockCommitQueue* mock_queue_; scoped_ptr<MockCommitQueue> mock_queue_ptr_; - DataTypeState data_type_state_; + sync_pb::DataTypeState data_type_state_; // The last received EntityChangeList. scoped_ptr<EntityChangeList> entity_change_list_; @@ -188,7 +189,7 @@ SharedModelTypeProcessorTest::SharedModelTypeProcessorTest() SharedModelTypeProcessorTest::~SharedModelTypeProcessorTest() {} void SharedModelTypeProcessorTest::InitializeToReadyState() { - data_type_state_.initial_sync_done = true; + data_type_state_.set_initial_sync_done(true); OnMetadataLoaded(); Start(); // TODO(maxbogue): crbug.com/569642: Remove this once entity data is loaded @@ -261,7 +262,7 @@ void SharedModelTypeProcessorTest::DeleteItem(const std::string& tag, } void SharedModelTypeProcessorTest::OnInitialSyncDone() { - data_type_state_.initial_sync_done = true; + data_type_state_.set_initial_sync_done(true); UpdateResponseDataList empty_update_list; // TODO(stanisc): crbug/569645: replace this with loading the initial state @@ -352,7 +353,7 @@ void SharedModelTypeProcessorTest::SuccessfulCommitResponse( void SharedModelTypeProcessorTest::UpdateDesiredEncryptionKey( const std::string& key_name) { - data_type_state_.encryption_key_name = key_name; + data_type_state_.set_encryption_key_name(key_name); type_processor()->OnUpdateReceived(data_type_state_, UpdateResponseDataList(), UpdateResponseDataList()); } @@ -561,7 +562,7 @@ TEST_F(SharedModelTypeProcessorTest, CreateAndModifyWithOverrides) { entity_data->specifics.mutable_preference()->set_value("value2"); entity_data->non_unique_name = "name2"; entity_data->client_tag_hash = "hash"; - // TODO (skym): Consider removing this. The ID should never be changed by the + // TODO(skym): Consider removing this. The ID should never be changed by the // client once established. entity_data->id = "cid2"; @@ -588,7 +589,7 @@ TEST_F(SharedModelTypeProcessorTest, CreateAndModifyWithOverrides) { const FakeMetadataChangeList::Record& record2 = change_list.GetNthRecord(1); EXPECT_EQ(FakeMetadataChangeList::UPDATE_METADATA, record2.action); EXPECT_EQ("tag1", record2.tag); - // TODO (skym): Is this correct? + // TODO(skym): Is this correct? EXPECT_EQ("cid1", record2.metadata.server_id()); EXPECT_EQ("hash", record2.metadata.client_tag_hash()); @@ -919,11 +920,11 @@ TEST_F(SharedModelTypeProcessorTest, DISABLED_Disable) { // Once we're ready to commit, all three local items should consider // themselves uncommitted and pending for commit. // TODO(maxbogue): crbug.com/569645: Fix when data is loaded. - EXPECT_EQ(1U, GetNumCommitRequestLists()); - EXPECT_EQ(3U, GetNthCommitRequestList(0).size()); - EXPECT_TRUE(HasCommitRequestForTag("tag1")); - EXPECT_TRUE(HasCommitRequestForTag("tag2")); - EXPECT_TRUE(HasCommitRequestForTag("tag3")); + EXPECT_EQ(1U, GetNumCommitRequestLists()); + EXPECT_EQ(3U, GetNthCommitRequestList(0).size()); + EXPECT_TRUE(HasCommitRequestForTag("tag1")); + EXPECT_TRUE(HasCommitRequestForTag("tag2")); + EXPECT_TRUE(HasCommitRequestForTag("tag3")); } // Test receipt of pending updates. diff --git a/sync/internal_api/test/fake_metadata_change_list.cc b/sync/internal_api/test/fake_metadata_change_list.cc index 407066d..ceba2cb 100644 --- a/sync/internal_api/test/fake_metadata_change_list.cc +++ b/sync/internal_api/test/fake_metadata_change_list.cc @@ -17,7 +17,7 @@ FakeMetadataChangeList::Record::Record() {} FakeMetadataChangeList::Record::~Record() {} void FakeMetadataChangeList::UpdateDataTypeState( - const DataTypeState& data_type_state) { + const sync_pb::DataTypeState& data_type_state) { Record record; record.action = UPDATE_DATA_TYPE_STATE; record.data_type_state = data_type_state; diff --git a/sync/protocol/data_type_state.proto b/sync/protocol/data_type_state.proto new file mode 100644 index 0000000..ffe9326 --- /dev/null +++ b/sync/protocol/data_type_state.proto @@ -0,0 +1,34 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; +option retain_unknown_fields = true; + +package sync_pb; + +import "sync.proto"; + +// Sync proto to store data type global metadata in model type storage. +message DataTypeState { + // The latest progress markers received from the server. + optional DataTypeProgressMarker progress_marker = 1; + + // A data type context. Sent to the server in every commit or update + // request. May be updated by either responses from the server or requests + // made on the model thread. The interpretation of this value may be + // data-type specific. Many data types ignore it. + optional DataTypeContext type_context = 2; + + // This value is set if this type's data should be encrypted on the server. + // If this key changes, the client will need to re-commit all of its local + // data to the server using the new encryption key. + optional string encryption_key_name = 3; + + // This flag is set to true when the first download cycle is complete. The + // ModelTypeProcessor should not attempt to commit any items until this + // flag is set. + optional bool initial_sync_done = 4; +} diff --git a/sync/protocol/protocol.gypi b/sync/protocol/protocol.gypi index 21aa65d..183b7db 100644 --- a/sync/protocol/protocol.gypi +++ b/sync/protocol/protocol.gypi @@ -21,6 +21,7 @@ '<(sync_proto_sources_dir)/bookmark_specifics.proto', '<(sync_proto_sources_dir)/client_commands.proto', '<(sync_proto_sources_dir)/client_debug_info.proto', + '<(sync_proto_sources_dir)/data_type_state.proto', '<(sync_proto_sources_dir)/device_info_specifics.proto', '<(sync_proto_sources_dir)/dictionary_specifics.proto', '<(sync_proto_sources_dir)/encryption.proto', diff --git a/sync/sessions/model_type_registry_unittest.cc b/sync/sessions/model_type_registry_unittest.cc index d5b620e..079b37b 100644 --- a/sync/sessions/model_type_registry_unittest.cc +++ b/sync/sessions/model_type_registry_unittest.cc @@ -13,6 +13,7 @@ #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/shared_model_type_processor.h" #include "sync/internal_api/public/test/fake_model_type_service.h" +#include "sync/protocol/data_type_state.pb.h" #include "sync/test/engine/fake_model_worker.h" #include "sync/test/engine/mock_nudge_handler.h" #include "sync/test/engine/test_directory_setter_upper.h" @@ -29,15 +30,15 @@ class ModelTypeRegistryTest : public ::testing::Test, ModelTypeRegistry* registry(); - static syncer_v2::DataTypeState MakeInitialDataTypeState(ModelType type) { - syncer_v2::DataTypeState state; - state.progress_marker.set_data_type_id( + static sync_pb::DataTypeState MakeInitialDataTypeState(ModelType type) { + sync_pb::DataTypeState state; + state.mutable_progress_marker()->set_data_type_id( GetSpecificsFieldNumberFromModelType(type)); return state; } static scoped_ptr<syncer_v2::ActivationContext> MakeActivationContext( - const syncer_v2::DataTypeState& data_type_state, + const sync_pb::DataTypeState& data_type_state, const syncer_v2::UpdateResponseDataList& saved_pending_updates, scoped_ptr<syncer_v2::ModelTypeProcessor> type_processor) { scoped_ptr<syncer_v2::ActivationContext> context = diff --git a/sync/test/engine/mock_model_type_processor.cc b/sync/test/engine/mock_model_type_processor.cc index d4249e2..c22a847 100644 --- a/sync/test/engine/mock_model_type_processor.cc +++ b/sync/test/engine/mock_model_type_processor.cc @@ -23,7 +23,7 @@ void MockModelTypeProcessor::OnConnect(scoped_ptr<CommitQueue> commit_queue) { } void MockModelTypeProcessor::OnCommitCompleted( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) { base::Closure task = base::Bind(&MockModelTypeProcessor::OnCommitCompletedImpl, @@ -36,7 +36,7 @@ void MockModelTypeProcessor::OnCommitCompleted( } void MockModelTypeProcessor::OnUpdateReceived( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) { base::Closure task = base::Bind(&MockModelTypeProcessor::OnUpdateReceivedImpl, @@ -135,7 +135,8 @@ UpdateResponseDataList MockModelTypeProcessor::GetNthPendingUpdates( return received_pending_updates_[n]; } -DataTypeState MockModelTypeProcessor::GetNthTypeStateReceivedInUpdateResponse( +sync_pb::DataTypeState +MockModelTypeProcessor::GetNthTypeStateReceivedInUpdateResponse( size_t n) const { DCHECK_LT(n, GetNumUpdateResponses()); return type_states_received_on_update_[n]; @@ -151,7 +152,8 @@ CommitResponseDataList MockModelTypeProcessor::GetNthCommitResponse( return received_commit_responses_[n]; } -DataTypeState MockModelTypeProcessor::GetNthTypeStateReceivedInCommitResponse( +sync_pb::DataTypeState +MockModelTypeProcessor::GetNthTypeStateReceivedInCommitResponse( size_t n) const { DCHECK_LT(n, GetNumCommitResponses()); return type_states_received_on_commit_[n]; @@ -188,7 +190,7 @@ CommitResponseData MockModelTypeProcessor::GetCommitResponse( } void MockModelTypeProcessor::OnCommitCompletedImpl( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) { received_commit_responses_.push_back(response_list); type_states_received_on_commit_.push_back(type_state); @@ -203,7 +205,7 @@ void MockModelTypeProcessor::OnCommitCompletedImpl( } void MockModelTypeProcessor::OnUpdateReceivedImpl( - const DataTypeState& type_state, + const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) { received_update_responses_.push_back(response_list); diff --git a/sync/test/engine/mock_model_type_processor.h b/sync/test/engine/mock_model_type_processor.h index 120dedc8..a5a168e 100644 --- a/sync/test/engine/mock_model_type_processor.h +++ b/sync/test/engine/mock_model_type_processor.h @@ -16,6 +16,7 @@ #include "base/macros.h" #include "sync/internal_api/public/model_type_processor.h" #include "sync/internal_api/public/non_blocking_sync_common.h" +#include "sync/protocol/data_type_state.pb.h" namespace syncer_v2 { @@ -37,9 +38,9 @@ class MockModelTypeProcessor : public ModelTypeProcessor { // Implementation of ModelTypeProcessor. void OnConnect(scoped_ptr<CommitQueue> commit_queue) override; - void OnCommitCompleted(const DataTypeState& type_state, + void OnCommitCompleted(const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list) override; - void OnUpdateReceived(const DataTypeState& type_state, + void OnUpdateReceived(const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates) override; @@ -71,14 +72,16 @@ class MockModelTypeProcessor : public ModelTypeProcessor { size_t GetNumUpdateResponses() const; UpdateResponseDataList GetNthUpdateResponse(size_t n) const; UpdateResponseDataList GetNthPendingUpdates(size_t n) const; - DataTypeState GetNthTypeStateReceivedInUpdateResponse(size_t n) const; + sync_pb::DataTypeState GetNthTypeStateReceivedInUpdateResponse( + size_t n) const; // Getters to access the log of received commit responses. // // Does not includes repsonses that are in pending tasks. size_t GetNumCommitResponses() const; CommitResponseDataList GetNthCommitResponse(size_t n) const; - DataTypeState GetNthTypeStateReceivedInCommitResponse(size_t n) const; + sync_pb::DataTypeState GetNthTypeStateReceivedInCommitResponse( + size_t n) const; // Getters to access the lastest update response for a given tag_hash. bool HasUpdateResponse(const std::string& tag_hash) const; @@ -92,13 +95,13 @@ class MockModelTypeProcessor : public ModelTypeProcessor { // Process a received commit response. // // Implemented as an Impl method so we can defer its execution in some cases. - void OnCommitCompletedImpl(const DataTypeState& type_state, + void OnCommitCompletedImpl(const sync_pb::DataTypeState& type_state, const CommitResponseDataList& response_list); // Process a received update response. // // Implemented as an Impl method so we can defer its execution in some cases. - void OnUpdateReceivedImpl(const DataTypeState& type_state, + void OnUpdateReceivedImpl(const sync_pb::DataTypeState& type_state, const UpdateResponseDataList& response_list, const UpdateResponseDataList& pending_updates); @@ -125,8 +128,8 @@ class MockModelTypeProcessor : public ModelTypeProcessor { std::vector<CommitResponseDataList> received_commit_responses_; std::vector<UpdateResponseDataList> received_update_responses_; std::vector<UpdateResponseDataList> received_pending_updates_; - std::vector<DataTypeState> type_states_received_on_update_; - std::vector<DataTypeState> type_states_received_on_commit_; + std::vector<sync_pb::DataTypeState> type_states_received_on_update_; + std::vector<sync_pb::DataTypeState> type_states_received_on_commit_; // Latest responses received, indexed by tag_hash. std::map<const std::string, CommitResponseData> commit_response_items_; |