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

Unified Diff: components/sync_driver/device_info_service.cc

Issue 1888923003: [Sync] DeviceInfoService should format ClientTag in backwards compatible way (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Sky's and Max's comments. Created 4 years, 8 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_driver/device_info_service.cc
diff --git a/components/sync_driver/device_info_service.cc b/components/sync_driver/device_info_service.cc
index 8318e5d290755509967c4802848a0a827806efe5..3453104e9c2f64649433285bd9dd95c7eeb65871 100644
--- a/components/sync_driver/device_info_service.cc
+++ b/components/sync_driver/device_info_service.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/location.h"
+#include "base/strings/string_util.h"
#include "sync/api/entity_change.h"
#include "sync/api/metadata_batch.h"
#include "sync/api/sync_error.h"
@@ -40,6 +41,12 @@ using RecordList = ModelTypeStore::RecordList;
using Result = ModelTypeStore::Result;
using WriteBatch = ModelTypeStore::WriteBatch;
+namespace {
+
+const char kClientTagPrefix[] = "DeviceInfo_";
+
+} // namespace
+
DeviceInfoService::DeviceInfoService(
sync_driver::LocalDeviceInfoProvider* local_device_info_provider,
const StoreFactoryFunction& callback,
@@ -85,36 +92,37 @@ SyncError DeviceInfoService::MergeSyncData(
// data is blown away. However, this simplification is being ignored here and
// a full difference is going to be calculated to explore what other service
// implementations may look like.
- std::set<std::string> local_tags_to_put;
+ std::set<std::string> local_guids_to_put;
for (const auto& kv : all_data_) {
- local_tags_to_put.insert(kv.first);
+ local_guids_to_put.insert(kv.first);
}
bool has_changes = false;
const DeviceInfo* local_info =
local_device_info_provider_->GetLocalDeviceInfo();
- std::string local_tag = local_info->guid();
+ std::string local_guid = local_info->guid();
scoped_ptr<WriteBatch> batch = store_->CreateWriteBatch();
for (const auto& kv : entity_data_map) {
- const std::string tag = GetClientTag(kv.second.value());
const DeviceInfoSpecifics& specifics =
kv.second.value().specifics.device_info();
- if (tag == local_tag) {
+ DCHECK_EQ(kv.first, SpecificsToTag(specifics));
+ if (specifics.cache_guid() == local_guid) {
// Don't Put local data if it's the same as the remote copy.
if (local_info->Equals(*CopyToModel(specifics))) {
- local_tags_to_put.erase(tag);
+ local_guids_to_put.erase(local_guid);
}
} else {
// Remote data wins conflicts.
- local_tags_to_put.erase(tag);
+ local_guids_to_put.erase(specifics.cache_guid());
has_changes = true;
StoreSpecifics(make_scoped_ptr(new DeviceInfoSpecifics(specifics)),
batch.get());
}
}
- for (const std::string& tag : local_tags_to_put) {
- change_processor()->Put(tag, CopyToEntityData(*all_data_[tag]),
+ for (const std::string& guid : local_guids_to_put) {
+ change_processor()->Put(SpecificsToTag(*all_data_[guid]),
+ CopyToEntityData(*all_data_[guid]),
metadata_change_list.get());
}
@@ -136,19 +144,19 @@ SyncError DeviceInfoService::ApplySyncChanges(
scoped_ptr<WriteBatch> batch = store_->CreateWriteBatch();
bool has_changes = false;
for (EntityChange& change : entity_changes) {
- const std::string tag = change.client_tag();
+ const std::string guid = TagToCacheGuid(change.client_tag());
// Each device is the authoritative source for itself, ignore any remote
// changes that have our local cache guid.
- if (tag == local_device_info_provider_->GetLocalDeviceInfo()->guid()) {
+ if (guid == local_device_info_provider_->GetLocalDeviceInfo()->guid()) {
continue;
}
if (change.type() == EntityChange::ACTION_DELETE) {
- has_changes |= DeleteSpecifics(tag, batch.get());
+ has_changes |= DeleteSpecifics(guid, batch.get());
} else {
const DeviceInfoSpecifics& specifics =
change.data().specifics.device_info();
- DCHECK(tag == specifics.cache_guid());
+ DCHECK(guid == specifics.cache_guid());
StoreSpecifics(make_scoped_ptr(new DeviceInfoSpecifics(specifics)),
batch.get());
has_changes = true;
@@ -173,8 +181,9 @@ void DeviceInfoService::GetData(ClientTagList client_tags,
scoped_ptr<DataBatchImpl> batch(new DataBatchImpl());
for (const auto& tag : client_tags) {
- const auto iter = all_data_.find(tag);
+ const auto& iter = all_data_.find(TagToCacheGuid(tag));
if (iter != all_data_.end()) {
+ DCHECK_EQ(tag, SpecificsToTag(*iter->second));
batch->Put(tag, CopyToEntityData(*iter->second));
}
}
@@ -193,14 +202,14 @@ void DeviceInfoService::GetAllData(DataCallback callback) {
scoped_ptr<DataBatchImpl> batch(new DataBatchImpl());
for (const auto& kv : all_data_) {
- batch->Put(kv.first, CopyToEntityData(*kv.second));
+ batch->Put(SpecificsToTag(*kv.second), CopyToEntityData(*kv.second));
}
callback.Run(syncer::SyncError(), std::move(batch));
}
std::string DeviceInfoService::GetClientTag(const EntityData& entity_data) {
DCHECK(entity_data.specifics.has_device_info());
- return entity_data.specifics.device_info().cache_guid();
+ return SpecificsToTag(entity_data.specifics.device_info());
}
void DeviceInfoService::OnChangeProcessorSet() {
@@ -258,6 +267,16 @@ void DeviceInfoService::NotifyObservers() {
FOR_EACH_OBSERVER(Observer, observers_, OnDeviceInfoChange());
}
+std::string DeviceInfoService::SpecificsToTag(
+ const sync_pb::DeviceInfoSpecifics& specifics) {
+ return kClientTagPrefix + specifics.cache_guid();
+}
+
+std::string DeviceInfoService::TagToCacheGuid(const std::string& tag) {
+ DCHECK(base::StartsWith(tag, kClientTagPrefix, base::CompareCase::SENSITIVE));
+ return tag.substr(strlen(kClientTagPrefix));
+}
+
// TODO(skym): crbug.com/543406: It might not make sense for this to be a
// scoped_ptr.
// Static.
@@ -288,26 +307,27 @@ scoped_ptr<EntityData> DeviceInfoService::CopyToEntityData(
const DeviceInfoSpecifics& specifics) {
scoped_ptr<EntityData> entity_data(new EntityData());
*entity_data->specifics.mutable_device_info() = specifics;
+ entity_data->non_unique_name = specifics.client_name();
return entity_data;
}
void DeviceInfoService::StoreSpecifics(
scoped_ptr<DeviceInfoSpecifics> specifics,
WriteBatch* batch) {
- const std::string tag = specifics->cache_guid();
+ const std::string guid = specifics->cache_guid();
DVLOG(1) << "Storing DEVICE_INFO for " << specifics->client_name()
- << " with ID " << tag;
- store_->WriteData(batch, tag, specifics->SerializeAsString());
- all_data_[tag] = std::move(specifics);
+ << " with ID " << guid;
+ store_->WriteData(batch, guid, specifics->SerializeAsString());
+ all_data_[guid] = std::move(specifics);
}
-bool DeviceInfoService::DeleteSpecifics(const std::string& tag,
+bool DeviceInfoService::DeleteSpecifics(const std::string& guid,
WriteBatch* batch) {
- ClientIdToSpecifics::const_iterator iter = all_data_.find(tag);
+ ClientIdToSpecifics::const_iterator iter = all_data_.find(guid);
if (iter != all_data_.end()) {
DVLOG(1) << "Deleting DEVICE_INFO for " << iter->second->client_name()
- << " with ID " << tag;
- store_->DeleteData(batch, tag);
+ << " with ID " << guid;
+ store_->DeleteData(batch, guid);
all_data_.erase(iter);
return true;
} else {
@@ -346,7 +366,7 @@ void DeviceInfoService::OnReadAllData(Result result,
scoped_ptr<DeviceInfoSpecifics> specifics(
make_scoped_ptr(new DeviceInfoSpecifics()));
if (specifics->ParseFromString(r.value)) {
- all_data_[r.id] = std::move(specifics);
+ all_data_[specifics->cache_guid()] = std::move(specifics);
} else {
LOG(WARNING) << "Failed to deserialize specifics.";
// TODO(skym, crbug.com/582460): Handle unrecoverable initialization
@@ -449,7 +469,8 @@ void DeviceInfoService::PutAndStore(const DeviceInfo& device_info) {
scoped_ptr<MetadataChangeList> metadata_change_list =
CreateMetadataChangeList();
- change_processor()->Put(device_info.guid(), CopyToEntityData(*specifics),
+ change_processor()->Put(SpecificsToTag(*specifics),
+ CopyToEntityData(*specifics),
metadata_change_list.get());
scoped_ptr<WriteBatch> batch = store_->CreateWriteBatch();
« no previous file with comments | « components/sync_driver/device_info_service.h ('k') | components/sync_driver/device_info_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698