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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc

Issue 1545283002: Convert Pass()→std::move() in //chrome/browser/ui (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 12 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" 5 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <utility>
8 9
9 #include "base/callback.h" 10 #include "base/callback.h"
10 #include "base/format_macros.h" 11 #include "base/format_macros.h"
11 #include "base/location.h" 12 #include "base/location.h"
12 #include "base/logging.h" 13 #include "base/logging.h"
13 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
14 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" 15 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
15 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 16 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
16 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 17 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
17 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" 18 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
(...skipping 13 matching lines...) Expand all
31 weak_ptr_factory_(this) {} 32 weak_ptr_factory_(this) {}
32 33
33 ConflictResolver::~ConflictResolver() {} 34 ConflictResolver::~ConflictResolver() {}
34 35
35 void ConflictResolver::RunPreflight(scoped_ptr<SyncTaskToken> token) { 36 void ConflictResolver::RunPreflight(scoped_ptr<SyncTaskToken> token) {
36 token->InitializeTaskLog("Conflict Resolution"); 37 token->InitializeTaskLog("Conflict Resolution");
37 38
38 scoped_ptr<TaskBlocker> task_blocker(new TaskBlocker); 39 scoped_ptr<TaskBlocker> task_blocker(new TaskBlocker);
39 task_blocker->exclusive = true; 40 task_blocker->exclusive = true;
40 SyncTaskManager::UpdateTaskBlocker( 41 SyncTaskManager::UpdateTaskBlocker(
41 token.Pass(), task_blocker.Pass(), 42 std::move(token), std::move(task_blocker),
42 base::Bind(&ConflictResolver::RunExclusive, 43 base::Bind(&ConflictResolver::RunExclusive,
43 weak_ptr_factory_.GetWeakPtr())); 44 weak_ptr_factory_.GetWeakPtr()));
44 } 45 }
45 46
46 void ConflictResolver::RunExclusive(scoped_ptr<SyncTaskToken> token) { 47 void ConflictResolver::RunExclusive(scoped_ptr<SyncTaskToken> token) {
47 if (!IsContextReady()) { 48 if (!IsContextReady()) {
48 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); 49 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED);
49 return; 50 return;
50 } 51 }
51 52
52 // Conflict resolution should be invoked on clean tree. 53 // Conflict resolution should be invoked on clean tree.
53 if (metadata_database()->HasDirtyTracker()) { 54 if (metadata_database()->HasDirtyTracker()) {
54 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_RETRY); 55 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_RETRY);
55 return; 56 return;
56 } 57 }
57 58
58 TrackerIDSet trackers; 59 TrackerIDSet trackers;
59 if (metadata_database()->GetMultiParentFileTrackers( 60 if (metadata_database()->GetMultiParentFileTrackers(
60 &target_file_id_, &trackers)) { 61 &target_file_id_, &trackers)) {
61 DCHECK_LT(1u, trackers.size()); 62 DCHECK_LT(1u, trackers.size());
62 if (!trackers.has_active()) { 63 if (!trackers.has_active()) {
63 NOTREACHED(); 64 NOTREACHED();
64 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); 65 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED);
65 return; 66 return;
66 } 67 }
67 68
68 token->RecordLog(base::StringPrintf( 69 token->RecordLog(base::StringPrintf(
69 "Detected multi-parent trackers (active tracker_id=%" PRId64 ")", 70 "Detected multi-parent trackers (active tracker_id=%" PRId64 ")",
70 trackers.active_tracker())); 71 trackers.active_tracker()));
71 72
72 DCHECK(trackers.has_active()); 73 DCHECK(trackers.has_active());
73 for (TrackerIDSet::const_iterator itr = trackers.begin(); 74 for (TrackerIDSet::const_iterator itr = trackers.begin();
74 itr != trackers.end(); ++itr) { 75 itr != trackers.end(); ++itr) {
75 FileTracker tracker; 76 FileTracker tracker;
76 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) { 77 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) {
77 NOTREACHED(); 78 NOTREACHED();
78 continue; 79 continue;
79 } 80 }
80 81
81 if (tracker.active()) 82 if (tracker.active())
82 continue; 83 continue;
83 84
84 FileTracker parent_tracker; 85 FileTracker parent_tracker;
85 bool should_success = metadata_database()->FindTrackerByTrackerID( 86 bool should_success = metadata_database()->FindTrackerByTrackerID(
86 tracker.parent_tracker_id(), &parent_tracker); 87 tracker.parent_tracker_id(), &parent_tracker);
87 if (!should_success) { 88 if (!should_success) {
88 NOTREACHED(); 89 NOTREACHED();
89 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); 90 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED);
90 return; 91 return;
91 } 92 }
92 parents_to_remove_.push_back(parent_tracker.file_id()); 93 parents_to_remove_.push_back(parent_tracker.file_id());
93 } 94 }
94 DetachFromNonPrimaryParents(token.Pass()); 95 DetachFromNonPrimaryParents(std::move(token));
95 return; 96 return;
96 } 97 }
97 98
98 if (metadata_database()->GetConflictingTrackers(&trackers)) { 99 if (metadata_database()->GetConflictingTrackers(&trackers)) {
99 target_file_id_ = PickPrimaryFile(trackers); 100 target_file_id_ = PickPrimaryFile(trackers);
100 DCHECK(!target_file_id_.empty()); 101 DCHECK(!target_file_id_.empty());
101 int64_t primary_tracker_id = -1; 102 int64_t primary_tracker_id = -1;
102 for (TrackerIDSet::const_iterator itr = trackers.begin(); 103 for (TrackerIDSet::const_iterator itr = trackers.begin();
103 itr != trackers.end(); ++itr) { 104 itr != trackers.end(); ++itr) {
104 FileTracker tracker; 105 FileTracker tracker;
105 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) { 106 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) {
106 NOTREACHED(); 107 NOTREACHED();
107 continue; 108 continue;
108 } 109 }
109 if (tracker.file_id() != target_file_id_) { 110 if (tracker.file_id() != target_file_id_) {
110 non_primary_file_ids_.push_back( 111 non_primary_file_ids_.push_back(
111 std::make_pair(tracker.file_id(), tracker.synced_details().etag())); 112 std::make_pair(tracker.file_id(), tracker.synced_details().etag()));
112 } else { 113 } else {
113 primary_tracker_id = tracker.tracker_id(); 114 primary_tracker_id = tracker.tracker_id();
114 } 115 }
115 } 116 }
116 117
117 token->RecordLog(base::StringPrintf( 118 token->RecordLog(base::StringPrintf(
118 "Detected %" PRIuS " conflicting trackers " 119 "Detected %" PRIuS " conflicting trackers "
119 "(primary tracker_id=%" PRId64 ")", 120 "(primary tracker_id=%" PRId64 ")",
120 non_primary_file_ids_.size(), primary_tracker_id)); 121 non_primary_file_ids_.size(), primary_tracker_id));
121 122
122 RemoveNonPrimaryFiles(token.Pass()); 123 RemoveNonPrimaryFiles(std::move(token));
123 return; 124 return;
124 } 125 }
125 126
126 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_NO_CONFLICT); 127 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_NO_CONFLICT);
127 } 128 }
128 129
129 void ConflictResolver::DetachFromNonPrimaryParents( 130 void ConflictResolver::DetachFromNonPrimaryParents(
130 scoped_ptr<SyncTaskToken> token) { 131 scoped_ptr<SyncTaskToken> token) {
131 DCHECK(!parents_to_remove_.empty()); 132 DCHECK(!parents_to_remove_.empty());
132 133
133 // TODO(tzik): Check if ETag match is available for 134 // TODO(tzik): Check if ETag match is available for
134 // RemoteResourceFromDirectory. 135 // RemoteResourceFromDirectory.
135 std::string parent_folder_id = parents_to_remove_.back(); 136 std::string parent_folder_id = parents_to_remove_.back();
136 parents_to_remove_.pop_back(); 137 parents_to_remove_.pop_back();
137 138
138 token->RecordLog(base::StringPrintf( 139 token->RecordLog(base::StringPrintf(
139 "Detach %s from %s", 140 "Detach %s from %s",
140 target_file_id_.c_str(), parent_folder_id.c_str())); 141 target_file_id_.c_str(), parent_folder_id.c_str()));
141 142
142 drive_service()->RemoveResourceFromDirectory( 143 drive_service()->RemoveResourceFromDirectory(
143 parent_folder_id, target_file_id_, 144 parent_folder_id, target_file_id_,
144 base::Bind(&ConflictResolver::DidDetachFromParent, 145 base::Bind(&ConflictResolver::DidDetachFromParent,
145 weak_ptr_factory_.GetWeakPtr(), 146 weak_ptr_factory_.GetWeakPtr(),
146 base::Passed(&token))); 147 base::Passed(&token)));
147 } 148 }
148 149
149 void ConflictResolver::DidDetachFromParent( 150 void ConflictResolver::DidDetachFromParent(
150 scoped_ptr<SyncTaskToken> token, 151 scoped_ptr<SyncTaskToken> token,
151 google_apis::DriveApiErrorCode error) { 152 google_apis::DriveApiErrorCode error) {
152 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 153 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
153 if (status != SYNC_STATUS_OK) { 154 if (status != SYNC_STATUS_OK) {
154 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 155 SyncTaskManager::NotifyTaskDone(std::move(token), status);
155 return; 156 return;
156 } 157 }
157 158
158 if (!parents_to_remove_.empty()) { 159 if (!parents_to_remove_.empty()) {
159 DetachFromNonPrimaryParents(token.Pass()); 160 DetachFromNonPrimaryParents(std::move(token));
160 return; 161 return;
161 } 162 }
162 163
163 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); 164 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK);
164 } 165 }
165 166
166 std::string ConflictResolver::PickPrimaryFile(const TrackerIDSet& trackers) { 167 std::string ConflictResolver::PickPrimaryFile(const TrackerIDSet& trackers) {
167 scoped_ptr<FileMetadata> primary; 168 scoped_ptr<FileMetadata> primary;
168 for (TrackerIDSet::const_iterator itr = trackers.begin(); 169 for (TrackerIDSet::const_iterator itr = trackers.begin();
169 itr != trackers.end(); ++itr) { 170 itr != trackers.end(); ++itr) {
170 FileTracker tracker; 171 FileTracker tracker;
171 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) { 172 if (!metadata_database()->FindTrackerByTrackerID(*itr, &tracker)) {
172 NOTREACHED(); 173 NOTREACHED();
173 continue; 174 continue;
174 } 175 }
175 176
176 scoped_ptr<FileMetadata> file_metadata(new FileMetadata); 177 scoped_ptr<FileMetadata> file_metadata(new FileMetadata);
177 if (!metadata_database()->FindFileByFileID( 178 if (!metadata_database()->FindFileByFileID(
178 tracker.file_id(), file_metadata.get())) { 179 tracker.file_id(), file_metadata.get())) {
179 NOTREACHED(); 180 NOTREACHED();
180 continue; 181 continue;
181 } 182 }
182 183
183 if (!primary) { 184 if (!primary) {
184 primary = file_metadata.Pass(); 185 primary = std::move(file_metadata);
185 continue; 186 continue;
186 } 187 }
187 188
188 DCHECK(primary->details().file_kind() == FILE_KIND_FILE || 189 DCHECK(primary->details().file_kind() == FILE_KIND_FILE ||
189 primary->details().file_kind() == FILE_KIND_FOLDER); 190 primary->details().file_kind() == FILE_KIND_FOLDER);
190 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FILE || 191 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FILE ||
191 file_metadata->details().file_kind() == FILE_KIND_FOLDER); 192 file_metadata->details().file_kind() == FILE_KIND_FOLDER);
192 193
193 if (primary->details().file_kind() == FILE_KIND_FILE) { 194 if (primary->details().file_kind() == FILE_KIND_FILE) {
194 if (file_metadata->details().file_kind() == FILE_KIND_FOLDER) { 195 if (file_metadata->details().file_kind() == FILE_KIND_FOLDER) {
195 // Prioritize folders over regular files. 196 // Prioritize folders over regular files.
196 primary = file_metadata.Pass(); 197 primary = std::move(file_metadata);
197 continue; 198 continue;
198 } 199 }
199 200
200 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FILE); 201 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FILE);
201 if (primary->details().modification_time() < 202 if (primary->details().modification_time() <
202 file_metadata->details().modification_time()) { 203 file_metadata->details().modification_time()) {
203 // Prioritize last write for regular files. 204 // Prioritize last write for regular files.
204 primary = file_metadata.Pass(); 205 primary = std::move(file_metadata);
205 continue; 206 continue;
206 } 207 }
207 208
208 continue; 209 continue;
209 } 210 }
210 211
211 DCHECK(primary->details().file_kind() == FILE_KIND_FOLDER); 212 DCHECK(primary->details().file_kind() == FILE_KIND_FOLDER);
212 if (file_metadata->details().file_kind() == FILE_KIND_FILE) { 213 if (file_metadata->details().file_kind() == FILE_KIND_FILE) {
213 // Prioritize folders over regular files. 214 // Prioritize folders over regular files.
214 continue; 215 continue;
215 } 216 }
216 217
217 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FOLDER); 218 DCHECK(file_metadata->details().file_kind() == FILE_KIND_FOLDER);
218 if (primary->details().creation_time() > 219 if (primary->details().creation_time() >
219 file_metadata->details().creation_time()) { 220 file_metadata->details().creation_time()) {
220 // Prioritize first create for folders. 221 // Prioritize first create for folders.
221 primary = file_metadata.Pass(); 222 primary = std::move(file_metadata);
222 continue; 223 continue;
223 } 224 }
224 } 225 }
225 226
226 if (primary) 227 if (primary)
227 return primary->file_id(); 228 return primary->file_id();
228 return std::string(); 229 return std::string();
229 } 230 }
230 231
231 void ConflictResolver::RemoveNonPrimaryFiles(scoped_ptr<SyncTaskToken> token) { 232 void ConflictResolver::RemoveNonPrimaryFiles(scoped_ptr<SyncTaskToken> token) {
(...skipping 15 matching lines...) Expand all
247 base::Bind(&ConflictResolver::DidRemoveFile, 248 base::Bind(&ConflictResolver::DidRemoveFile,
248 weak_ptr_factory_.GetWeakPtr(), 249 weak_ptr_factory_.GetWeakPtr(),
249 base::Passed(&token), file_id)); 250 base::Passed(&token), file_id));
250 } 251 }
251 252
252 void ConflictResolver::DidRemoveFile(scoped_ptr<SyncTaskToken> token, 253 void ConflictResolver::DidRemoveFile(scoped_ptr<SyncTaskToken> token,
253 const std::string& file_id, 254 const std::string& file_id,
254 google_apis::DriveApiErrorCode error) { 255 google_apis::DriveApiErrorCode error) {
255 if (error == google_apis::HTTP_PRECONDITION || 256 if (error == google_apis::HTTP_PRECONDITION ||
256 error == google_apis::HTTP_CONFLICT) { 257 error == google_apis::HTTP_CONFLICT) {
257 UpdateFileMetadata(file_id, token.Pass()); 258 UpdateFileMetadata(file_id, std::move(token));
258 return; 259 return;
259 } 260 }
260 261
261 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 262 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
262 if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) { 263 if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) {
263 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 264 SyncTaskManager::NotifyTaskDone(std::move(token), status);
264 return; 265 return;
265 } 266 }
266 267
267 deleted_file_ids_.push_back(file_id); 268 deleted_file_ids_.push_back(file_id);
268 if (!non_primary_file_ids_.empty()) { 269 if (!non_primary_file_ids_.empty()) {
269 RemoveNonPrimaryFiles(token.Pass()); 270 RemoveNonPrimaryFiles(std::move(token));
270 return; 271 return;
271 } 272 }
272 273
273 status = metadata_database()->UpdateByDeletedRemoteFileList( 274 status = metadata_database()->UpdateByDeletedRemoteFileList(
274 deleted_file_ids_); 275 deleted_file_ids_);
275 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 276 SyncTaskManager::NotifyTaskDone(std::move(token), status);
276 } 277 }
277 278
278 bool ConflictResolver::IsContextReady() { 279 bool ConflictResolver::IsContextReady() {
279 return sync_context_->GetDriveService() && 280 return sync_context_->GetDriveService() &&
280 sync_context_->GetMetadataDatabase(); 281 sync_context_->GetMetadataDatabase();
281 } 282 }
282 283
283 void ConflictResolver::UpdateFileMetadata( 284 void ConflictResolver::UpdateFileMetadata(
284 const std::string& file_id, 285 const std::string& file_id,
285 scoped_ptr<SyncTaskToken> token) { 286 scoped_ptr<SyncTaskToken> token) {
286 drive_service()->GetFileResource( 287 drive_service()->GetFileResource(
287 file_id, 288 file_id,
288 base::Bind(&ConflictResolver::DidGetRemoteMetadata, 289 base::Bind(&ConflictResolver::DidGetRemoteMetadata,
289 weak_ptr_factory_.GetWeakPtr(), file_id, 290 weak_ptr_factory_.GetWeakPtr(), file_id,
290 base::Passed(&token))); 291 base::Passed(&token)));
291 } 292 }
292 293
293 void ConflictResolver::DidGetRemoteMetadata( 294 void ConflictResolver::DidGetRemoteMetadata(
294 const std::string& file_id, 295 const std::string& file_id,
295 scoped_ptr<SyncTaskToken> token, 296 scoped_ptr<SyncTaskToken> token,
296 google_apis::DriveApiErrorCode error, 297 google_apis::DriveApiErrorCode error,
297 scoped_ptr<google_apis::FileResource> entry) { 298 scoped_ptr<google_apis::FileResource> entry) {
298 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 299 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
299 if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) { 300 if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) {
300 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 301 SyncTaskManager::NotifyTaskDone(std::move(token), status);
301 return; 302 return;
302 } 303 }
303 304
304 if (error != google_apis::HTTP_NOT_FOUND) { 305 if (error != google_apis::HTTP_NOT_FOUND) {
305 status = metadata_database()->UpdateByDeletedRemoteFile(file_id); 306 status = metadata_database()->UpdateByDeletedRemoteFile(file_id);
306 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 307 SyncTaskManager::NotifyTaskDone(std::move(token), status);
307 return; 308 return;
308 } 309 }
309 310
310 if (!entry) { 311 if (!entry) {
311 NOTREACHED(); 312 NOTREACHED();
312 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); 313 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED);
313 return; 314 return;
314 } 315 }
315 316
316 status = metadata_database()->UpdateByFileResource(*entry); 317 status = metadata_database()->UpdateByFileResource(*entry);
317 SyncTaskManager::NotifyTaskDone(token.Pass(), status); 318 SyncTaskManager::NotifyTaskDone(std::move(token), status);
318 } 319 }
319 320
320 drive::DriveServiceInterface* ConflictResolver::drive_service() { 321 drive::DriveServiceInterface* ConflictResolver::drive_service() {
321 set_used_network(true); 322 set_used_network(true);
322 return sync_context_->GetDriveService(); 323 return sync_context_->GetDriveService();
323 } 324 }
324 325
325 MetadataDatabase* ConflictResolver::metadata_database() { 326 MetadataDatabase* ConflictResolver::metadata_database() {
326 return sync_context_->GetMetadataDatabase(); 327 return sync_context_->GetMetadataDatabase();
327 } 328 }
328 329
329 } // namespace drive_backend 330 } // namespace drive_backend
330 } // namespace sync_file_system 331 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698