// For PRECONDITION / CONFLICT case, the remote file is modified since the
// last sync completed. As our policy for deletion-modification conflict
// resolution, ignore the local deletion.
+ if (error == google_apis::HTTP_NOT_FOUND) {
+ metadata_database()->UpdateByDeletedRemoteFile(
+ remote_file_tracker_->file_id(), callback);
+ return;
+ }
callback.Run(SYNC_STATUS_OK);
}
return;
}
- if (metadata_database()->TryNoSideEffectActivation(
+ MetadataDatabase::ActivationStatus activation_status =
+ metadata_database()->TryActivateTracker(
remote_parent_folder_tracker_->tracker_id(),
- file_id, callback)) {
- // |callback| will be invoked by MetadataDatabase in this case.
- return;
+ file_id, callback);
+ switch (activation_status) {
+ case MetadataDatabase::ACTIVATION_PENDING:
+ // |callback| will be invoked by MetadataDatabase later in this case.
+ return;
+ case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER:
+ // The activation failed due to another tracker that has another parent.
+ // Detach the folder from the current parent to avoid using this folder as
+ // active folder.
+ drive_service()->RemoveResourceFromDirectory(
+ remote_parent_folder_tracker_->file_id(), file_id,
+ base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
+ return;
}
- drive_service()->RemoveResourceFromDirectory(
- remote_parent_folder_tracker_->file_id(), file_id,
- base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ NOTREACHED();
+ callback.Run(SYNC_STATUS_FAILED);
+ return;
}
void LocalToRemoteSyncer::DidDetachResourceForCreationConflict(