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

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: rebased 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
61 DriveFileSyncService::RemoteChange::RemoteChange() 77 DriveFileSyncService::RemoteChange::RemoteChange()
62 : changestamp(0), 78 : changestamp(0),
63 change(fileapi::FileChange::FILE_CHANGE_ADD_OR_UPDATE, 79 change(fileapi::FileChange::FILE_CHANGE_ADD_OR_UPDATE,
64 fileapi::SYNC_FILE_TYPE_UNKNOWN) { 80 fileapi::SYNC_FILE_TYPE_UNKNOWN) {
65 } 81 }
66 82
67 DriveFileSyncService::RemoteChange::RemoteChange( 83 DriveFileSyncService::RemoteChange::RemoteChange(
68 int64 changestamp, 84 int64 changestamp,
69 const std::string& resource_id, 85 const std::string& resource_id,
70 const fileapi::FileSystemURL& url, 86 const fileapi::FileSystemURL& url,
(...skipping 11 matching lines...) Expand all
82 const RemoteChange& left, 98 const RemoteChange& left,
83 const RemoteChange& right) { 99 const RemoteChange& right) {
84 // This should return true if |right| has higher priority than |left|. 100 // This should return true if |right| has higher priority than |left|.
85 // Smaller changestamps have higher priorities (i.e. need to be processed 101 // Smaller changestamps have higher priorities (i.e. need to be processed
86 // earlier). 102 // earlier).
87 if (left.changestamp != right.changestamp) 103 if (left.changestamp != right.changestamp)
88 return left.changestamp > right.changestamp; 104 return left.changestamp > right.changestamp;
89 return false; 105 return false;
90 } 106 }
91 107
92 // Called by CreateForTesting. 108 DriveFileSyncService::DriveFileSyncService(Profile* profile)
93 DriveFileSyncService::DriveFileSyncService( 109 : last_operation_status_(fileapi::SYNC_STATUS_OK),
94 scoped_ptr<DriveFileSyncClient> sync_client, 110 state_(REMOTE_SERVICE_OK),
95 scoped_ptr<DriveMetadataStore> metadata_store)
96 : status_(fileapi::SYNC_STATUS_OK),
97 largest_changestamp_(0), 111 largest_changestamp_(0),
98 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 112 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
99 token_.reset(new TaskToken(weak_factory_.GetWeakPtr())); 113 token_.reset(new TaskToken(weak_factory_.GetWeakPtr()));
100 sync_client_ = sync_client.Pass();
101 metadata_store_ = metadata_store.Pass();
102
103 DidInitializeMetadataStore(GetToken(FROM_HERE),
104 fileapi::SYNC_STATUS_OK, false);
105 }
106
107 DriveFileSyncService::DriveFileSyncService(Profile* profile)
108 : status_(fileapi::SYNC_STATUS_OK),
109 largest_changestamp_(0),
110 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
111 token_.reset(new TaskToken(weak_factory_.GetWeakPtr()));
112 114
113 sync_client_.reset(new DriveFileSyncClient(profile)); 115 sync_client_.reset(new DriveFileSyncClient(profile));
114 116
115 metadata_store_.reset(new DriveMetadataStore( 117 metadata_store_.reset(new DriveMetadataStore(
116 profile->GetPath(), 118 profile->GetPath(),
117 content::BrowserThread::GetMessageLoopProxyForThread( 119 content::BrowserThread::GetMessageLoopProxyForThread(
118 content::BrowserThread::FILE))); 120 content::BrowserThread::FILE)));
119 121
120 metadata_store_->Initialize( 122 metadata_store_->Initialize(
121 base::Bind(&DriveFileSyncService::DidInitializeMetadataStore, 123 base::Bind(&DriveFileSyncService::DidInitializeMetadataStore,
122 weak_factory_.GetWeakPtr(), 124 weak_factory_.GetWeakPtr(),
123 base::Passed(GetToken(FROM_HERE)))); 125 base::Passed(GetToken(FROM_HERE, TASK_TYPE_DATABASE,
126 "Metadata database initialization"))));
124 } 127 }
125 128
126 DriveFileSyncService::~DriveFileSyncService() { 129 DriveFileSyncService::~DriveFileSyncService() {
127 } 130 }
128 131
129 // static 132 // static
130 scoped_ptr<DriveFileSyncService> DriveFileSyncService::CreateForTesting( 133 scoped_ptr<DriveFileSyncService> DriveFileSyncService::CreateForTesting(
131 scoped_ptr<DriveFileSyncClient> sync_client, 134 scoped_ptr<DriveFileSyncClient> sync_client,
132 scoped_ptr<DriveMetadataStore> metadata_store) { 135 scoped_ptr<DriveMetadataStore> metadata_store) {
133 return make_scoped_ptr(new DriveFileSyncService( 136 return make_scoped_ptr(new DriveFileSyncService(
134 sync_client.Pass(), metadata_store.Pass())); 137 sync_client.Pass(), metadata_store.Pass()));
135 } 138 }
136 139
137 void DriveFileSyncService::AddObserver(Observer* observer) { 140 void DriveFileSyncService::AddObserver(Observer* observer) {
138 observers_.AddObserver(observer); 141 observers_.AddObserver(observer);
139 } 142 }
140 143
141 void DriveFileSyncService::RemoveObserver(Observer* observer) { 144 void DriveFileSyncService::RemoveObserver(Observer* observer) {
142 observers_.RemoveObserver(observer); 145 observers_.RemoveObserver(observer);
143 } 146 }
144 147
145 void DriveFileSyncService::RegisterOriginForTrackingChanges( 148 void DriveFileSyncService::RegisterOriginForTrackingChanges(
146 const GURL& origin, 149 const GURL& origin,
147 const fileapi::SyncStatusCallback& callback) { 150 const fileapi::SyncStatusCallback& callback) {
148 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 151 scoped_ptr<TaskToken> token(GetToken(
152 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata"));
149 if (!token) { 153 if (!token) {
150 pending_tasks_.push_back(base::Bind( 154 pending_tasks_.push_back(base::Bind(
151 &DriveFileSyncService::RegisterOriginForTrackingChanges, 155 &DriveFileSyncService::RegisterOriginForTrackingChanges,
152 weak_factory_.GetWeakPtr(), origin, callback)); 156 weak_factory_.GetWeakPtr(), origin, callback));
153 return; 157 return;
154 } 158 }
155 159
156 if (status_ != fileapi::SYNC_STATUS_OK) { 160 if (state_ == REMOTE_SERVICE_DISABLED) {
157 NotifyTaskDone(status_, token.Pass()); 161 token->ResetTask(FROM_HERE);
158 callback.Run(status_); 162 NotifyTaskDone(last_operation_status_, token.Pass());
163 callback.Run(last_operation_status_);
159 return; 164 return;
160 } 165 }
161 166
162 if (metadata_store_->IsIncrementalSyncOrigin(origin) || 167 if (metadata_store_->IsIncrementalSyncOrigin(origin) ||
163 metadata_store_->IsBatchSyncOrigin(origin)) { 168 metadata_store_->IsBatchSyncOrigin(origin)) {
169 token->ResetTask(FROM_HERE);
164 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); 170 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
165 callback.Run(fileapi::SYNC_STATUS_OK); 171 callback.Run(fileapi::SYNC_STATUS_OK);
166 return; 172 return;
167 } 173 }
168 174
169 DCHECK(!metadata_store_->sync_root_directory().empty()); 175 DCHECK(!metadata_store_->sync_root_directory().empty());
170 sync_client_->GetDriveDirectoryForOrigin( 176 sync_client_->GetDriveDirectoryForOrigin(
171 metadata_store_->sync_root_directory(), origin, 177 metadata_store_->sync_root_directory(), origin,
172 base::Bind(&DriveFileSyncService::DidGetDirectoryForOrigin, 178 base::Bind(&DriveFileSyncService::DidGetDirectoryForOrigin,
173 weak_factory_.GetWeakPtr(), base::Passed(&token), 179 weak_factory_.GetWeakPtr(), base::Passed(&token),
174 origin, callback)); 180 origin, callback));
175 } 181 }
176 182
177 void DriveFileSyncService::UnregisterOriginForTrackingChanges( 183 void DriveFileSyncService::UnregisterOriginForTrackingChanges(
178 const GURL& origin, 184 const GURL& origin,
179 const fileapi::SyncStatusCallback& callback) { 185 const fileapi::SyncStatusCallback& callback) {
180 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 186 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, ""));
181 if (!token) { 187 if (!token) {
182 pending_tasks_.push_back(base::Bind( 188 pending_tasks_.push_back(base::Bind(
183 &DriveFileSyncService::UnregisterOriginForTrackingChanges, 189 &DriveFileSyncService::UnregisterOriginForTrackingChanges,
184 weak_factory_.GetWeakPtr(), origin, callback)); 190 weak_factory_.GetWeakPtr(), origin, callback));
185 return; 191 return;
186 } 192 }
187 193
188 changestamp_map_.erase(origin); 194 changestamp_map_.erase(origin);
189 195
190 std::vector<RemoteChange> new_queue; 196 std::vector<RemoteChange> new_queue;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 236
231 void DriveFileSyncService::ApplyLocalChange( 237 void DriveFileSyncService::ApplyLocalChange(
232 const fileapi::FileChange& change, 238 const fileapi::FileChange& change,
233 const FilePath& local_path, 239 const FilePath& local_path,
234 const fileapi::FileSystemURL& url, 240 const fileapi::FileSystemURL& url,
235 const fileapi::SyncStatusCallback& callback) { 241 const fileapi::SyncStatusCallback& callback) {
236 NOTIMPLEMENTED(); 242 NOTIMPLEMENTED();
237 callback.Run(fileapi::SYNC_STATUS_FAILED); 243 callback.Run(fileapi::SYNC_STATUS_FAILED);
238 } 244 }
239 245
246 // Called by CreateForTesting.
247 DriveFileSyncService::DriveFileSyncService(
248 scoped_ptr<DriveFileSyncClient> sync_client,
249 scoped_ptr<DriveMetadataStore> metadata_store)
250 : last_operation_status_(fileapi::SYNC_STATUS_OK),
251 state_(REMOTE_SERVICE_OK),
252 largest_changestamp_(0),
253 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
254 token_.reset(new TaskToken(weak_factory_.GetWeakPtr()));
255 sync_client_ = sync_client.Pass();
256 metadata_store_ = metadata_store.Pass();
257
258 DidInitializeMetadataStore(
259 GetToken(FROM_HERE, TASK_TYPE_NONE, "Drive initialization for testing"),
260 fileapi::SYNC_STATUS_OK, false);
261 }
262
240 scoped_ptr<DriveFileSyncService::TaskToken> DriveFileSyncService::GetToken( 263 scoped_ptr<DriveFileSyncService::TaskToken> DriveFileSyncService::GetToken(
241 const tracked_objects::Location& from_here) { 264 const tracked_objects::Location& from_here,
265 TaskType task_type,
266 const std::string& description) {
242 if (!token_) 267 if (!token_)
243 return scoped_ptr<TaskToken>(); 268 return scoped_ptr<TaskToken>();
244 token_->set_location(from_here); 269 token_->UpdateTask(from_here, task_type, description);
245 return token_.Pass(); 270 return token_.Pass();
246 } 271 }
247 272
248 void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status, 273 void DriveFileSyncService::NotifyTaskDone(fileapi::SyncStatusCode status,
249 scoped_ptr<TaskToken> token) { 274 scoped_ptr<TaskToken> token) {
250 DCHECK(token); 275 DCHECK(token);
251 bool status_changed = status_ != status; 276 last_operation_status_ = status;
252 status_ = status;
253 token_ = token.Pass(); 277 token_ = token.Pass();
254 token_->set_location(tracked_objects::Location());
255 278
279 if (token_->task_type() != TASK_TYPE_NONE) {
280 RemoteServiceState old_state = state_;
281 UpdateServiceState();
282
283 // Notify remote sync service state for healthy running updates (OK to OK
284 // state transition) and for any state changes.
285 if ((state_ == REMOTE_SERVICE_OK && !token_->description().empty()) ||
286 old_state != state_) {
287 FOR_EACH_OBSERVER(Observer, observers_,
288 OnRemoteServiceStateUpdated(state_,
289 token_->description()));
290 }
291 }
292
293 token_->ResetTask(FROM_HERE);
256 if (status == fileapi::SYNC_STATUS_OK && !pending_tasks_.empty()) { 294 if (status == fileapi::SYNC_STATUS_OK && !pending_tasks_.empty()) {
257 base::Closure closure = pending_tasks_.front(); 295 base::Closure closure = pending_tasks_.front();
258 pending_tasks_.pop_front(); 296 pending_tasks_.pop_front();
259 closure.Run(); 297 closure.Run();
260 } 298 }
299 }
261 300
262 if (status_changed) { 301 void DriveFileSyncService::UpdateServiceState() {
263 // TODO(tzik): Refine the status to track the error. 302 switch (last_operation_status_) {
264 FOR_EACH_OBSERVER(Observer, observers_, OnRemoteSyncStatusChanged(status)); 303 // Possible regular operation errors.
304 case fileapi::SYNC_STATUS_OK:
305 case fileapi::SYNC_STATUS_FILE_BUSY:
306 case fileapi::SYNC_STATUS_HAS_CONFLICT:
307 case fileapi::SYNC_STATUS_NOT_A_CONFLICT:
308 case fileapi::SYNC_STATUS_NO_CHANGE_TO_SYNC:
309 case fileapi::SYNC_FILE_ERROR_NOT_FOUND:
310 case fileapi::SYNC_FILE_ERROR_FAILED:
311 case fileapi::SYNC_FILE_ERROR_NO_SPACE:
312 // If the service type was DRIVE and the status was ok, the state
313 // should be migrated to OK state.
314 if (token_->task_type() == TASK_TYPE_DRIVE)
315 state_ = REMOTE_SERVICE_OK;
316 break;
317
318 // Authentication error.
319 case fileapi::SYNC_STATUS_AUTHENTICATION_FAILED:
320 state_ = REMOTE_SERVICE_AUTHENTICATION_REQUIRED;
321 break;
322
323 // Errors which could make the service temporarily unavailable.
324 case fileapi::SYNC_STATUS_RETRY:
325 case fileapi::SYNC_STATUS_NETWORK_ERROR:
326 state_ = REMOTE_SERVICE_TEMPORARY_UNAVAILABLE;
327 break;
328
329 // Errors which would require manual user intervention to resolve.
330 case fileapi::SYNC_DATABASE_ERROR_CORRUPTION:
331 case fileapi::SYNC_DATABASE_ERROR_IO_ERROR:
332 case fileapi::SYNC_DATABASE_ERROR_FAILED:
333 case fileapi::SYNC_STATUS_ABORT:
334 case fileapi::SYNC_STATUS_FAILED:
335 state_ = REMOTE_SERVICE_DISABLED;
336 break;
337
338 // Unexpected status code. They should be explicitly added to one of the
339 // above three cases.
340 default:
341 NOTREACHED();
342 state_ = REMOTE_SERVICE_DISABLED;
343 break;
265 } 344 }
266 } 345 }
267 346
268 void DriveFileSyncService::DidInitializeMetadataStore( 347 void DriveFileSyncService::DidInitializeMetadataStore(
269 scoped_ptr<TaskToken> token, 348 scoped_ptr<TaskToken> token,
270 fileapi::SyncStatusCode status, 349 fileapi::SyncStatusCode status,
271 bool created) { 350 bool created) {
272 if (status != fileapi::SYNC_STATUS_OK) { 351 if (status != fileapi::SYNC_STATUS_OK) {
273 NotifyTaskDone(status, token.Pass()); 352 NotifyTaskDone(status, token.Pass());
274 return; 353 return;
275 } 354 }
276 355
277 if (metadata_store_->sync_root_directory().empty()) { 356 if (metadata_store_->sync_root_directory().empty()) {
278 DCHECK(metadata_store_->batch_sync_origins().empty()); 357 DCHECK(metadata_store_->batch_sync_origins().empty());
279 DCHECK(metadata_store_->incremental_sync_origins().empty()); 358 DCHECK(metadata_store_->incremental_sync_origins().empty());
280 359
360 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root");
281 sync_client_->GetDriveDirectoryForSyncRoot( 361 sync_client_->GetDriveDirectoryForSyncRoot(
282 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, 362 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory,
283 weak_factory_.GetWeakPtr(), 363 weak_factory_.GetWeakPtr(),
284 base::Passed(&token))); 364 base::Passed(&token)));
285 return; 365 return;
286 } 366 }
287 NotifyTaskDone(status, token.Pass()); 367 NotifyTaskDone(status, token.Pass());
288 368
289 for (std::map<GURL, std::string>::const_iterator itr = 369 for (std::map<GURL, std::string>::const_iterator itr =
290 metadata_store_->batch_sync_origins().begin(); 370 metadata_store_->batch_sync_origins().begin();
(...skipping 13 matching lines...) Expand all
304 return; 384 return;
305 } 385 }
306 386
307 metadata_store_->SetSyncRootDirectory(resource_id); 387 metadata_store_->SetSyncRootDirectory(resource_id);
308 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); 388 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass());
309 } 389 }
310 390
311 void DriveFileSyncService::StartBatchSyncForOrigin( 391 void DriveFileSyncService::StartBatchSyncForOrigin(
312 const GURL& origin, 392 const GURL& origin,
313 const std::string& resource_id) { 393 const std::string& resource_id) {
314 scoped_ptr<TaskToken> token(GetToken(FROM_HERE)); 394 scoped_ptr<TaskToken> token(
395 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp"));
315 if (!token) { 396 if (!token) {
316 pending_tasks_.push_back(base::Bind( 397 pending_tasks_.push_back(base::Bind(
317 &DriveFileSyncService::StartBatchSyncForOrigin, 398 &DriveFileSyncService::StartBatchSyncForOrigin,
318 weak_factory_.GetWeakPtr(), origin, resource_id)); 399 weak_factory_.GetWeakPtr(), origin, resource_id));
319 return; 400 return;
320 } 401 }
321 402
322 sync_client_->GetLargestChangeStamp( 403 sync_client_->GetLargestChangeStamp(
323 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, 404 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync,
324 weak_factory_.GetWeakPtr(), 405 weak_factory_.GetWeakPtr(),
(...skipping 27 matching lines...) Expand all
352 const GURL& origin, 433 const GURL& origin,
353 const std::string& resource_id, 434 const std::string& resource_id,
354 google_apis::GDataErrorCode error, 435 google_apis::GDataErrorCode error,
355 int64 largest_changestamp) { 436 int64 largest_changestamp) {
356 if (error != google_apis::HTTP_SUCCESS) { 437 if (error != google_apis::HTTP_SUCCESS) {
357 // TODO(tzik): Refine this error code. 438 // TODO(tzik): Refine this error code.
358 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); 439 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass());
359 return; 440 return;
360 } 441 }
361 442
443 DCHECK(token);
444 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving remote files");
362 sync_client_->ListFiles( 445 sync_client_->ListFiles(
363 resource_id, 446 resource_id,
364 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, 447 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync,
365 weak_factory_.GetWeakPtr(), 448 weak_factory_.GetWeakPtr(),
366 base::Passed(&token), origin, largest_changestamp)); 449 base::Passed(&token), origin, largest_changestamp));
367 } 450 }
368 451
369 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( 452 void DriveFileSyncService::DidGetDirectoryContentForBatchSync(
370 scoped_ptr<TaskToken> token, 453 scoped_ptr<TaskToken> token,
371 const GURL& origin, 454 const GURL& origin,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 int64 another_changestamp = inserted.first->second; 518 int64 another_changestamp = inserted.first->second;
436 if (another_changestamp > changestamp) 519 if (another_changestamp > changestamp)
437 return; 520 return;
438 inserted.first->second = changestamp; 521 inserted.first->second = changestamp;
439 } 522 }
440 523
441 pending_changes_.push(change); 524 pending_changes_.push(change);
442 } 525 }
443 526
444 } // namespace sync_file_system 527 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698