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

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

Issue 2618483003: [Sync] Introduce ModelError for USS error handling. (Closed)
Patch Set: Address comments. Created 3 years, 11 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/model_impl/shared_model_type_processor.cc
diff --git a/components/sync/model_impl/shared_model_type_processor.cc b/components/sync/model_impl/shared_model_type_processor.cc
index 6b5816f90a209628f7a6ad2a741908e70f139088..bffedd4c39af5ad0193b3d3f4a4e1bbe58bb62d0 100644
--- a/components/sync/model_impl/shared_model_type_processor.cc
+++ b/components/sync/model_impl/shared_model_type_processor.cc
@@ -23,10 +23,7 @@ namespace syncer {
SharedModelTypeProcessor::SharedModelTypeProcessor(ModelType type,
ModelTypeSyncBridge* bridge)
: type_(type),
- is_metadata_loaded_(false),
- is_initial_pending_data_loaded_(false),
bridge_(bridge),
- error_handler_(nullptr),
weak_ptr_factory_(this) {
DCHECK(bridge);
}
@@ -48,7 +45,6 @@ void SharedModelTypeProcessor::OnSyncStarting(
}
void SharedModelTypeProcessor::OnMetadataLoaded(
- SyncError error,
std::unique_ptr<MetadataBatch> batch) {
DCHECK(CalledOnValidThread());
DCHECK(entities_.empty());
@@ -59,12 +55,6 @@ void SharedModelTypeProcessor::OnMetadataLoaded(
// Flip this flag here to cover all cases where we don't need to load data.
is_initial_pending_data_loaded_ = true;
- if (error.IsSet()) {
- start_error_ = error;
- ConnectIfReady();
- return;
- }
-
if (batch->GetModelTypeState().initial_sync_done()) {
EntityMetadataMap metadata_map(batch->TakeAllMetadata());
std::vector<std::string> entities_to_commit;
@@ -96,10 +86,14 @@ void SharedModelTypeProcessor::OnMetadataLoaded(
ConnectIfReady();
}
+bool SharedModelTypeProcessor::ConnectPreconditionsMet() const {
+ return is_metadata_loaded_ && is_initial_pending_data_loaded_ &&
+ error_handler_;
+}
+
void SharedModelTypeProcessor::ConnectIfReady() {
DCHECK(CalledOnValidThread());
- if (!is_metadata_loaded_ || !is_initial_pending_data_loaded_ ||
- start_callback_.is_null()) {
+ if (!ConnectPreconditionsMet()) {
return;
}
@@ -114,7 +108,8 @@ void SharedModelTypeProcessor::ConnectIfReady() {
base::ThreadTaskRunnerHandle::Get());
}
- start_callback_.Run(start_error_, std::move(activation_context));
+ start_callback_.Run(ModelToSyncError(start_error_),
+ std::move(activation_context));
start_callback_.Reset();
}
@@ -144,14 +139,28 @@ bool SharedModelTypeProcessor::IsTrackingMetadata() {
return model_type_state_.initial_sync_done();
}
-SyncError SharedModelTypeProcessor::CreateAndUploadError(
+void SharedModelTypeProcessor::ReportError(const ModelError& error) {
+ DCHECK(error.IsSet());
+
+ if (ConnectPreconditionsMet()) {
+ // If both model and sync are ready, then |start_callback_| was already
+ // called and this can't be treated as a start error.
+ DCHECK(error_handler_);
+ error_handler_->OnUnrecoverableError(ModelToSyncError(error));
+ } else if (!start_error_.IsSet()) {
+ start_error_ = error;
+ // An early model error means we're no longer expecting OnMetadataLoaded to
+ // be called.
+ is_metadata_loaded_ = true;
+ is_initial_pending_data_loaded_ = true;
+ ConnectIfReady();
+ }
+}
+
+void SharedModelTypeProcessor::ReportError(
const tracked_objects::Location& location,
const std::string& message) {
- if (error_handler_) {
- return error_handler_->CreateAndUploadError(location, message, type_);
- } else {
- return SyncError(location, SyncError::DATATYPE_ERROR, message, type_);
- }
+ ReportError(ModelError(location, message));
}
void SharedModelTypeProcessor::ConnectSync(
@@ -295,10 +304,10 @@ void SharedModelTypeProcessor::OnCommitCompleted(
}
}
- SyncError error =
+ ModelError error =
bridge_->ApplySyncChanges(std::move(change_list), EntityChangeList());
if (error.IsSet()) {
- error_handler_->OnUnrecoverableError(error);
+ ReportError(error);
}
}
@@ -352,11 +361,11 @@ void SharedModelTypeProcessor::OnUpdateReceived(
}
// Inform the bridge of the new or updated data.
- SyncError error =
+ ModelError error =
bridge_->ApplySyncChanges(std::move(metadata_changes), entity_changes);
if (error.IsSet()) {
- error_handler_->OnUnrecoverableError(error);
+ ReportError(error);
} else {
// There may be new reasons to commit by the time this function is done.
FlushPendingCommitRequests();
@@ -545,11 +554,11 @@ void SharedModelTypeProcessor::OnInitialUpdateReceived(
}
// Let the bridge handle associating and merging the data.
- SyncError error =
+ ModelError error =
bridge_->MergeSyncData(std::move(metadata_changes), data_map);
if (error.IsSet()) {
- error_handler_->OnUnrecoverableError(error);
+ ReportError(error);
} else {
// We may have new reasons to commit by the time this function is done.
FlushPendingCommitRequests();
@@ -557,30 +566,19 @@ void SharedModelTypeProcessor::OnInitialUpdateReceived(
}
void SharedModelTypeProcessor::OnInitialPendingDataLoaded(
- SyncError error,
std::unique_ptr<DataBatch> data_batch) {
DCHECK(!is_initial_pending_data_loaded_);
- if (error.IsSet()) {
- start_error_ = error;
- } else {
- ConsumeDataBatch(std::move(data_batch));
- }
-
+ ConsumeDataBatch(std::move(data_batch));
is_initial_pending_data_loaded_ = true;
+
ConnectIfReady();
}
void SharedModelTypeProcessor::OnDataLoadedForReEncryption(
- SyncError error,
std::unique_ptr<DataBatch> data_batch) {
DCHECK(is_initial_pending_data_loaded_);
- if (error.IsSet()) {
- error_handler_->OnUnrecoverableError(error);
- return;
- }
-
ConsumeDataBatch(std::move(data_batch));
FlushPendingCommitRequests();
}
@@ -646,4 +644,14 @@ ProcessorEntityTracker* SharedModelTypeProcessor::CreateEntity(
return CreateEntity(bridge_->GetStorageKey(data), data);
}
+SyncError SharedModelTypeProcessor::ModelToSyncError(
+ const ModelError& error) const {
+ if (error.IsSet()) {
+ return SyncError(error.location(), SyncError::DATATYPE_ERROR,
+ error.message(), type_);
+ } else {
+ return SyncError();
+ }
+}
+
} // namespace syncer

Powered by Google App Engine
This is Rietveld 408576698