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

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: Work for comments 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
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 92
93 void SyncWorker::RegisterOrigin( 93 void SyncWorker::RegisterOrigin(
94 const GURL& origin, 94 const GURL& origin,
95 const SyncStatusCallback& callback) { 95 const SyncStatusCallback& callback) {
96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) 96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken())
97 PostInitializeTask(); 97 PostInitializeTask();
98 98
99 scoped_ptr<RegisterAppTask> task( 99 scoped_ptr<RegisterAppTask> task(
100 new RegisterAppTask(context_.get(), origin.host())); 100 new RegisterAppTask(context_.get(), origin.host()));
101 if (task->CanFinishImmediately()) { 101 if (task->CanFinishImmediately()) {
102 callback.Run(SYNC_STATUS_OK); 102 context_->GetUiTaskRunner()->PostTask(
103 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
103 return; 104 return;
104 } 105 }
105 106
107 // TODO(peria): Forward |callback| to UI thread.
106 task_manager_->ScheduleSyncTask( 108 task_manager_->ScheduleSyncTask(
107 FROM_HERE, 109 FROM_HERE,
108 task.PassAs<SyncTask>(), 110 task.PassAs<SyncTask>(),
109 SyncTaskManager::PRIORITY_HIGH, 111 SyncTaskManager::PRIORITY_HIGH,
110 callback); 112 callback);
111 } 113 }
112 114
113 void SyncWorker::EnableOrigin( 115 void SyncWorker::EnableOrigin(
114 const GURL& origin, 116 const GURL& origin,
115 const SyncStatusCallback& callback) { 117 const SyncStatusCallback& callback) {
118 // TODO(peria): Forward |callback| to UI thread.
116 task_manager_->ScheduleTask( 119 task_manager_->ScheduleTask(
117 FROM_HERE, 120 FROM_HERE,
118 base::Bind(&SyncWorker::DoEnableApp, 121 base::Bind(&SyncWorker::DoEnableApp,
119 weak_ptr_factory_.GetWeakPtr(), 122 weak_ptr_factory_.GetWeakPtr(),
120 origin.host()), 123 origin.host()),
121 SyncTaskManager::PRIORITY_HIGH, 124 SyncTaskManager::PRIORITY_HIGH,
122 callback); 125 callback);
123 } 126 }
124 127
125 void SyncWorker::DisableOrigin( 128 void SyncWorker::DisableOrigin(
126 const GURL& origin, 129 const GURL& origin,
127 const SyncStatusCallback& callback) { 130 const SyncStatusCallback& callback) {
131 // TODO(peria): Forward |callback| to UI thread.
128 task_manager_->ScheduleTask( 132 task_manager_->ScheduleTask(
129 FROM_HERE, 133 FROM_HERE,
130 base::Bind(&SyncWorker::DoDisableApp, 134 base::Bind(&SyncWorker::DoDisableApp,
131 weak_ptr_factory_.GetWeakPtr(), 135 weak_ptr_factory_.GetWeakPtr(),
132 origin.host()), 136 origin.host()),
133 SyncTaskManager::PRIORITY_HIGH, 137 SyncTaskManager::PRIORITY_HIGH,
134 callback); 138 callback);
135 } 139 }
136 140
137 void SyncWorker::UninstallOrigin( 141 void SyncWorker::UninstallOrigin(
138 const GURL& origin, 142 const GURL& origin,
139 RemoteFileSyncService::UninstallFlag flag, 143 RemoteFileSyncService::UninstallFlag flag,
140 const SyncStatusCallback& callback) { 144 const SyncStatusCallback& callback) {
145 // TODO(peria): Forward |callback| to UI thread.
141 task_manager_->ScheduleSyncTask( 146 task_manager_->ScheduleSyncTask(
142 FROM_HERE, 147 FROM_HERE,
143 scoped_ptr<SyncTask>( 148 scoped_ptr<SyncTask>(
144 new UninstallAppTask(context_.get(), origin.host(), flag)), 149 new UninstallAppTask(context_.get(), origin.host(), flag)),
145 SyncTaskManager::PRIORITY_HIGH, 150 SyncTaskManager::PRIORITY_HIGH,
146 callback); 151 callback);
147 } 152 }
148 153
149 void SyncWorker::ProcessRemoteChange( 154 void SyncWorker::ProcessRemoteChange(
150 const SyncFileCallback& callback) { 155 const SyncFileCallback& callback) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 209
205 void SyncWorker::SetSyncEnabled(bool enabled) { 210 void SyncWorker::SetSyncEnabled(bool enabled) {
206 if (sync_enabled_ == enabled) 211 if (sync_enabled_ == enabled)
207 return; 212 return;
208 213
209 RemoteServiceState old_state = GetCurrentState(); 214 RemoteServiceState old_state = GetCurrentState();
210 sync_enabled_ = enabled; 215 sync_enabled_ = enabled;
211 if (old_state == GetCurrentState()) 216 if (old_state == GetCurrentState())
212 return; 217 return;
213 218
214 // TODO(peria): PostTask() 219 context_->GetUiTaskRunner()->PostTask(
215 sync_engine_->UpdateSyncEnabled(enabled); 220 FROM_HERE,
221 base::Bind(&SyncEngine::UpdateSyncEnabled, sync_engine_, enabled));
216 } 222 }
217 223
218 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( 224 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy(
219 ConflictResolutionPolicy policy) { 225 ConflictResolutionPolicy policy) {
220 default_conflict_resolution_policy_ = policy; 226 default_conflict_resolution_policy_ = policy;
221 return SYNC_STATUS_OK; 227 return SYNC_STATUS_OK;
222 } 228 }
223 229
224 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( 230 SyncStatusCode SyncWorker::SetConflictResolutionPolicy(
225 const GURL& origin, 231 const GURL& origin,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 273
268 MaybeStartFetchChanges(); 274 MaybeStartFetchChanges();
269 } 275 }
270 276
271 void SyncWorker::NotifyLastOperationStatus( 277 void SyncWorker::NotifyLastOperationStatus(
272 SyncStatusCode status, 278 SyncStatusCode status,
273 bool used_network) { 279 bool used_network) {
274 UpdateServiceStateFromSyncStatusCode(status, used_network); 280 UpdateServiceStateFromSyncStatusCode(status, used_network);
275 281
276 if (GetMetadataDatabase()) { 282 if (GetMetadataDatabase()) {
277 // TODO(peria): Post task 283 context_->GetUiTaskRunner()->PostTask(
278 sync_engine_->NotifyLastOperationStatus(); 284 FROM_HERE,
285 base::Bind(&SyncEngine::NotifyLastOperationStatus, sync_engine_));
279 } 286 }
280 } 287 }
281 288
282 void SyncWorker::OnNotificationReceived() { 289 void SyncWorker::OnNotificationReceived() {
283 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) 290 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)
284 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); 291 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive.");
285 292
286 should_check_remote_change_ = true; 293 should_check_remote_change_ = true;
287 MaybeScheduleNextTask(); 294 MaybeScheduleNextTask();
288 } 295 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 sync_enabled_(false), 360 sync_enabled_(false),
354 default_conflict_resolution_policy_( 361 default_conflict_resolution_policy_(
355 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), 362 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN),
356 network_available_(false), 363 network_available_(false),
357 context_(sync_engine_context.Pass()), 364 context_(sync_engine_context.Pass()),
358 sync_engine_(sync_engine), 365 sync_engine_(sync_engine),
359 weak_ptr_factory_(this) {} 366 weak_ptr_factory_(this) {}
360 367
361 void SyncWorker::DoDisableApp(const std::string& app_id, 368 void SyncWorker::DoDisableApp(const std::string& app_id,
362 const SyncStatusCallback& callback) { 369 const SyncStatusCallback& callback) {
363 if (GetMetadataDatabase()) 370 if (GetMetadataDatabase()) {
364 GetMetadataDatabase()->DisableApp(app_id, callback); 371 GetMetadataDatabase()->DisableApp(app_id, callback);
365 else 372 } else {
366 callback.Run(SYNC_STATUS_OK); 373 context_->GetUiTaskRunner()->PostTask(
374 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
375 }
367 } 376 }
368 377
369 void SyncWorker::DoEnableApp(const std::string& app_id, 378 void SyncWorker::DoEnableApp(const std::string& app_id,
370 const SyncStatusCallback& callback) { 379 const SyncStatusCallback& callback) {
371 if (GetMetadataDatabase()) 380 if (GetMetadataDatabase()) {
372 GetMetadataDatabase()->EnableApp(app_id, callback); 381 GetMetadataDatabase()->EnableApp(app_id, callback);
373 else 382 } else {
374 callback.Run(SYNC_STATUS_OK); 383 context_->GetUiTaskRunner()->PostTask(
384 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
385 }
375 } 386 }
376 387
377 void SyncWorker::PostInitializeTask() { 388 void SyncWorker::PostInitializeTask() {
378 DCHECK(!GetMetadataDatabase()); 389 DCHECK(!GetMetadataDatabase());
379 390
380 // This initializer task may not run if MetadataDatabase in context_ is 391 // This initializer task may not run if MetadataDatabase in context_ is
381 // already initialized when it runs. 392 // already initialized when it runs.
382 SyncEngineInitializer* initializer = 393 SyncEngineInitializer* initializer =
383 new SyncEngineInitializer(context_.get(), 394 new SyncEngineInitializer(context_.get(),
384 context_->GetBlockingTaskRunner(), 395 context_->GetFileTaskRunner(),
385 base_dir_.Append(kDatabaseName), 396 base_dir_.Append(kDatabaseName),
386 env_override_); 397 env_override_);
387 task_manager_->ScheduleSyncTask( 398 task_manager_->ScheduleSyncTask(
388 FROM_HERE, 399 FROM_HERE,
389 scoped_ptr<SyncTask>(initializer), 400 scoped_ptr<SyncTask>(initializer),
390 SyncTaskManager::PRIORITY_HIGH, 401 SyncTaskManager::PRIORITY_HIGH,
391 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), 402 base::Bind(&SyncWorker::DidInitialize,
403 weak_ptr_factory_.GetWeakPtr(),
392 initializer)); 404 initializer));
393 } 405 }
394 406
395 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, 407 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer,
396 SyncStatusCode status) { 408 SyncStatusCode status) {
397 if (status != SYNC_STATUS_OK) { 409 if (status != SYNC_STATUS_OK) {
398 if (GetDriveService()->HasRefreshToken()) { 410 if (GetDriveService()->HasRefreshToken()) {
399 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, 411 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE,
400 "Could not initialize remote service"); 412 "Could not initialize remote service");
401 } else { 413 } else {
402 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, 414 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED,
403 "Authentication required."); 415 "Authentication required.");
404 } 416 }
405 return; 417 return;
406 } 418 }
407 419
408 scoped_ptr<MetadataDatabase> metadata_database = 420 scoped_ptr<MetadataDatabase> metadata_database =
409 initializer->PassMetadataDatabase(); 421 initializer->PassMetadataDatabase();
410 if (metadata_database) 422 if (metadata_database)
411 context_->SetMetadataDatabase(metadata_database.Pass()); 423 context_->SetMetadataDatabase(metadata_database.Pass());
412 424
413 // TODO(peria): Post task 425 context_->GetUiTaskRunner()->PostTask(
414 sync_engine_->UpdateRegisteredApps(); 426 FROM_HERE,
427 base::Bind(&SyncEngine::UpdateRegisteredApps, sync_engine_));
415 } 428 }
416 429
417 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, 430 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer,
418 const SyncFileCallback& callback, 431 const SyncFileCallback& callback,
419 SyncStatusCode status) { 432 SyncStatusCode status) {
420 if (syncer->is_sync_root_deletion()) { 433 if (syncer->is_sync_root_deletion()) {
421 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); 434 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase());
422 PostInitializeTask(); 435 PostInitializeTask();
423 callback.Run(status, syncer->url()); 436 context_->GetUiTaskRunner()->PostTask(
437 FROM_HERE, base::Bind(callback, status, syncer->url()));
424 return; 438 return;
425 } 439 }
426 440
427 if (status == SYNC_STATUS_OK) { 441 if (status == SYNC_STATUS_OK) {
428 // TODO(peria): Post task 442 context_->GetUiTaskRunner()->PostTask(
429 sync_engine_->DidProcessRemoteChange(syncer); 443 FROM_HERE,
444 base::Bind(&SyncEngine::DidProcessRemoteChange, sync_engine_, syncer));
430 445
431 if (syncer->sync_action() == SYNC_ACTION_DELETED && 446 if (syncer->sync_action() == SYNC_ACTION_DELETED &&
432 syncer->url().is_valid() && 447 syncer->url().is_valid() &&
433 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { 448 fileapi::VirtualPath::IsRootPath(syncer->url().path())) {
434 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); 449 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback));
435 } 450 }
436 should_check_conflict_ = true; 451 should_check_conflict_ = true;
437 } 452 }
438 callback.Run(status, syncer->url()); 453
454 context_->GetUiTaskRunner()->PostTask(
455 FROM_HERE,
456 base::Bind(callback, status, syncer->url()));
439 } 457 }
440 458
441 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, 459 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer,
442 const SyncStatusCallback& callback, 460 const SyncStatusCallback& callback,
443 SyncStatusCode status) { 461 SyncStatusCode status) {
444 // TODO(peria): Post task 462 // TODO(peria): PostTask (Simple replace fails DriveBackendSync* tests)
445 sync_engine_->DidApplyLocalChange(syncer, status); 463 sync_engine_->DidApplyLocalChange(syncer, status);
446 464
447 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { 465 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) {
448 RegisterOrigin(syncer->url().origin(), 466 RegisterOrigin(syncer->url().origin(),
449 base::Bind(&EmptyStatusCallback)); 467 base::Bind(&EmptyStatusCallback));
450 } 468 }
451 469
452 if (syncer->needs_remote_change_listing() && 470 if (syncer->needs_remote_change_listing() &&
453 !listing_remote_changes_) { 471 !listing_remote_changes_) {
454 task_manager_->ScheduleSyncTask( 472 task_manager_->ScheduleSyncTask(
455 FROM_HERE, 473 FROM_HERE,
456 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), 474 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())),
457 SyncTaskManager::PRIORITY_HIGH, 475 SyncTaskManager::PRIORITY_HIGH,
458 base::Bind(&SyncWorker::DidFetchChanges, 476 base::Bind(&SyncWorker::DidFetchChanges,
459 weak_ptr_factory_.GetWeakPtr())); 477 weak_ptr_factory_.GetWeakPtr()));
460 should_check_remote_change_ = false; 478 should_check_remote_change_ = false;
461 listing_remote_changes_ = true; 479 listing_remote_changes_ = true;
462 time_to_check_changes_ = 480 time_to_check_changes_ =
463 base::TimeTicks::Now() + 481 base::TimeTicks::Now() +
464 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); 482 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds);
465 } 483 }
466 484
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) 485 if (status == SYNC_STATUS_OK)
474 should_check_conflict_ = true; 486 should_check_conflict_ = true;
475 487
476 callback.Run(status); 488 context_->GetUiTaskRunner()->PostTask(
489 FROM_HERE, base::Bind(callback, status));
477 } 490 }
478 491
479 void SyncWorker::MaybeStartFetchChanges() { 492 void SyncWorker::MaybeStartFetchChanges() {
480 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) 493 if (GetCurrentState() == REMOTE_SERVICE_DISABLED)
481 return; 494 return;
482 495
483 if (!GetMetadataDatabase()) 496 if (!GetMetadataDatabase())
484 return; 497 return;
485 498
486 if (listing_remote_changes_) 499 if (listing_remote_changes_)
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 const std::string& description) { 589 const std::string& description) {
577 RemoteServiceState old_state = GetCurrentState(); 590 RemoteServiceState old_state = GetCurrentState();
578 service_state_ = state; 591 service_state_ = state;
579 592
580 if (old_state == GetCurrentState()) 593 if (old_state == GetCurrentState())
581 return; 594 return;
582 595
583 util::Log(logging::LOG_VERBOSE, FROM_HERE, 596 util::Log(logging::LOG_VERBOSE, FROM_HERE,
584 "Service state changed: %d->%d: %s", 597 "Service state changed: %d->%d: %s",
585 old_state, GetCurrentState(), description.c_str()); 598 old_state, GetCurrentState(), description.c_str());
586 // TODO(peria): Post task 599
587 sync_engine_->UpdateServiceState(description); 600 context_->GetUiTaskRunner()->PostTask(
601 FROM_HERE,
602 base::Bind(&SyncEngine::UpdateServiceState, sync_engine_, description));
588 } 603 }
589 604
590 } // namespace drive_backend 605 } // namespace drive_backend
591 } // namespace sync_file_system 606 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698