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

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

Issue 288193002: [SyncFS] Construct and destruct sync_worker in worker_task_runner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed RunLoop Created 6 years, 6 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 | Annotate | Revision Log
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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED; 78 (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED;
79 else 79 else
80 (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED; 80 (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED;
81 } 81 }
82 82
83 callback.Run(); 83 callback.Run();
84 } 84 }
85 85
86 } // namespace 86 } // namespace
87 87
88 // static
88 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( 89 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker(
89 const base::FilePath& base_dir, 90 const base::FilePath& base_dir,
90 Observer* observer, 91 Observer* observer,
91 const base::WeakPtr<ExtensionServiceInterface>& extension_service, 92 const base::WeakPtr<ExtensionServiceInterface>& extension_service,
92 scoped_ptr<SyncEngineContext> sync_engine_context, 93 scoped_ptr<SyncEngineContext> sync_engine_context,
93 leveldb::Env* env_override) { 94 leveldb::Env* env_override) {
94 scoped_ptr<SyncWorker> sync_worker( 95 scoped_ptr<SyncWorker> sync_worker(
95 new SyncWorker(base_dir, 96 new SyncWorker(base_dir,
96 extension_service, 97 extension_service,
97 sync_engine_context.Pass(), 98 sync_engine_context.Pass(),
98 env_override)); 99 env_override));
99 sync_worker->AddObserver(observer); 100 sync_worker->AddObserver(observer);
100 sync_worker->Initialize();
101 101
102 return sync_worker.Pass(); 102 return sync_worker.Pass();
103 } 103 }
104 104
105 SyncWorker::~SyncWorker() {} 105 SyncWorker::~SyncWorker() {}
106 106
107 void SyncWorker::Initialize() { 107 void SyncWorker::Initialize() {
108 DCHECK(!task_manager_); 108 DCHECK(!task_manager_);
109 109
110 task_manager_.reset(new SyncTaskManager( 110 task_manager_.reset(new SyncTaskManager(
111 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */)); 111 AsWeakPtr(),
112 0 /* maximum_background_task */));
112 task_manager_->Initialize(SYNC_STATUS_OK); 113 task_manager_->Initialize(SYNC_STATUS_OK);
113 114
114 PostInitializeTask(); 115 PostInitializeTask();
115 116
116 net::NetworkChangeNotifier::ConnectionType type = 117 net::NetworkChangeNotifier::ConnectionType type =
117 net::NetworkChangeNotifier::GetConnectionType(); 118 net::NetworkChangeNotifier::GetConnectionType();
118 network_available_ = 119 network_available_ =
119 type != net::NetworkChangeNotifier::CONNECTION_NONE; 120 type != net::NetworkChangeNotifier::CONNECTION_NONE;
120 } 121 }
121 122
122 void SyncWorker::RegisterOrigin( 123 void SyncWorker::RegisterOrigin(
123 const GURL& origin, 124 const GURL& origin,
124 const SyncStatusCallback& callback) { 125 const SyncStatusCallback& callback) {
125 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) 126 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken())
126 PostInitializeTask(); 127 PostInitializeTask();
127 128
128 scoped_ptr<RegisterAppTask> task( 129 scoped_ptr<RegisterAppTask> task(
129 new RegisterAppTask(context_.get(), origin.host())); 130 new RegisterAppTask(context_.get(), origin.host()));
130 if (task->CanFinishImmediately()) { 131 if (task->CanFinishImmediately()) {
131 context_->GetUITaskRunner()->PostTask( 132 context_->GetUITaskRunner()->PostTask(
132 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); 133 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
133 return; 134 return;
134 } 135 }
135 136
136 // TODO(peria): Forward |callback| to UI thread.
137 task_manager_->ScheduleSyncTask( 137 task_manager_->ScheduleSyncTask(
138 FROM_HERE, 138 FROM_HERE,
139 task.PassAs<SyncTask>(), 139 task.PassAs<SyncTask>(),
140 SyncTaskManager::PRIORITY_HIGH, 140 SyncTaskManager::PRIORITY_HIGH,
141 callback); 141 callback);
142 } 142 }
143 143
144 void SyncWorker::EnableOrigin( 144 void SyncWorker::EnableOrigin(
145 const GURL& origin, 145 const GURL& origin,
146 const SyncStatusCallback& callback) { 146 const SyncStatusCallback& callback) {
147 // TODO(peria): Forward |callback| to UI thread.
148 task_manager_->ScheduleTask( 147 task_manager_->ScheduleTask(
149 FROM_HERE, 148 FROM_HERE,
150 base::Bind(&SyncWorker::DoEnableApp, 149 base::Bind(&SyncWorker::DoEnableApp,
151 weak_ptr_factory_.GetWeakPtr(), 150 AsWeakPtr(),
152 origin.host()), 151 origin.host()),
153 SyncTaskManager::PRIORITY_HIGH, 152 SyncTaskManager::PRIORITY_HIGH,
154 callback); 153 callback);
155 } 154 }
156 155
157 void SyncWorker::DisableOrigin( 156 void SyncWorker::DisableOrigin(
158 const GURL& origin, 157 const GURL& origin,
159 const SyncStatusCallback& callback) { 158 const SyncStatusCallback& callback) {
160 // TODO(peria): Forward |callback| to UI thread.
161 task_manager_->ScheduleTask( 159 task_manager_->ScheduleTask(
162 FROM_HERE, 160 FROM_HERE,
163 base::Bind(&SyncWorker::DoDisableApp, 161 base::Bind(&SyncWorker::DoDisableApp,
164 weak_ptr_factory_.GetWeakPtr(), 162 AsWeakPtr(),
165 origin.host()), 163 origin.host()),
166 SyncTaskManager::PRIORITY_HIGH, 164 SyncTaskManager::PRIORITY_HIGH,
167 callback); 165 callback);
168 } 166 }
169 167
170 void SyncWorker::UninstallOrigin( 168 void SyncWorker::UninstallOrigin(
171 const GURL& origin, 169 const GURL& origin,
172 RemoteFileSyncService::UninstallFlag flag, 170 RemoteFileSyncService::UninstallFlag flag,
173 const SyncStatusCallback& callback) { 171 const SyncStatusCallback& callback) {
174 // TODO(peria): Forward |callback| to UI thread.
175 task_manager_->ScheduleSyncTask( 172 task_manager_->ScheduleSyncTask(
176 FROM_HERE, 173 FROM_HERE,
177 scoped_ptr<SyncTask>( 174 scoped_ptr<SyncTask>(
178 new UninstallAppTask(context_.get(), origin.host(), flag)), 175 new UninstallAppTask(context_.get(), origin.host(), flag)),
179 SyncTaskManager::PRIORITY_HIGH, 176 SyncTaskManager::PRIORITY_HIGH,
180 callback); 177 callback);
181 } 178 }
182 179
183 void SyncWorker::ProcessRemoteChange( 180 void SyncWorker::ProcessRemoteChange(
184 const SyncFileCallback& callback) { 181 const SyncFileCallback& callback) {
185 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); 182 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get());
186 task_manager_->ScheduleSyncTask( 183 task_manager_->ScheduleSyncTask(
187 FROM_HERE, 184 FROM_HERE,
188 scoped_ptr<SyncTask>(syncer), 185 scoped_ptr<SyncTask>(syncer),
189 SyncTaskManager::PRIORITY_MED, 186 SyncTaskManager::PRIORITY_MED,
190 base::Bind(&SyncWorker::DidProcessRemoteChange, 187 base::Bind(&SyncWorker::DidProcessRemoteChange,
191 weak_ptr_factory_.GetWeakPtr(), 188 AsWeakPtr(),
192 syncer, callback)); 189 syncer, callback));
193 } 190 }
194 191
195 void SyncWorker::SetRemoteChangeProcessor( 192 void SyncWorker::SetRemoteChangeProcessor(
196 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { 193 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) {
197 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); 194 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker);
198 } 195 }
199 196
200 RemoteServiceState SyncWorker::GetCurrentState() const { 197 RemoteServiceState SyncWorker::GetCurrentState() const {
201 if (!sync_enabled_) 198 if (!sync_enabled_)
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 const SyncFileMetadata& local_metadata, 280 const SyncFileMetadata& local_metadata,
284 const fileapi::FileSystemURL& url, 281 const fileapi::FileSystemURL& url,
285 const SyncStatusCallback& callback) { 282 const SyncStatusCallback& callback) {
286 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( 283 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer(
287 context_.get(), local_metadata, local_change, local_path, url); 284 context_.get(), local_metadata, local_change, local_path, url);
288 task_manager_->ScheduleSyncTask( 285 task_manager_->ScheduleSyncTask(
289 FROM_HERE, 286 FROM_HERE,
290 scoped_ptr<SyncTask>(syncer), 287 scoped_ptr<SyncTask>(syncer),
291 SyncTaskManager::PRIORITY_MED, 288 SyncTaskManager::PRIORITY_MED,
292 base::Bind(&SyncWorker::DidApplyLocalChange, 289 base::Bind(&SyncWorker::DidApplyLocalChange,
293 weak_ptr_factory_.GetWeakPtr(), 290 AsWeakPtr(),
294 syncer, callback)); 291 syncer, callback));
295 } 292 }
296 293
297 void SyncWorker::MaybeScheduleNextTask() { 294 void SyncWorker::MaybeScheduleNextTask() {
298 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) 295 if (GetCurrentState() == REMOTE_SERVICE_DISABLED)
299 return; 296 return;
300 297
301 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. 298 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated.
302 // TODO(tzik): Add an interface to get the number of dirty trackers to 299 // TODO(tzik): Add an interface to get the number of dirty trackers to
303 // MetadataDatabase. 300 // MetadataDatabase.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 env_override_(env_override), 387 env_override_(env_override),
391 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), 388 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE),
392 should_check_conflict_(true), 389 should_check_conflict_(true),
393 should_check_remote_change_(true), 390 should_check_remote_change_(true),
394 listing_remote_changes_(false), 391 listing_remote_changes_(false),
395 sync_enabled_(false), 392 sync_enabled_(false),
396 default_conflict_resolution_policy_( 393 default_conflict_resolution_policy_(
397 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), 394 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN),
398 network_available_(false), 395 network_available_(false),
399 extension_service_(extension_service), 396 extension_service_(extension_service),
400 context_(sync_engine_context.Pass()), 397 context_(sync_engine_context.Pass()) {}
401 weak_ptr_factory_(this) {}
402 398
403 void SyncWorker::DoDisableApp(const std::string& app_id, 399 void SyncWorker::DoDisableApp(const std::string& app_id,
404 const SyncStatusCallback& callback) { 400 const SyncStatusCallback& callback) {
405 if (GetMetadataDatabase()) { 401 if (GetMetadataDatabase()) {
406 GetMetadataDatabase()->DisableApp(app_id, callback); 402 GetMetadataDatabase()->DisableApp(app_id, callback);
407 } else { 403 } else {
408 context_->GetUITaskRunner()->PostTask( 404 context_->GetUITaskRunner()->PostTask(
409 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); 405 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK));
410 } 406 }
411 } 407 }
(...skipping 15 matching lines...) Expand all
427 // already initialized when it runs. 423 // already initialized when it runs.
428 SyncEngineInitializer* initializer = 424 SyncEngineInitializer* initializer =
429 new SyncEngineInitializer(context_.get(), 425 new SyncEngineInitializer(context_.get(),
430 base_dir_.Append(kDatabaseName), 426 base_dir_.Append(kDatabaseName),
431 env_override_); 427 env_override_);
432 task_manager_->ScheduleSyncTask( 428 task_manager_->ScheduleSyncTask(
433 FROM_HERE, 429 FROM_HERE,
434 scoped_ptr<SyncTask>(initializer), 430 scoped_ptr<SyncTask>(initializer),
435 SyncTaskManager::PRIORITY_HIGH, 431 SyncTaskManager::PRIORITY_HIGH,
436 base::Bind(&SyncWorker::DidInitialize, 432 base::Bind(&SyncWorker::DidInitialize,
437 weak_ptr_factory_.GetWeakPtr(), 433 AsWeakPtr(),
438 initializer)); 434 initializer));
439 } 435 }
440 436
441 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, 437 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer,
442 SyncStatusCode status) { 438 SyncStatusCode status) {
443 if (status != SYNC_STATUS_OK) { 439 if (status != SYNC_STATUS_OK) {
444 if (GetDriveService()->HasRefreshToken()) { 440 if (GetDriveService()->HasRefreshToken()) {
445 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, 441 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE,
446 "Could not initialize remote service"); 442 "Could not initialize remote service");
447 } else { 443 } else {
(...skipping 14 matching lines...) Expand all
462 void SyncWorker::UpdateRegisteredApp() { 458 void SyncWorker::UpdateRegisteredApp() {
463 MetadataDatabase* metadata_db = GetMetadataDatabase(); 459 MetadataDatabase* metadata_db = GetMetadataDatabase();
464 DCHECK(metadata_db); 460 DCHECK(metadata_db);
465 461
466 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); 462 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>);
467 metadata_db->GetRegisteredAppIDs(app_ids.get()); 463 metadata_db->GetRegisteredAppIDs(app_ids.get());
468 464
469 AppStatusMap* app_status = new AppStatusMap; 465 AppStatusMap* app_status = new AppStatusMap;
470 base::Closure callback = 466 base::Closure callback =
471 base::Bind(&SyncWorker::DidQueryAppStatus, 467 base::Bind(&SyncWorker::DidQueryAppStatus,
472 weak_ptr_factory_.GetWeakPtr(), 468 AsWeakPtr(),
473 base::Owned(app_status)); 469 base::Owned(app_status));
474 470
475 context_->GetUITaskRunner()->PostTask( 471 context_->GetUITaskRunner()->PostTask(
476 FROM_HERE, 472 FROM_HERE,
477 base::Bind(&QueryAppStatusOnUIThread, 473 base::Bind(&QueryAppStatusOnUIThread,
478 extension_service_, 474 extension_service_,
479 base::Owned(app_ids.release()), 475 base::Owned(app_ids.release()),
480 app_status, 476 app_status,
481 RelayCallbackToTaskRunner( 477 RelayCallbackToTaskRunner(
482 context_->GetWorkerTaskRunner(), 478 context_->GetWorkerTaskRunner(),
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 base::Bind(&EmptyStatusCallback)); 572 base::Bind(&EmptyStatusCallback));
577 } 573 }
578 574
579 if (syncer->needs_remote_change_listing() && 575 if (syncer->needs_remote_change_listing() &&
580 !listing_remote_changes_) { 576 !listing_remote_changes_) {
581 task_manager_->ScheduleSyncTask( 577 task_manager_->ScheduleSyncTask(
582 FROM_HERE, 578 FROM_HERE,
583 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), 579 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())),
584 SyncTaskManager::PRIORITY_HIGH, 580 SyncTaskManager::PRIORITY_HIGH,
585 base::Bind(&SyncWorker::DidFetchChanges, 581 base::Bind(&SyncWorker::DidFetchChanges,
586 weak_ptr_factory_.GetWeakPtr())); 582 AsWeakPtr()));
587 should_check_remote_change_ = false; 583 should_check_remote_change_ = false;
588 listing_remote_changes_ = true; 584 listing_remote_changes_ = true;
589 time_to_check_changes_ = 585 time_to_check_changes_ =
590 base::TimeTicks::Now() + 586 base::TimeTicks::Now() +
591 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); 587 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds);
592 } 588 }
593 589
594 if (status == SYNC_STATUS_OK) 590 if (status == SYNC_STATUS_OK)
595 should_check_conflict_ = true; 591 should_check_conflict_ = true;
596 592
(...skipping 12 matching lines...) Expand all
609 605
610 base::TimeTicks now = base::TimeTicks::Now(); 606 base::TimeTicks now = base::TimeTicks::Now();
611 if (!should_check_remote_change_ && now < time_to_check_changes_) { 607 if (!should_check_remote_change_ && now < time_to_check_changes_) {
612 if (!GetMetadataDatabase()->HasDirtyTracker() && 608 if (!GetMetadataDatabase()->HasDirtyTracker() &&
613 should_check_conflict_) { 609 should_check_conflict_) {
614 should_check_conflict_ = false; 610 should_check_conflict_ = false;
615 task_manager_->ScheduleSyncTaskIfIdle( 611 task_manager_->ScheduleSyncTaskIfIdle(
616 FROM_HERE, 612 FROM_HERE,
617 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())), 613 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())),
618 base::Bind(&SyncWorker::DidResolveConflict, 614 base::Bind(&SyncWorker::DidResolveConflict,
619 weak_ptr_factory_.GetWeakPtr())); 615 AsWeakPtr()));
620 } 616 }
621 return; 617 return;
622 } 618 }
623 619
624 if (task_manager_->ScheduleSyncTaskIfIdle( 620 if (task_manager_->ScheduleSyncTaskIfIdle(
625 FROM_HERE, 621 FROM_HERE,
626 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), 622 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())),
627 base::Bind(&SyncWorker::DidFetchChanges, 623 base::Bind(&SyncWorker::DidFetchChanges,
628 weak_ptr_factory_.GetWeakPtr()))) { 624 AsWeakPtr()))) {
629 should_check_remote_change_ = false; 625 should_check_remote_change_ = false;
630 listing_remote_changes_ = true; 626 listing_remote_changes_ = true;
631 time_to_check_changes_ = 627 time_to_check_changes_ =
632 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); 628 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds);
633 } 629 }
634 } 630 }
635 631
636 void SyncWorker::DidResolveConflict(SyncStatusCode status) { 632 void SyncWorker::DidResolveConflict(SyncStatusCode status) {
637 if (status == SYNC_STATUS_OK) 633 if (status == SYNC_STATUS_OK)
638 should_check_conflict_ = true; 634 should_check_conflict_ = true;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 "Service state changed: %d->%d: %s", 701 "Service state changed: %d->%d: %s",
706 old_state, GetCurrentState(), description.c_str()); 702 old_state, GetCurrentState(), description.c_str());
707 703
708 FOR_EACH_OBSERVER( 704 FOR_EACH_OBSERVER(
709 Observer, observers_, 705 Observer, observers_,
710 UpdateServiceState(GetCurrentState(), description)); 706 UpdateServiceState(GetCurrentState(), description));
711 } 707 }
712 708
713 } // namespace drive_backend 709 } // namespace drive_backend
714 } // namespace sync_file_system 710 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698