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

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

Issue 236313009: [SyncFS] Post tasks between SyncEngine and SyncWorker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Post callback functions Created 6 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/sync_worker.h" 5 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 namespace sync_file_system { 49 namespace sync_file_system {
50 50
51 class RemoteChangeProcessor; 51 class RemoteChangeProcessor;
52 52
53 namespace drive_backend { 53 namespace drive_backend {
54 54
55 namespace { 55 namespace {
56 56
57 void EmptyStatusCallback(SyncStatusCode status) {} 57 void EmptyStatusCallback(SyncStatusCode status) {}
58 58
59 template <typename T>
60 void RelayToTaskRunner(
61 base::TaskRunner* task_runner,
62 const tracked_objects::Location& from_here,
63 const base::Callback<void(T)>& callback,
64 typename base::internal::CallbackParamTraits<T>::ForwardType& p1) {
65 task_runner->PostTask(from_here,
66 base::Bind(callback,
67 base::internal::CallbackForward(p1)));
68 }
69
70 template <typename T1, typename T2>
71 void RelayToTaskRunner(
72 base::TaskRunner* task_runner,
73 const tracked_objects::Location& from_here,
74 const base::Callback<void(T1, T2)>& callback,
75 const T1& p1,
76 typename base::internal::CallbackParamTraits<T2>::ForwardType& p2) {
77 task_runner->PostTask(from_here,
78 base::Bind(callback,
79 p1,
80 base::internal::CallbackForward(p2)));
81 }
82
59 } // namespace 83 } // namespace
60 84
61 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( 85 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker(
62 const base::WeakPtr<drive_backend::SyncEngine>& sync_engine, 86 const base::WeakPtr<drive_backend::SyncEngine>& sync_engine,
63 const base::FilePath& base_dir, 87 const base::FilePath& base_dir,
64 scoped_ptr<SyncEngineContext> sync_engine_context, 88 scoped_ptr<SyncEngineContext> sync_engine_context,
65 leveldb::Env* env_override) { 89 leveldb::Env* env_override) {
66 scoped_ptr<SyncWorker> sync_worker( 90 scoped_ptr<SyncWorker> sync_worker(
67 new SyncWorker(sync_engine, 91 new SyncWorker(sync_engine,
68 base_dir, 92 base_dir,
(...skipping 23 matching lines...) Expand all
92 116
93 void SyncWorker::RegisterOrigin( 117 void SyncWorker::RegisterOrigin(
94 const GURL& origin, 118 const GURL& origin,
95 const SyncStatusCallback& callback) { 119 const SyncStatusCallback& callback) {
96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) 120 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken())
97 PostInitializeTask(); 121 PostInitializeTask();
98 122
99 scoped_ptr<RegisterAppTask> task( 123 scoped_ptr<RegisterAppTask> task(
100 new RegisterAppTask(context_.get(), origin.host())); 124 new RegisterAppTask(context_.get(), origin.host()));
101 if (task->CanFinishImmediately()) { 125 if (task->CanFinishImmediately()) {
102 callback.Run(SYNC_STATUS_OK); 126 RelayToTaskRunner(context_->GetBlockingTaskRunner(),
127 FROM_HERE, callback, SYNC_STATUS_OK);
tzik 2014/04/17 17:48:32 All existing RelayToTaskRunner usage in this file
peria 2014/04/18 05:19:36 Done. I may have misunderstood the usage of RelayT
103 return; 128 return;
104 } 129 }
105 130
106 task_manager_->ScheduleSyncTask( 131 task_manager_->ScheduleSyncTask(
107 FROM_HERE, 132 FROM_HERE,
108 task.PassAs<SyncTask>(), 133 task.PassAs<SyncTask>(),
109 SyncTaskManager::PRIORITY_HIGH, 134 SyncTaskManager::PRIORITY_HIGH,
110 callback); 135 callback);
tzik 2014/04/17 17:48:32 This callback is called on the worker thread. It's
peria 2014/04/18 05:19:36 It may be done in the next CL. I put TODO comments
111 } 136 }
112 137
113 void SyncWorker::EnableOrigin( 138 void SyncWorker::EnableOrigin(
114 const GURL& origin, 139 const GURL& origin,
115 const SyncStatusCallback& callback) { 140 const SyncStatusCallback& callback) {
116 task_manager_->ScheduleTask( 141 task_manager_->ScheduleTask(
117 FROM_HERE, 142 FROM_HERE,
118 base::Bind(&SyncWorker::DoEnableApp, 143 base::Bind(&SyncWorker::DoEnableApp,
119 weak_ptr_factory_.GetWeakPtr(), 144 weak_ptr_factory_.GetWeakPtr(),
120 origin.host()), 145 origin.host()),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 229
205 void SyncWorker::SetSyncEnabled(bool enabled) { 230 void SyncWorker::SetSyncEnabled(bool enabled) {
206 if (sync_enabled_ == enabled) 231 if (sync_enabled_ == enabled)
207 return; 232 return;
208 233
209 RemoteServiceState old_state = GetCurrentState(); 234 RemoteServiceState old_state = GetCurrentState();
210 sync_enabled_ = enabled; 235 sync_enabled_ = enabled;
211 if (old_state == GetCurrentState()) 236 if (old_state == GetCurrentState())
212 return; 237 return;
213 238
214 // TODO(peria): PostTask() 239 context_->GetUiTaskRunner()->PostTask(
215 sync_engine_->UpdateSyncEnabled(enabled); 240 FROM_HERE,
241 base::Bind(&SyncEngine::UpdateSyncEnabled, sync_engine_, enabled));
216 } 242 }
217 243
218 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( 244 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy(
219 ConflictResolutionPolicy policy) { 245 ConflictResolutionPolicy policy) {
220 default_conflict_resolution_policy_ = policy; 246 default_conflict_resolution_policy_ = policy;
221 return SYNC_STATUS_OK; 247 return SYNC_STATUS_OK;
222 } 248 }
223 249
224 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( 250 SyncStatusCode SyncWorker::SetConflictResolutionPolicy(
225 const GURL& origin, 251 const GURL& origin,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 293
268 MaybeStartFetchChanges(); 294 MaybeStartFetchChanges();
269 } 295 }
270 296
271 void SyncWorker::NotifyLastOperationStatus( 297 void SyncWorker::NotifyLastOperationStatus(
272 SyncStatusCode status, 298 SyncStatusCode status,
273 bool used_network) { 299 bool used_network) {
274 UpdateServiceStateFromSyncStatusCode(status, used_network); 300 UpdateServiceStateFromSyncStatusCode(status, used_network);
275 301
276 if (GetMetadataDatabase()) { 302 if (GetMetadataDatabase()) {
277 // TODO(peria): Post task 303 context_->GetUiTaskRunner()->PostTask(
278 sync_engine_->NotifyLastOperationStatus(); 304 FROM_HERE,
305 base::Bind(&SyncEngine::NotifyLastOperationStatus, sync_engine_));
279 } 306 }
280 } 307 }
281 308
282 void SyncWorker::OnNotificationReceived() { 309 void SyncWorker::OnNotificationReceived() {
283 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) 310 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)
284 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); 311 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive.");
285 312
286 should_check_remote_change_ = true; 313 should_check_remote_change_ = true;
287 MaybeScheduleNextTask(); 314 MaybeScheduleNextTask();
288 } 315 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 sync_enabled_(false), 380 sync_enabled_(false),
354 default_conflict_resolution_policy_( 381 default_conflict_resolution_policy_(
355 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), 382 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN),
356 network_available_(false), 383 network_available_(false),
357 context_(sync_engine_context.Pass()), 384 context_(sync_engine_context.Pass()),
358 sync_engine_(sync_engine), 385 sync_engine_(sync_engine),
359 weak_ptr_factory_(this) {} 386 weak_ptr_factory_(this) {}
360 387
361 void SyncWorker::DoDisableApp(const std::string& app_id, 388 void SyncWorker::DoDisableApp(const std::string& app_id,
362 const SyncStatusCallback& callback) { 389 const SyncStatusCallback& callback) {
363 if (GetMetadataDatabase()) 390 if (GetMetadataDatabase()) {
364 GetMetadataDatabase()->DisableApp(app_id, callback); 391 GetMetadataDatabase()->DisableApp(app_id, callback);
365 else 392 } else {
366 callback.Run(SYNC_STATUS_OK); 393 RelayToTaskRunner(context_->GetBlockingTaskRunner(),
394 FROM_HERE, callback, SYNC_STATUS_OK);
395 }
367 } 396 }
368 397
369 void SyncWorker::DoEnableApp(const std::string& app_id, 398 void SyncWorker::DoEnableApp(const std::string& app_id,
370 const SyncStatusCallback& callback) { 399 const SyncStatusCallback& callback) {
371 if (GetMetadataDatabase()) 400 if (GetMetadataDatabase()) {
372 GetMetadataDatabase()->EnableApp(app_id, callback); 401 GetMetadataDatabase()->EnableApp(app_id, callback);
373 else 402 } else {
374 callback.Run(SYNC_STATUS_OK); 403 RelayToTaskRunner(context_->GetBlockingTaskRunner(),
404 FROM_HERE, callback, SYNC_STATUS_OK);
405 }
375 } 406 }
376 407
377 void SyncWorker::PostInitializeTask() { 408 void SyncWorker::PostInitializeTask() {
378 DCHECK(!GetMetadataDatabase()); 409 DCHECK(!GetMetadataDatabase());
379 410
380 // This initializer task may not run if MetadataDatabase in context_ is 411 // This initializer task may not run if MetadataDatabase in context_ is
381 // already initialized when it runs. 412 // already initialized when it runs.
382 SyncEngineInitializer* initializer = 413 SyncEngineInitializer* initializer =
383 new SyncEngineInitializer(context_.get(), 414 new SyncEngineInitializer(context_.get(),
384 context_->GetBlockingTaskRunner(), 415 context_->GetBlockingTaskRunner(),
(...skipping 18 matching lines...) Expand all
403 "Authentication required."); 434 "Authentication required.");
404 } 435 }
405 return; 436 return;
406 } 437 }
407 438
408 scoped_ptr<MetadataDatabase> metadata_database = 439 scoped_ptr<MetadataDatabase> metadata_database =
409 initializer->PassMetadataDatabase(); 440 initializer->PassMetadataDatabase();
410 if (metadata_database) 441 if (metadata_database)
411 context_->SetMetadataDatabase(metadata_database.Pass()); 442 context_->SetMetadataDatabase(metadata_database.Pass());
412 443
413 // TODO(peria): Post task 444 context_->GetUiTaskRunner()->PostTask(
414 sync_engine_->UpdateRegisteredApps(); 445 FROM_HERE,
446 base::Bind(&SyncEngine::UpdateRegisteredApps, sync_engine_));
415 } 447 }
416 448
417 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, 449 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer,
418 const SyncFileCallback& callback, 450 const SyncFileCallback& callback,
419 SyncStatusCode status) { 451 SyncStatusCode status) {
420 if (syncer->is_sync_root_deletion()) { 452 if (syncer->is_sync_root_deletion()) {
421 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); 453 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase());
422 PostInitializeTask(); 454 PostInitializeTask();
423 callback.Run(status, syncer->url()); 455 RelayToTaskRunner(context_->GetUiTaskRunner(),
456 FROM_HERE,
457 callback,
458 status,
459 syncer->url());
424 return; 460 return;
425 } 461 }
426 462
427 if (status == SYNC_STATUS_OK) { 463 if (status == SYNC_STATUS_OK) {
428 // TODO(peria): Post task 464 context_->GetUiTaskRunner()->PostTask(
429 sync_engine_->DidProcessRemoteChange(syncer); 465 FROM_HERE,
466 base::Bind(&SyncEngine::DidProcessRemoteChange, sync_engine_, syncer));
430 467
431 if (syncer->sync_action() == SYNC_ACTION_DELETED && 468 if (syncer->sync_action() == SYNC_ACTION_DELETED &&
432 syncer->url().is_valid() && 469 syncer->url().is_valid() &&
433 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { 470 fileapi::VirtualPath::IsRootPath(syncer->url().path())) {
434 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); 471 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback));
435 } 472 }
436 should_check_conflict_ = true; 473 should_check_conflict_ = true;
437 } 474 }
438 callback.Run(status, syncer->url()); 475
476 RelayToTaskRunner(context_->GetUiTaskRunner(),
477 FROM_HERE,
478 callback,
479 status,
480 syncer->url());
439 } 481 }
440 482
441 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, 483 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer,
442 const SyncStatusCallback& callback, 484 const SyncStatusCallback& callback,
443 SyncStatusCode status) { 485 SyncStatusCode status) {
444 // TODO(peria): Post task 486 // TODO(peria): PostTask (Simple replace fails DriveBackendSync* tests)
445 sync_engine_->DidApplyLocalChange(syncer, status); 487 sync_engine_->DidApplyLocalChange(syncer, status);
446 488
447 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { 489 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) {
448 RegisterOrigin(syncer->url().origin(), 490 RegisterOrigin(syncer->url().origin(),
449 base::Bind(&EmptyStatusCallback)); 491 base::Bind(&EmptyStatusCallback));
450 } 492 }
451 493
452 if (syncer->needs_remote_change_listing() && 494 if (syncer->needs_remote_change_listing() &&
453 !listing_remote_changes_) { 495 !listing_remote_changes_) {
454 task_manager_->ScheduleSyncTask( 496 task_manager_->ScheduleSyncTask(
455 FROM_HERE, 497 FROM_HERE,
456 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), 498 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())),
457 SyncTaskManager::PRIORITY_HIGH, 499 SyncTaskManager::PRIORITY_HIGH,
458 base::Bind(&SyncWorker::DidFetchChanges, 500 base::Bind(&SyncWorker::DidFetchChanges,
459 weak_ptr_factory_.GetWeakPtr())); 501 weak_ptr_factory_.GetWeakPtr()));
460 should_check_remote_change_ = false; 502 should_check_remote_change_ = false;
461 listing_remote_changes_ = true; 503 listing_remote_changes_ = true;
462 time_to_check_changes_ = 504 time_to_check_changes_ =
463 base::TimeTicks::Now() + 505 base::TimeTicks::Now() +
464 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); 506 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds);
465 } 507 }
466 508
467 if (status != SYNC_STATUS_OK &&
468 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) {
469 callback.Run(status);
470 return;
471 }
472
473 if (status == SYNC_STATUS_OK) 509 if (status == SYNC_STATUS_OK)
474 should_check_conflict_ = true; 510 should_check_conflict_ = true;
475 511
476 callback.Run(status); 512 RelayToTaskRunner(context_->GetBlockingTaskRunner(),
513 FROM_HERE, callback, status);
477 } 514 }
478 515
479 void SyncWorker::MaybeStartFetchChanges() { 516 void SyncWorker::MaybeStartFetchChanges() {
480 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) 517 if (GetCurrentState() == REMOTE_SERVICE_DISABLED)
481 return; 518 return;
482 519
483 if (!GetMetadataDatabase()) 520 if (!GetMetadataDatabase())
484 return; 521 return;
485 522
486 if (listing_remote_changes_) 523 if (listing_remote_changes_)
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 const std::string& description) { 613 const std::string& description) {
577 RemoteServiceState old_state = GetCurrentState(); 614 RemoteServiceState old_state = GetCurrentState();
578 service_state_ = state; 615 service_state_ = state;
579 616
580 if (old_state == GetCurrentState()) 617 if (old_state == GetCurrentState())
581 return; 618 return;
582 619
583 util::Log(logging::LOG_VERBOSE, FROM_HERE, 620 util::Log(logging::LOG_VERBOSE, FROM_HERE,
584 "Service state changed: %d->%d: %s", 621 "Service state changed: %d->%d: %s",
585 old_state, GetCurrentState(), description.c_str()); 622 old_state, GetCurrentState(), description.c_str());
586 // TODO(peria): Post task 623
587 sync_engine_->UpdateServiceState(description); 624 context_->GetUiTaskRunner()->PostTask(
625 FROM_HERE,
626 base::Bind(&SyncEngine::UpdateServiceState, sync_engine_, description));
588 } 627 }
589 628
590 } // namespace drive_backend 629 } // namespace drive_backend
591 } // namespace sync_file_system 630 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698