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

Unified Diff: components/sync/device_info/device_info_service.cc

Issue 2461723002: [Sync] DeviceInfoService static method and error cleanup. (Closed)
Patch Set: removing stdint.h from device_info_service.h Created 4 years, 2 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/device_info/device_info_service.cc
diff --git a/components/sync/device_info/device_info_service.cc b/components/sync/device_info/device_info_service.cc
index 82172a4773d34cb4da2329837cb000c95389a0a3..b3952bc571ac5e95e47879de24579dda089b927d 100644
--- a/components/sync/device_info/device_info_service.cc
+++ b/components/sync/device_info/device_info_service.cc
@@ -4,6 +4,8 @@
#include "components/sync/device_info/device_info_service.h"
+#include <stdint.h>
+
#include <algorithm>
#include <set>
#include <utility>
@@ -34,6 +36,54 @@ using RecordList = ModelTypeStore::RecordList;
using Result = ModelTypeStore::Result;
using WriteBatch = ModelTypeStore::WriteBatch;
+namespace {
+
+// Find the timestamp for the last time this |device_info| was edited.
+Time GetLastUpdateTime(const DeviceInfoSpecifics& specifics) {
+ if (specifics.has_last_updated_timestamp()) {
+ return ProtoTimeToTime(specifics.last_updated_timestamp());
+ } else {
+ return Time();
+ }
+}
+
+// Converts DeviceInfoSpecifics into a freshly allocated DeviceInfo.
+std::unique_ptr<DeviceInfo> SpecificsToModel(
+ const DeviceInfoSpecifics& specifics) {
+ return base::MakeUnique<DeviceInfo>(
+ specifics.cache_guid(), specifics.client_name(),
+ specifics.chrome_version(), specifics.sync_user_agent(),
+ specifics.device_type(), specifics.signin_scoped_device_id());
+}
+
+// Allocate a EntityData and copies |specifics| into it.
+std::unique_ptr<EntityData> CopyToEntityData(
+ const DeviceInfoSpecifics& specifics) {
+ auto entity_data = base::MakeUnique<EntityData>();
+ *entity_data->specifics.mutable_device_info() = specifics;
+ entity_data->non_unique_name = specifics.client_name();
+ return entity_data;
+}
+
+// Converts DeviceInfo into a freshly allocated DeviceInfoSpecifics. Takes
+// |last_updated_timestamp| to set because the model object does not contain
+// this concept.
+std::unique_ptr<DeviceInfoSpecifics> ModelToSpecifics(
+ const DeviceInfo& info,
+ int64_t last_updated_timestamp) {
+ auto specifics = base::MakeUnique<DeviceInfoSpecifics>();
+ specifics->set_cache_guid(info.guid());
+ specifics->set_client_name(info.client_name());
+ specifics->set_chrome_version(info.chrome_version());
+ specifics->set_sync_user_agent(info.sync_user_agent());
+ specifics->set_device_type(info.device_type());
+ specifics->set_signin_scoped_device_id(info.signin_scoped_device_id());
+ specifics->set_last_updated_timestamp(last_updated_timestamp);
+ return specifics;
+}
+
+} // namespace
+
DeviceInfoService::DeviceInfoService(
LocalDeviceInfoProvider* local_device_info_provider,
const StoreFactoryFunction& callback,
@@ -90,7 +140,7 @@ SyncError DeviceInfoService::MergeSyncData(
DCHECK_EQ(kv.first, specifics.cache_guid());
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))) {
+ if (local_info->Equals(*SpecificsToModel(specifics))) {
local_guids_to_put.erase(local_guid);
} else {
// This device is valid right now and this entry is about to be
@@ -215,7 +265,7 @@ std::unique_ptr<DeviceInfo> DeviceInfoService::GetDeviceInfo(
if (iter == all_data_.end()) {
return std::unique_ptr<DeviceInfo>();
}
- return CopyToModel(*iter->second);
+ return SpecificsToModel(*iter->second);
}
std::vector<std::unique_ptr<DeviceInfo>> DeviceInfoService::GetAllDeviceInfo()
@@ -223,7 +273,7 @@ std::vector<std::unique_ptr<DeviceInfo>> DeviceInfoService::GetAllDeviceInfo()
std::vector<std::unique_ptr<DeviceInfo>> list;
for (ClientIdToSpecifics::const_iterator iter = all_data_.begin();
iter != all_data_.end(); ++iter) {
- list.push_back(CopyToModel(*iter->second));
+ list.push_back(SpecificsToModel(*iter->second));
}
return list;
}
@@ -245,44 +295,10 @@ void DeviceInfoService::NotifyObservers() {
observer.OnDeviceInfoChange();
}
-// Static.
-std::unique_ptr<DeviceInfoSpecifics> DeviceInfoService::CopyToSpecifics(
- const DeviceInfo& info) {
- std::unique_ptr<DeviceInfoSpecifics> specifics =
- base::WrapUnique(new DeviceInfoSpecifics);
- specifics->set_cache_guid(info.guid());
- specifics->set_client_name(info.client_name());
- specifics->set_chrome_version(info.chrome_version());
- specifics->set_sync_user_agent(info.sync_user_agent());
- specifics->set_device_type(info.device_type());
- specifics->set_signin_scoped_device_id(info.signin_scoped_device_id());
- return specifics;
-}
-
-// Static.
-std::unique_ptr<DeviceInfo> DeviceInfoService::CopyToModel(
- const DeviceInfoSpecifics& specifics) {
- return base::MakeUnique<DeviceInfo>(
- specifics.cache_guid(), specifics.client_name(),
- specifics.chrome_version(), specifics.sync_user_agent(),
- specifics.device_type(), specifics.signin_scoped_device_id());
-}
-
-// Static.
-std::unique_ptr<EntityData> DeviceInfoService::CopyToEntityData(
- const DeviceInfoSpecifics& specifics) {
- std::unique_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(
std::unique_ptr<DeviceInfoSpecifics> specifics,
WriteBatch* batch) {
const std::string guid = specifics->cache_guid();
- DVLOG(1) << "Storing DEVICE_INFO for " << specifics->client_name()
- << " with ID " << guid;
store_->WriteData(batch, guid, specifics->SerializeAsString());
all_data_[guid] = std::move(specifics);
}
@@ -291,8 +307,6 @@ bool DeviceInfoService::DeleteSpecifics(const std::string& guid,
WriteBatch* batch) {
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 " << guid;
store_->DeleteData(batch, guid);
all_data_.erase(iter);
return true;
@@ -320,8 +334,6 @@ void DeviceInfoService::OnStoreCreated(Result result,
base::Bind(&DeviceInfoService::OnReadAllData, base::AsWeakPtr(this)));
} else {
ReportStartupErrorToSync("ModelTypeStore creation failed.");
- // TODO(skym, crbug.com/582460): Handle unrecoverable initialization
- // failure.
}
}
@@ -329,8 +341,6 @@ void DeviceInfoService::OnReadAllData(Result result,
std::unique_ptr<RecordList> record_list) {
if (result != Result::SUCCESS) {
ReportStartupErrorToSync("Initial load of data failed.");
- // TODO(skym, crbug.com/582460): Handle unrecoverable initialization
- // failure.
return;
}
@@ -341,8 +351,6 @@ void DeviceInfoService::OnReadAllData(Result result,
all_data_[specifics->cache_guid()] = std::move(specifics);
} else {
ReportStartupErrorToSync("Failed to deserialize specifics.");
- // TODO(skym, crbug.com/582460): Handle unrecoverable initialization
- // failure.
}
}
@@ -362,47 +370,36 @@ void DeviceInfoService::OnReadAllMetadata(
std::unique_ptr<RecordList> metadata_records,
const std::string& global_metadata) {
if (result != Result::SUCCESS) {
- // Store has encountered some serious error. We should still be able to
- // continue as a read only service, since if we got this far we must have
- // loaded all data out succesfully.
ReportStartupErrorToSync("Load of metadata completely failed.");
return;
}
- std::unique_ptr<MetadataBatch> batch(new MetadataBatch());
+ auto batch = base::MakeUnique<MetadataBatch>();
ModelTypeState state;
if (state.ParseFromString(global_metadata)) {
batch->SetModelTypeState(state);
} else {
- // TODO(skym): How bad is this scenario? We may be able to just give an
- // empty batch to the processor and we'll treat corrupted data type state
- // as no data type state at all. The question is do we want to add any of
- // the entity metadata to the batch or completely skip that step? We're
- // going to have to perform a merge shortly. Does this decision/logic even
- // belong in this service?
- change_processor()->OnMetadataLoaded(
- change_processor()->CreateAndUploadError(
- FROM_HERE, "Failed to deserialize global metadata."),
- nullptr);
+ ReportStartupErrorToSync("Failed to deserialize global metadata.");
+ return;
}
+
for (const Record& r : *metadata_records.get()) {
sync_pb::EntityMetadata entity_metadata;
if (entity_metadata.ParseFromString(r.value)) {
batch->AddMetadata(r.id, entity_metadata);
} else {
- // TODO(skym): This really isn't too bad. We just want to regenerate
- // metadata for this particular entity. Unfortunately there isn't a
- // convenient way to tell the processor to do this.
- LOG(WARNING) << "Failed to deserialize entity metadata.";
+ ReportStartupErrorToSync("Failed to deserialize entity metadata.");
}
}
+
change_processor()->OnMetadataLoaded(SyncError(), std::move(batch));
ReconcileLocalAndStored();
}
void DeviceInfoService::OnCommit(Result result) {
if (result != Result::SUCCESS) {
- LOG(WARNING) << "Failed a write to store.";
+ change_processor()->CreateAndUploadError(FROM_HERE,
+ "Failed a write to store.");
}
}
@@ -421,7 +418,7 @@ void DeviceInfoService::ReconcileLocalAndStored() {
// Convert to DeviceInfo for Equals function.
if (iter != all_data_.end() &&
- current_info->Equals(*CopyToModel(*iter->second))) {
+ current_info->Equals(*SpecificsToModel(*iter->second))) {
const TimeDelta pulse_delay(DeviceInfoUtil::CalculatePulseDelay(
GetLastUpdateTime(*iter->second), Time::Now()));
if (!pulse_delay.is_zero()) {
@@ -442,9 +439,8 @@ void DeviceInfoService::SendLocalData() {
// is enabled later.
if (local_device_info_provider_->GetLocalDeviceInfo() != nullptr) {
std::unique_ptr<DeviceInfoSpecifics> specifics =
- CopyToSpecifics(*local_device_info_provider_->GetLocalDeviceInfo());
- specifics->set_last_updated_timestamp(TimeToProtoTime(Time::Now()));
-
+ ModelToSpecifics(*local_device_info_provider_->GetLocalDeviceInfo(),
+ TimeToProtoTime(Time::Now()));
std::unique_ptr<MetadataChangeList> metadata_change_list =
CreateMetadataChangeList();
if (change_processor()->IsTrackingMetadata()) {
@@ -492,14 +488,4 @@ void DeviceInfoService::ReportStartupErrorToSync(const std::string& msg) {
change_processor()->CreateAndUploadError(FROM_HERE, msg), nullptr);
}
-// static
-Time DeviceInfoService::GetLastUpdateTime(
- const DeviceInfoSpecifics& specifics) {
- if (specifics.has_last_updated_timestamp()) {
- return ProtoTimeToTime(specifics.last_updated_timestamp());
- } else {
- return Time();
- }
-}
-
} // namespace syncer
« no previous file with comments | « components/sync/device_info/device_info_service.h ('k') | components/sync/device_info/device_info_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698