Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |