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

Unified Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 11421124: In local_change:remote_change conflict case we may have no data in metadata_store (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « chrome/browser/sync_file_system/drive_file_sync_service.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync_file_system/drive_file_sync_service.cc
diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc
index 8752be217ec7237015d9faa14af9bf7f66ed4722..ffb8c13bef38c9697d90cf36c97958db0387d7a3 100644
--- a/chrome/browser/sync_file_system/drive_file_sync_service.cc
+++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc
@@ -352,7 +352,17 @@ void DriveFileSyncService::ApplyLocalChange(
case SYNC_OPERATION_CONFLICT: {
// Mark the file as conflicted.
DriveMetadata metadata;
- metadata_store_->ReadEntry(url, &metadata);
+ const fileapi::SyncStatusCode status =
+ metadata_store_->ReadEntry(url, &metadata);
+ if (status == fileapi::SYNC_DATABASE_ERROR_NOT_FOUND) {
+ // The file is not yet in the metadata store.
+ RemoteChange remote_change;
+ const bool has_remote_change = GetPendingChangeForFileSystemURL(
+ url, &remote_change);
+ DCHECK(has_remote_change);
+ metadata.set_resource_id(remote_change.resource_id);
+ metadata.set_md5_checksum(std::string());
+ }
metadata.set_conflicted(true);
metadata_store_->UpdateEntry(
url, metadata,
@@ -642,32 +652,31 @@ DriveFileSyncService::ResolveSyncOperationType(
// TODO(nhiroki): check metadata.conflicted() flag before checking the pending
// change queue (http://crbug.com/162798).
- URLToChange::const_iterator found_url = url_to_change_.find(url.origin());
- if (found_url != url_to_change_.end()) {
- const PathToChange& path_to_change = found_url->second;
- PathToChange::const_iterator found_path = path_to_change.find(url.path());
- if (found_path != path_to_change.end()) {
- // Remote change for the file identified by |url| exists in the pending
- // change queue.
- const fileapi::FileChange& remote_file_change = found_path->second.change;
-
- // (RemoteChange) + (LocalChange) -> (Operation Type)
- // AddOrUpdate + AddOrUpdate -> CONFLICT
- // AddOrUpdate + Delete -> IGNORE
- // Delete + AddOrUpdate -> UPLOAD_NEW_FILE
- // Delete + Delete -> IGNORE
-
- if (remote_file_change.IsAddOrUpdate() &&
- local_file_change.IsAddOrUpdate())
- return SYNC_OPERATION_CONFLICT;
- else if (remote_file_change.IsDelete() &&
- local_file_change.IsAddOrUpdate())
- return SYNC_OPERATION_UPLOAD_NEW_FILE;
- else if (local_file_change.IsDelete())
- return SYNC_OPERATION_IGNORE;
- NOTREACHED();
- return SYNC_OPERATION_FAILED;
- }
+ RemoteChange remote_change;
+ const bool has_remote_change = GetPendingChangeForFileSystemURL(
+ url, &remote_change);
+
+ if (has_remote_change) {
+ // Remote change for the file identified by |url| exists in the pending
+ // change queue.
+ const fileapi::FileChange& remote_file_change = remote_change.change;
+
+ // (RemoteChange) + (LocalChange) -> (Operation Type)
+ // AddOrUpdate + AddOrUpdate -> CONFLICT
+ // AddOrUpdate + Delete -> IGNORE
+ // Delete + AddOrUpdate -> UPLOAD_NEW_FILE
+ // Delete + Delete -> IGNORE
+
+ if (remote_file_change.IsAddOrUpdate() &&
+ local_file_change.IsAddOrUpdate())
+ return SYNC_OPERATION_CONFLICT;
+ else if (remote_file_change.IsDelete() &&
+ local_file_change.IsAddOrUpdate())
+ return SYNC_OPERATION_UPLOAD_NEW_FILE;
+ else if (local_file_change.IsDelete())
+ return SYNC_OPERATION_IGNORE;
+ NOTREACHED();
+ return SYNC_OPERATION_FAILED;
}
DriveMetadata metadata;
@@ -873,4 +882,19 @@ void DriveFileSyncService::CancelRemoteChange(
url_to_change_.erase(found_origin);
}
+bool DriveFileSyncService::GetPendingChangeForFileSystemURL(
+ const fileapi::FileSystemURL& url,
+ RemoteChange* change) const {
+ DCHECK(change);
+ URLToChange::const_iterator found_url = url_to_change_.find(url.origin());
+ if (found_url == url_to_change_.end())
+ return false;
+ const PathToChange& path_to_change = found_url->second;
+ PathToChange::const_iterator found_path = path_to_change.find(url.path());
+ if (found_path == path_to_change.end())
+ return false;
+ *change = found_path->second;
+ return true;
+}
+
} // namespace sync_file_system
« no previous file with comments | « chrome/browser/sync_file_system/drive_file_sync_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698