Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(701)

Unified Diff: components/sync/core/shared_model_type_processor.cc

Issue 2222373003: [Sync] Adding storage key concept for ModelTypeServices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing redundant hash value. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/sync/core/shared_model_type_processor.cc
diff --git a/components/sync/core/shared_model_type_processor.cc b/components/sync/core/shared_model_type_processor.cc
index 133e23f52edb53ff35234d391330606de4f3d27f..0deff59592fb2720cf76ff4638f546d31d3b020b 100644
--- a/components/sync/core/shared_model_type_processor.cc
+++ b/components/sync/core/shared_model_type_processor.cc
@@ -137,8 +137,10 @@ void SharedModelTypeProcessor::OnMetadataLoaded(
std::unique_ptr<ProcessorEntityTracker> entity =
ProcessorEntityTracker::CreateFromMetadata(it->first, &it->second);
if (entity->RequiresCommitData()) {
- entities_to_commit.push_back(entity->client_tag());
+ entities_to_commit.push_back(entity->storage_key());
}
+ storage_key_to_tag_hash_[entity->storage_key()] =
+ entity->metadata().client_tag_hash();
entities_[entity->metadata().client_tag_hash()] = std::move(entity);
}
data_type_state_ = batch->GetDataTypeState();
@@ -193,7 +195,7 @@ void SharedModelTypeProcessor::DisableSync() {
std::unique_ptr<MetadataChangeList> change_list =
service_->CreateMetadataChangeList();
for (auto it = entities_.begin(); it != entities_.end(); ++it) {
- change_list->ClearMetadata(it->second->client_tag());
+ change_list->ClearMetadata(it->second->storage_key());
}
change_list->ClearDataTypeState();
// Nothing to do if this fails, so just ignore the error it might return.
@@ -234,7 +236,7 @@ void SharedModelTypeProcessor::DisconnectSync() {
}
}
-void SharedModelTypeProcessor::Put(const std::string& tag,
+void SharedModelTypeProcessor::Put(const std::string& storage_key,
std::unique_ptr<EntityData> data,
MetadataChangeList* metadata_change_list) {
DCHECK(IsAllowingChanges());
@@ -249,7 +251,7 @@ void SharedModelTypeProcessor::Put(const std::string& tag,
}
// Fill in some data.
- data->client_tag_hash = GetHashForTag(tag);
+ data->client_tag_hash = GetClientTagHash(storage_key, *data);
if (data->modification_time.is_null()) {
data->modification_time = base::Time::Now();
}
@@ -261,20 +263,20 @@ void SharedModelTypeProcessor::Put(const std::string& tag,
if (data->creation_time.is_null()) {
data->creation_time = data->modification_time;
}
- entity = CreateEntity(tag, *data);
+ entity = CreateEntity(storage_key, *data);
} else if (entity->MatchesData(*data)) {
// Ignore changes that don't actually change anything.
return;
}
entity->MakeLocalChange(std::move(data));
- metadata_change_list->UpdateMetadata(tag, entity->metadata());
+ metadata_change_list->UpdateMetadata(storage_key, entity->metadata());
FlushPendingCommitRequests();
}
void SharedModelTypeProcessor::Delete(
- const std::string& tag,
+ const std::string& storage_key,
MetadataChangeList* metadata_change_list) {
DCHECK(IsAllowingChanges());
@@ -283,18 +285,18 @@ void SharedModelTypeProcessor::Delete(
return;
}
- ProcessorEntityTracker* entity = GetEntityForTag(tag);
+ ProcessorEntityTracker* entity = GetEntityForStorageKey(storage_key);
if (entity == nullptr) {
// That's unusual, but not necessarily a bad thing.
// Missing is as good as deleted as far as the model is concerned.
DLOG(WARNING) << "Attempted to delete missing item."
- << " client tag: " << tag;
+ << " storage key: " << storage_key;
return;
}
entity->Delete();
- metadata_change_list->UpdateMetadata(tag, entity->metadata());
+ metadata_change_list->UpdateMetadata(storage_key, entity->metadata());
FlushPendingCommitRequests();
}
@@ -344,10 +346,10 @@ void SharedModelTypeProcessor::OnCommitCompleted(
entity->ReceiveCommitResponse(data);
if (entity->CanClearMetadata()) {
- change_list->ClearMetadata(entity->client_tag());
+ change_list->ClearMetadata(entity->storage_key());
entities_.erase(entity->metadata().client_tag_hash());
} else {
- change_list->UpdateMetadata(entity->client_tag(), entity->metadata());
+ change_list->UpdateMetadata(entity->storage_key(), entity->metadata());
}
}
@@ -390,15 +392,15 @@ void SharedModelTypeProcessor::OnUpdateReceived(
}
if (entity->CanClearMetadata()) {
- metadata_changes->ClearMetadata(entity->client_tag());
+ metadata_changes->ClearMetadata(entity->storage_key());
entities_.erase(entity->metadata().client_tag_hash());
} else {
- metadata_changes->UpdateMetadata(entity->client_tag(),
+ metadata_changes->UpdateMetadata(entity->storage_key(),
entity->metadata());
}
if (got_new_encryption_requirements) {
- already_updated.insert(entity->client_tag());
+ already_updated.insert(entity->storage_key());
}
}
@@ -433,7 +435,7 @@ ProcessorEntityTracker* SharedModelTypeProcessor::ProcessUpdate(
entity = CreateEntity(data);
entity_changes->push_back(
- EntityChange::CreateAdd(entity->client_tag(), update.entity));
+ EntityChange::CreateAdd(entity->storage_key(), update.entity));
entity->RecordAcceptedUpdate(update);
} else if (entity->UpdateIsReflection(update.response_version)) {
// Seen this update before; just ignore it.
@@ -448,12 +450,13 @@ ProcessorEntityTracker* SharedModelTypeProcessor::ProcessUpdate(
// can never be deleted at this point because it would have either been
// acked (the add case) or pending (the conflict case).
DCHECK(!entity->metadata().is_deleted());
- entity_changes->push_back(EntityChange::CreateDelete(entity->client_tag()));
+ entity_changes->push_back(
+ EntityChange::CreateDelete(entity->storage_key()));
entity->RecordAcceptedUpdate(update);
} else if (!entity->MatchesData(data)) {
// Specifics have changed, so update the service.
entity_changes->push_back(
- EntityChange::CreateUpdate(entity->client_tag(), update.entity));
+ EntityChange::CreateUpdate(entity->storage_key(), update.entity));
entity->RecordAcceptedUpdate(update);
} else {
// No data change; still record that the update was received.
@@ -529,7 +532,7 @@ ConflictResolution::Type SharedModelTypeProcessor::ResolveConflict(
entity->RecordForcedUpdate(update);
// Update client data to match server.
changes->push_back(
- EntityChange::CreateUpdate(entity->client_tag(), update.entity));
+ EntityChange::CreateUpdate(entity->storage_key(), update.entity));
break;
case ConflictResolution::USE_NEW:
// Record that we received the update.
@@ -537,7 +540,7 @@ ConflictResolution::Type SharedModelTypeProcessor::ResolveConflict(
// Make a new pending commit to update the server.
entity->MakeLocalChange(std::move(new_data));
// Update the client with the new entity.
- changes->push_back(EntityChange::CreateUpdate(entity->client_tag(),
+ changes->push_back(EntityChange::CreateUpdate(entity->storage_key(),
entity->commit_data()));
break;
case ConflictResolution::TYPE_SIZE:
@@ -552,18 +555,18 @@ ConflictResolution::Type SharedModelTypeProcessor::ResolveConflict(
void SharedModelTypeProcessor::RecommitAllForEncryption(
std::unordered_set<std::string> already_updated,
MetadataChangeList* metadata_changes) {
- ModelTypeService::ClientTagList entities_needing_data;
+ ModelTypeService::StorageKeyList entities_needing_data;
for (auto it = entities_.begin(); it != entities_.end(); ++it) {
ProcessorEntityTracker* entity = it->second.get();
- if (already_updated.find(entity->client_tag()) != already_updated.end()) {
+ if (already_updated.find(entity->storage_key()) != already_updated.end()) {
continue;
}
entity->IncrementSequenceNumber();
if (entity->RequiresCommitData()) {
- entities_needing_data.push_back(entity->client_tag());
+ entities_needing_data.push_back(entity->storage_key());
}
- metadata_changes->UpdateMetadata(entity->client_tag(), entity->metadata());
+ metadata_changes->UpdateMetadata(entity->storage_key(), entity->metadata());
}
if (!entities_needing_data.empty()) {
@@ -592,10 +595,10 @@ void SharedModelTypeProcessor::OnInitialUpdateReceived(
for (const UpdateResponseData& update : updates) {
ProcessorEntityTracker* entity = CreateEntity(update.entity.value());
- const std::string& tag = entity->client_tag();
+ const std::string& storage_key = entity->storage_key();
entity->RecordAcceptedUpdate(update);
- metadata_changes->UpdateMetadata(tag, entity->metadata());
- data_map[tag] = update.entity;
+ metadata_changes->UpdateMetadata(storage_key, entity->metadata());
+ data_map[storage_key] = update.entity;
}
// Let the service handle associating and merging the data.
@@ -642,8 +645,8 @@ void SharedModelTypeProcessor::OnDataLoadedForReEncryption(
void SharedModelTypeProcessor::ConsumeDataBatch(
std::unique_ptr<DataBatch> data_batch) {
while (data_batch->HasNext()) {
- TagAndData data = data_batch->Next();
- ProcessorEntityTracker* entity = GetEntityForTag(data.first);
+ KeyAndData data = data_batch->Next();
+ ProcessorEntityTracker* entity = GetEntityForStorageKey(data.first);
// If the entity wasn't deleted or updated with new commit.
if (entity != nullptr && entity->RequiresCommitData()) {
entity->CacheCommitData(data.second.get());
@@ -655,9 +658,21 @@ std::string SharedModelTypeProcessor::GetHashForTag(const std::string& tag) {
return syncer::syncable::GenerateSyncableHash(type_, tag);
}
-ProcessorEntityTracker* SharedModelTypeProcessor::GetEntityForTag(
- const std::string& tag) {
- return GetEntityForTagHash(GetHashForTag(tag));
+std::string SharedModelTypeProcessor::GetClientTagHash(
+ const std::string& storage_key,
+ const EntityData& data) {
+ auto iter = storage_key_to_tag_hash_.find(storage_key);
+ return iter == storage_key_to_tag_hash_.end()
+ ? GetHashForTag(service_->GetClientTag(data))
+ : iter->second;
+}
+
+ProcessorEntityTracker* SharedModelTypeProcessor::GetEntityForStorageKey(
+ const std::string& storage_key) {
+ auto iter = storage_key_to_tag_hash_.find(storage_key);
+ return iter == storage_key_to_tag_hash_.end()
+ ? nullptr
+ : GetEntityForTagHash(iter->second);
}
ProcessorEntityTracker* SharedModelTypeProcessor::GetEntityForTagHash(
@@ -667,24 +682,25 @@ ProcessorEntityTracker* SharedModelTypeProcessor::GetEntityForTagHash(
}
ProcessorEntityTracker* SharedModelTypeProcessor::CreateEntity(
- const std::string& tag,
+ const std::string& storage_key,
const EntityData& data) {
DCHECK(entities_.find(data.client_tag_hash) == entities_.end());
+ DCHECK(storage_key_to_tag_hash_.find(storage_key) ==
+ storage_key_to_tag_hash_.end());
std::unique_ptr<ProcessorEntityTracker> entity =
- ProcessorEntityTracker::CreateNew(tag, data.client_tag_hash, data.id,
- data.creation_time);
+ ProcessorEntityTracker::CreateNew(storage_key, data.client_tag_hash,
+ data.id, data.creation_time);
ProcessorEntityTracker* entity_ptr = entity.get();
entities_[data.client_tag_hash] = std::move(entity);
+ storage_key_to_tag_hash_[storage_key] = data.client_tag_hash;
return entity_ptr;
}
ProcessorEntityTracker* SharedModelTypeProcessor::CreateEntity(
const EntityData& data) {
- // Let the service define |client_tag| based on the entity data.
- const std::string tag = service_->GetClientTag(data);
- // This constraint may be relaxed in the future.
- DCHECK_EQ(data.client_tag_hash, GetHashForTag(tag));
- return CreateEntity(tag, data);
+ // Verify the tag hash matches, may be relaxed in the future.
+ DCHECK_EQ(data.client_tag_hash, GetHashForTag(service_->GetClientTag(data)));
+ return CreateEntity(service_->GetStorageKey(data), data);
}
} // namespace syncer_v2
« no previous file with comments | « components/sync/core/shared_model_type_processor.h ('k') | components/sync/core/shared_model_type_processor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698