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

Side by Side Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 11299008: Remote service state handling (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_file_sync_service.h" 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 12 matching lines...) Expand all
23 #include "webkit/fileapi/syncable/sync_file_type.h" 23 #include "webkit/fileapi/syncable/sync_file_type.h"
24 #include "webkit/fileapi/syncable/syncable_file_system_util.h" 24 #include "webkit/fileapi/syncable/syncable_file_system_util.h"
25 25
26 namespace sync_file_system { 26 namespace sync_file_system {
27 27
28 const char DriveFileSyncService::kServiceName[] = "drive"; 28 const char DriveFileSyncService::kServiceName[] = "drive";
29 29
30 class DriveFileSyncService::TaskToken { 30 class DriveFileSyncService::TaskToken {
31 public: 31 public:
32 explicit TaskToken(const base::WeakPtr<DriveFileSyncService>& sync_service) 32 explicit TaskToken(const base::WeakPtr<DriveFileSyncService>& sync_service)
33 : sync_service_(sync_service) { 33 : sync_service_(sync_service),
34 task_type_(TASK_TYPE_NONE) {
34 } 35 }
35 36
36 void set_location(const tracked_objects::Location& from_here) { 37 void ResetTask(const tracked_objects::Location& location) {
37 from_here_ = from_here; 38 location_ = location;
39 task_type_ = TASK_TYPE_NONE;
40 description_.clear();
38 } 41 }
39 42
43 void UpdateTask(const tracked_objects::Location& location,
44 TaskType task_type,
45 const std::string& description) {
46 location_ = location;
47 task_type_ = task_type;
48 description_ = description;
49 }
50
51 const tracked_objects::Location& location() const { return location_; }
52 TaskType task_type() const { return task_type_; }
53 const std::string& description() const { return description_; }
54
40 ~TaskToken() { 55 ~TaskToken() {
41 // All task on DriveFileSyncService must hold TaskToken instance to ensure 56 // All task on DriveFileSyncService must hold TaskToken instance to ensure
42 // no other tasks are running. Also, as soon as a task finishes to work, 57 // no other tasks are running. Also, as soon as a task finishes to work,
43 // it must return the token to DriveFileSyncService. 58 // it must return the token to DriveFileSyncService.
44 // Destroying a token with valid |sync_service_| indicates the token was 59 // Destroying a token with valid |sync_service_| indicates the token was
45 // dropped by a task without returning. 60 // dropped by a task without returning.
46 DCHECK(!sync_service_); 61 DCHECK(!sync_service_);
47 if (sync_service_) { 62 if (sync_service_) {
48 LOG(ERROR) << "Unexpected TaskToken deletion from: " 63 LOG(ERROR) << "Unexpected TaskToken deletion from: "
49 << from_here_.ToString(); 64 << location_.ToString() << " while: " << description_;
50 } 65 }
51 } 66 }
52 67
53 private: 68 private:
54 tracked_objects::Location from_here_;
55 base::WeakPtr<DriveFileSyncService> sync_service_; 69 base::WeakPtr<DriveFileSyncService> sync_service_;
70 tracked_objects::Location location_;
71 TaskType task_type_;
72 std::string description_;
56 73
57 DISALLOW_COPY_AND_ASSIGN(TaskToken); 74 DISALLOW_COPY_AND_ASSIGN(TaskToken);
58 }; 75 };
59 76
60 DriveFileSyncService::DriveFileSyncService(Profile* profile) 77 DriveFileSyncService::DriveFileSyncService(Profile* profile)
61 : status_(fileapi::SYNC_STATUS_OK), 78 : last_operation_status_(fileapi::SYNC_STATUS_OK),
79 state_(REMOTE_SERVICE_OK),
62 largest_changestamp_(0), 80 largest_changestamp_(0),
63 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 81 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
64 token_.reset(new TaskToken(weak_factory_.GetWeakPtr())); 82 token_.reset(new TaskToken(weak_factory_.GetWeakPtr()));
65 83
66 sync_client_.reset(new DriveFileSyncClient(profile)); 84 sync_client_.reset(new DriveFileSyncClient(profile));
67 85
68 metadata_store_.reset(new DriveMetadataStore( 86 metadata_store_.reset(new DriveMetadataStore(
69 profile->GetPath(), 87 profile->GetPath(),
70 content::BrowserThread::GetMessageLoopProxyForThread( 88 content::BrowserThread::GetMessageLoopProxyForThread(
71 content::BrowserThread::FILE))); 89 content::BrowserThread::FILE)));
72 90
73 metadata_store_->Initialize( 91 metadata_store_->Initialize(
74 base::Bind(&DriveFileSyncService::DidInitializeMetadataStore, 92 base::Bind(&DriveFileSyncService::DidInitializeMetadataStore,
75 weak_factory_.GetWeakPtr(), 93 weak_factory_.GetWeakPtr(),
76 base::Passed(GetToken(FROM_HERE)))); 94 base::Passed(GetToken(FROM_HERE, TASK_TYPE_DATABASE,
95 "Metadata database initialization"))));
77 } 96 }
78 97
79 // static 98 // static
80 scoped_ptr<DriveFileSyncService> DriveFileSyncService::CreateForTesting( 99 scoped_ptr<DriveFileSyncService> DriveFileSyncService::CreateForTesting(
81 scoped_ptr<DriveFileSyncClient> sync_client, 100 scoped_ptr<DriveFileSyncClient> sync_client,
82 scoped_ptr<DriveMetadataStore> metadata_store) { 101 scoped_ptr<DriveMetadataStore> metadata_store) {
83 return make_scoped_ptr(new DriveFileSyncService( 102 return make_scoped_ptr(new DriveFileSyncService(
84 sync_client.Pass(), metadata_store.Pass())); 103 sync_client.Pass(), metadata_store.Pass()));
85 } 104 }
86 105
87 // Called by CreateForTesting. 106 // Called by CreateForTesting.
88 DriveFileSyncService::DriveFileSyncService( 107 DriveFileSyncService::DriveFileSyncService(
89 scoped_ptr<DriveFileSyncClient> sync_client, 108 scoped_ptr<DriveFileSyncClient> sync_client,
90 scoped_ptr<DriveMetadataStore> metadata_store) 109 scoped_ptr<DriveMetadataStore> metadata_store)
91 : status_(fileapi::SYNC_STATUS_OK), 110 : last_operation_status_(fileapi::SYNC_STATUS_OK),
111 state_(REMOTE_SERVICE_OK),
92 largest_changestamp_(0), 112 largest_changestamp_(0),
93 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 113 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
94 token_.reset(new TaskToken(weak_factory_.GetWeakPtr())); 114 token_.reset(new TaskToken(weak_factory_.GetWeakPtr()));
95 sync_client_ = sync_client.Pass(); 115 sync_client_ = sync_client.Pass();
96 metadata_store_ = metadata_store.Pass(); 116 metadata_store_ = metadata_store.Pass();
97 117
98 DidInitializeMetadataStore(GetToken(FROM_HERE), 118 DidInitializeMetadataStore(
99 fileapi::SYNC_STATUS_OK, false); 119 GetToken(FROM_HERE, TASK_TYPE_NONE, "Drive initialization for testing"),
120 fileapi::SYNC_STATUS_OK, false);
100 } 121 }
101 122
102 DriveFileSyncService::~DriveFileSyncService() { 123 DriveFileSyncService::~DriveFileSyncService() {
103 } 124 }
104 125
105 void DriveFileSyncService::DidInitializeMetadataStore( 126 void DriveFileSyncService::DidInitializeMetadataStore(
106 scoped_ptr<TaskToken> token, 127 scoped_ptr<TaskToken> token,
107 fileapi::SyncStatusCode status, 128 fileapi::SyncStatusCode status,
108 bool created) { 129 bool created) {
109 if (status != fileapi::SYNC_STATUS_OK) { 130 if (status != fileapi::SYNC_STATUS_OK) {
110 NotifyTaskDone(status, token.Pass()); 131 NotifyTaskDone(status, token.Pass());
111 return; 132 return;
112 } 133 }
113 134
114 if (metadata_store_->sync_root_directory().empty()) { 135 if (metadata_store_->sync_root_directory().empty()) {
115 DCHECK(metadata_store_->batch_sync_origins().empty()); 136 DCHECK(metadata_store_->batch_sync_origins().empty());
116 DCHECK(metadata_store_->incremental_sync_origins().empty()); 137 DCHECK(metadata_store_->incremental_sync_origins().empty());
117 138
139 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root");
118 sync_client_->GetDriveDirectoryForSyncRoot( 140 sync_client_->GetDriveDirectoryForSyncRoot(
119 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, 141 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory,
120 weak_factory_.GetWeakPtr(), 142 weak_factory_.GetWeakPtr(),
121 base::Passed(&token))); 143 base::Passed(&token)));
122 return; 144 return;
123 } 145 }
124 NotifyTaskDone(status, token.Pass()); 146 NotifyTaskDone(status, token.Pass());
125 147
126 for (std::map<GURL, std::string>::const_iterator itr = 148 for (std::map<GURL, std::string>::const_iterator itr =
127 metadata_store_->batch_sync_origins().begin(); 149 metadata_store_->batch_sync_origins().begin();
(...skipping 11 matching lines...) Expand all
139 error != google_apis::HTTP_CREATED) { 161 error != google_apis::HTTP_CREATED) {
140 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); 162 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass());
141 return; 163 return;
142 } 164 }
143 165
144 metadata_store_->SetSyncRootDirectory(resource_id); 166 metadata_store_->SetSyncRootDirectory(resource_id);
145 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); 167 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
146 } 168 }
147 169
148 scoped_ptr<DriveFileSyncService::TaskToken> DriveFileSyncService::GetToken( 170 scoped_ptr<DriveFileSyncService::TaskToken> DriveFileSyncService::GetToken(
149 const tracked_objects::Location& from_here) { 171 const tracked_objects::Location& from_here,
172 TaskType task_type,
173 const std::string& description) {
150 if (!token_) 174 if (!token_)
151 return scoped_ptr<TaskToken>(); 175 return scoped_ptr<TaskToken>();
152 token_->set_location(from_here); 176 token_->UpdateTask(from_here, task_type, description);
153 return token_.Pass(); 177 return token_.Pass();
154 } 178 }
155 179
156 void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status, 180 void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
157 scoped_ptr<TaskToken> token) { 181 scoped_ptr<TaskToken> token) {
158 DCHECK(token); 182 DCHECK(token);
159 bool status_changed = status_ != status; 183 last_operation_status_ = status;
160 status_ = status;
161 token_ = token.Pass(); 184 token_ = token.Pass();
162 token_->set_location(tracked_objects::Location());
163 185
186 if (token_->task_type() != TASK_TYPE_NONE) {
187 RemoteServiceState old_state = state_;
188 UpdateServiceState();
189
190 // Notify remote sync service state for healthy running updates (OK to OK
191 // state transition) and for any state changes.
192 if ((state_ == REMOTE_SERVICE_OK && !token_->description().empty()) ||
193 old_state != state_) {
194 FOR_EACH_OBSERVER(Observer, observers_,
195 OnRemoteServiceStateUpdated(state_,
196 token_->description()));
197 }
198 }
199
200 token_->ResetTask(FROM_HERE);
164 if (status == fileapi::SYNC_STATUS_OK && !pending_tasks_.empty()) { 201 if (status == fileapi::SYNC_STATUS_OK && !pending_tasks_.empty()) {
165 base::Closure closure = pending_tasks_.front(); 202 base::Closure closure = pending_tasks_.front();
166 pending_tasks_.pop_front(); 203 pending_tasks_.pop_front();
167 closure.Run(); 204 closure.Run();
168 } 205 }
206 }
169 207
170 if (status_changed) { 208 void DriveFileSyncService::UpdateServiceState() {
171 // TODO(tzik): Refine the status to track the error. 209 switch (last_operation_status_) {
172 FOR_EACH_OBSERVER(Observer, observers_, OnRemoteSyncStatusChanged(status)); 210 // Possible regular operation errors.
211 case fileapi::SYNC_STATUS_OK:
212 case fileapi::SYNC_STATUS_FILE_BUSY:
213 case fileapi::SYNC_STATUS_HAS_CONFLICT:
214 case fileapi::SYNC_STATUS_NOT_A_CONFLICT:
215 case fileapi::SYNC_STATUS_NO_CHANGE_TO_SYNC:
216 case fileapi::SYNC_FILE_ERROR_NOT_FOUND:
217 case fileapi::SYNC_FILE_ERROR_FAILED:
218 case fileapi::SYNC_FILE_ERROR_NO_SPACE:
219 // If the service type was DRIVE and the status was ok, the state
220 // should be migrated to OK state.
221 if (token_->task_type() == TASK_TYPE_DRIVE)
222 state_ = REMOTE_SERVICE_OK;
223 break;
224
225 // Errors which could make the service temporarily unavailable.
226 case fileapi::SYNC_STATUS_RETRY:
227 case fileapi::SYNC_STATUS_NETWORK_ERROR:
228 case fileapi::SYNC_STATUS_AUTHENTICATION_FAILED:
229 state_ = REMOTE_SERVICE_TEMPORARY_UNAVAILABLE;
230 break;
231
232 // Errors which would require manual user intervention to resolve.
233 case fileapi::SYNC_DATABASE_ERROR_CORRUPTION:
234 case fileapi::SYNC_DATABASE_ERROR_IO_ERROR:
235 case fileapi::SYNC_DATABASE_ERROR_FAILED:
236 case fileapi::SYNC_STATUS_ABORT:
237 case fileapi::SYNC_STATUS_FAILED:
238 state_ = REMOTE_SERVICE_DISABLED;
239 break;
240
241 // Unexpected status code. They should be explicitly added to one of the
242 // above three cases.
243 default:
244 NOTREACHED();
245 state_ = REMOTE_SERVICE_DISABLED;
246 break;
173 } 247 }
174 } 248 }
175 249
176 void DriveFileSyncService::AddObserver(Observer* observer) { 250 void DriveFileSyncService::AddObserver(Observer* observer) {
177 observers_.AddObserver(observer); 251 observers_.AddObserver(observer);
178 } 252 }
179 253
180 void DriveFileSyncService::RemoveObserver(Observer* observer) { 254 void DriveFileSyncService::RemoveObserver(Observer* observer) {
181 observers_.RemoveObserver(observer); 255 observers_.RemoveObserver(observer);
182 } 256 }
183 257
184 void DriveFileSyncService::RegisterOriginForTrackingChanges( 258 void DriveFileSyncService::RegisterOriginForTrackingChanges(
185 const GURL& origin, 259 const GURL& origin,
186 const fileapi::SyncStatusCallback& callback) { 260 const fileapi::SyncStatusCallback& callback) {
187 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 261 scoped_ptr<TaskToken> token(GetToken(
262 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata"));
188 if (!token) { 263 if (!token) {
189 pending_tasks_.push_back(base::Bind( 264 pending_tasks_.push_back(base::Bind(
190 &DriveFileSyncService::RegisterOriginForTrackingChanges, 265 &DriveFileSyncService::RegisterOriginForTrackingChanges,
191 weak_factory_.GetWeakPtr(), origin, callback)); 266 weak_factory_.GetWeakPtr(), origin, callback));
192 return; 267 return;
193 } 268 }
194 269
195 if (status_ != fileapi::SYNC_STATUS_OK) { 270 if (state_ == REMOTE_SERVICE_DISABLED) {
196 NotifyTaskDone(status_, token.Pass()); 271 token->ResetTask(FROM_HERE);
197 callback.Run(status_); 272 NotifyTaskDone(last_operation_status_, token.Pass());
273 callback.Run(last_operation_status_);
198 return; 274 return;
199 } 275 }
200 276
201 if (metadata_store_->IsIncrementalSyncOrigin(origin) || 277 if (metadata_store_->IsIncrementalSyncOrigin(origin) ||
202 metadata_store_->IsBatchSyncOrigin(origin)) { 278 metadata_store_->IsBatchSyncOrigin(origin)) {
279 token->ResetTask(FROM_HERE);
203 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); 280 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
204 callback.Run(fileapi::SYNC_STATUS_OK); 281 callback.Run(fileapi::SYNC_STATUS_OK);
205 return; 282 return;
206 } 283 }
207 284
208 DCHECK(!metadata_store_->sync_root_directory().empty()); 285 DCHECK(!metadata_store_->sync_root_directory().empty());
209 sync_client_->GetDriveDirectoryForOrigin( 286 sync_client_->GetDriveDirectoryForOrigin(
210 metadata_store_->sync_root_directory(), origin, 287 metadata_store_->sync_root_directory(), origin,
211 base::Bind(&DriveFileSyncService::DidGetDirectoryForOrigin, 288 base::Bind(&DriveFileSyncService::DidGetDirectoryForOrigin,
212 weak_factory_.GetWeakPtr(), base::Passed(&token), 289 weak_factory_.GetWeakPtr(), base::Passed(&token),
(...skipping 18 matching lines...) Expand all
231 308
232 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); 309 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
233 callback.Run(fileapi::SYNC_STATUS_OK); 310 callback.Run(fileapi::SYNC_STATUS_OK);
234 311
235 StartBatchSyncForOrigin(origin, resource_id); 312 StartBatchSyncForOrigin(origin, resource_id);
236 } 313 }
237 314
238 void DriveFileSyncService::UnregisterOriginForTrackingChanges( 315 void DriveFileSyncService::UnregisterOriginForTrackingChanges(
239 const GURL& origin, 316 const GURL& origin,
240 const fileapi::SyncStatusCallback& callback) { 317 const fileapi::SyncStatusCallback& callback) {
241 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 318 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
242 if (!token) { 319 if (!token) {
243 pending_tasks_.push_back(base::Bind( 320 pending_tasks_.push_back(base::Bind(
244 &DriveFileSyncService::UnregisterOriginForTrackingChanges, 321 &DriveFileSyncService::UnregisterOriginForTrackingChanges,
245 weak_factory_.GetWeakPtr(), origin, callback)); 322 weak_factory_.GetWeakPtr(), origin, callback));
246 return; 323 return;
247 } 324 }
248 325
249 changestamp_map_.erase(origin); 326 changestamp_map_.erase(origin);
250 327
251 std::vector<RemoteChange> new_queue; 328 std::vector<RemoteChange> new_queue;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 const FilePath& local_path, 379 const FilePath& local_path,
303 const fileapi::FileSystemURL& url, 380 const fileapi::FileSystemURL& url,
304 const fileapi::SyncStatusCallback& callback) { 381 const fileapi::SyncStatusCallback& callback) {
305 NOTIMPLEMENTED(); 382 NOTIMPLEMENTED();
306 callback.Run(fileapi::SYNC_STATUS_FAILED); 383 callback.Run(fileapi::SYNC_STATUS_FAILED);
307 } 384 }
308 385
309 void DriveFileSyncService::StartBatchSyncForOrigin( 386 void DriveFileSyncService::StartBatchSyncForOrigin(
310 const GURL& origin, 387 const GURL& origin,
311 const std::string& resource_id) { 388 const std::string& resource_id) {
312 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 389 scoped_ptr<TaskToken> token(
390 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp"));
313 if (!token) { 391 if (!token) {
314 pending_tasks_.push_back(base::Bind( 392 pending_tasks_.push_back(base::Bind(
315 &DriveFileSyncService::StartBatchSyncForOrigin, 393 &DriveFileSyncService::StartBatchSyncForOrigin,
316 weak_factory_.GetWeakPtr(), origin, resource_id)); 394 weak_factory_.GetWeakPtr(), origin, resource_id));
317 return; 395 return;
318 } 396 }
319 397
320 sync_client_->GetLargestChangeStamp( 398 sync_client_->GetLargestChangeStamp(
321 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, 399 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync,
322 weak_factory_.GetWeakPtr(), 400 weak_factory_.GetWeakPtr(),
323 base::Passed(&token), origin, resource_id)); 401 base::Passed(&token), origin, resource_id));
324 } 402 }
325 403
326 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( 404 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync(
327 scoped_ptr<TaskToken> token, 405 scoped_ptr<TaskToken> token,
328 const GURL& origin, 406 const GURL& origin,
329 const std::string& resource_id, 407 const std::string& resource_id,
330 google_apis::GDataErrorCode error, 408 google_apis::GDataErrorCode error,
331 int64 largest_changestamp) { 409 int64 largest_changestamp) {
332 if (error != google_apis::HTTP_SUCCESS) { 410 if (error != google_apis::HTTP_SUCCESS) {
333 // TODO(tzik): Refine this error code. 411 // TODO(tzik): Refine this error code.
334 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); 412 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass());
335 return; 413 return;
336 } 414 }
337 415
416 DCHECK(token);
417 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving remote files");
338 sync_client_->ListFiles( 418 sync_client_->ListFiles(
339 resource_id, 419 resource_id,
340 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, 420 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync,
341 weak_factory_.GetWeakPtr(), 421 weak_factory_.GetWeakPtr(),
342 base::Passed(&token), origin, largest_changestamp)); 422 base::Passed(&token), origin, largest_changestamp));
343 } 423 }
344 424
345 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( 425 void DriveFileSyncService::DidGetDirectoryContentForBatchSync(
346 scoped_ptr<TaskToken> token, 426 scoped_ptr<TaskToken> token,
347 const GURL& origin, 427 const GURL& origin,
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 const RemoteChange& right) { 514 const RemoteChange& right) {
435 // This should return true if |right| has higher priority than |left|. 515 // This should return true if |right| has higher priority than |left|.
436 // Smaller changestamps have higher priorities (i.e. need to be processed 516 // Smaller changestamps have higher priorities (i.e. need to be processed
437 // earlier). 517 // earlier).
438 if (left.changestamp != right.changestamp) 518 if (left.changestamp != right.changestamp)
439 return left.changestamp > right.changestamp; 519 return left.changestamp > right.changestamp;
440 return false; 520 return false;
441 } 521 }
442 522
443 } // namespace sync_file_system 523 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698