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

Unified Diff: chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc

Issue 204133004: [SyncFS] Make SyncEngineInitializer run as a background task (3/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc
index 5d3d9956eb322495bf3222708e4353b542cd662c..89a05092e2f12057e7b68d18cbf7048601de4407 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc
@@ -13,6 +13,8 @@
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
+#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
+#include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h"
#include "chrome/browser/sync_file_system/logger.h"
#include "google_apis/drive/drive_api_parser.h"
#include "google_apis/drive/gdata_wapi_parser.h"
@@ -25,10 +27,6 @@ namespace {
////////////////////////////////////////////////////////////////////////////////
// Functions below are for wrapping the access to legacy GData WAPI classes.
-bool IsDeleted(const google_apis::ResourceEntry& entry) {
- return entry.deleted();
-}
-
bool HasNoParents(const google_apis::ResourceEntry& entry) {
return !entry.GetLinkByType(google_apis::Link::LINK_PARENT);
}
@@ -52,24 +50,10 @@ bool LessOnCreationTime(const google_apis::ResourceEntry& left,
return left.published_time() < right.published_time();
}
-// Posts a request to continue listing. Returns false if the list doesn't need
-// listing anymore.
-bool GetRemainingFileList(
- google_apis::CancelCallback* cancel_callback,
- drive::DriveServiceInterface* api_service,
- const google_apis::ResourceList& resource_list,
- const google_apis::GetResourceListCallback& callback) {
- GURL next_url;
- if (!resource_list.GetNextFeedURL(&next_url))
- return false;
-
- *cancel_callback = api_service->GetRemainingFileList(next_url, callback);
- return true;
-}
-
-std::string GetID(const google_apis::ResourceEntry& entry) {
- return entry.resource_id();
-}
+typedef base::Callback<void(scoped_ptr<SyncTaskToken> token,
+ google_apis::GDataErrorCode error,
+ scoped_ptr<google_apis::ResourceList> resources)>
+ TokenAndResourceListCallback;
ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources(
const ScopedVector<google_apis::ResourceEntry>& entries) {
@@ -113,21 +97,21 @@ SyncEngineInitializer::~SyncEngineInitializer() {
cancel_callback_.Run();
}
-void SyncEngineInitializer::RunSequential(const SyncStatusCallback& callback) {
+void SyncEngineInitializer::Run(scoped_ptr<SyncTaskToken> token) {
util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start.");
// The metadata seems to have been already initialized. Just return with OK.
if (sync_context_ && sync_context_->GetMetadataDatabase()) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Already initialized.");
- callback.Run(SYNC_STATUS_OK);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
return;
}
MetadataDatabase::Create(
task_runner_.get(), database_path_, env_override_,
base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase,
- weak_ptr_factory_.GetWeakPtr(), callback));
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
}
scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() {
@@ -135,13 +119,13 @@ scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() {
}
void SyncEngineInitializer::DidCreateMetadataDatabase(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
SyncStatusCode status,
scoped_ptr<MetadataDatabase> instance) {
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to initialize MetadataDatabase.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
@@ -150,23 +134,23 @@ void SyncEngineInitializer::DidCreateMetadataDatabase(
if (metadata_database_->HasSyncRoot()) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Found local cache of sync-root.");
- callback.Run(SYNC_STATUS_OK);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
return;
}
- GetAboutResource(callback);
+ GetAboutResource(token.Pass());
}
void SyncEngineInitializer::GetAboutResource(
- const SyncStatusCallback& callback) {
+ scoped_ptr<SyncTaskToken> token) {
set_used_network(true);
drive_service_->GetAboutResource(
base::Bind(&SyncEngineInitializer::DidGetAboutResource,
- weak_ptr_factory_.GetWeakPtr(), callback));
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
}
void SyncEngineInitializer::DidGetAboutResource(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::AboutResource> about_resource) {
cancel_callback_.Reset();
@@ -175,7 +159,7 @@ void SyncEngineInitializer::DidGetAboutResource(
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to get AboutResource.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
@@ -184,14 +168,14 @@ void SyncEngineInitializer::DidGetAboutResource(
largest_change_id_ = about_resource->largest_change_id();
DCHECK(!root_folder_id_.empty());
- FindSyncRoot(callback);
+ FindSyncRoot(token.Pass());
}
-void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) {
+void SyncEngineInitializer::FindSyncRoot(scoped_ptr<SyncTaskToken> token) {
if (find_sync_root_retry_count_++ >= kMaxRetry) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Reached max retry count.");
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
@@ -201,11 +185,11 @@ void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) {
std::string(), // parent_folder_id
base::Bind(&SyncEngineInitializer::DidFindSyncRoot,
weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Passed(&token)));
}
void SyncEngineInitializer::DidFindSyncRoot(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::ResourceList> resource_list) {
cancel_callback_.Reset();
@@ -214,7 +198,7 @@ void SyncEngineInitializer::DidFindSyncRoot(
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to find sync root.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
@@ -222,7 +206,7 @@ void SyncEngineInitializer::DidFindSyncRoot(
NOTREACHED();
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Got invalid resource list.");
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
@@ -234,7 +218,7 @@ void SyncEngineInitializer::DidFindSyncRoot(
google_apis::ResourceEntry* entry = *itr;
// Ignore deleted folder.
- if (IsDeleted(*entry))
+ if (entry->deleted())
continue;
// Pick an orphaned folder or a direct child of the root folder and
@@ -251,28 +235,30 @@ void SyncEngineInitializer::DidFindSyncRoot(
set_used_network(true);
// If there are more results, retrieve them.
- if (GetRemainingFileList(
- &cancel_callback_,
- drive_service_, *resource_list,
- base::Bind(&SyncEngineInitializer::DidFindSyncRoot,
- weak_ptr_factory_.GetWeakPtr(),
- callback)))
+ GURL next_url;
+ if (resource_list->GetNextFeedURL(&next_url)) {
+ cancel_callback_ = drive_service_->GetRemainingFileList(
+ next_url,
+ base::Bind(&SyncEngineInitializer::DidFindSyncRoot,
+ weak_ptr_factory_.GetWeakPtr(),
+ base::Passed(&token)));
return;
+ }
if (!sync_root_folder_) {
- CreateSyncRoot(callback);
+ CreateSyncRoot(token.Pass());
return;
}
if (!HasNoParents(*sync_root_folder_)) {
- DetachSyncRoot(callback);
+ DetachSyncRoot(token.Pass());
return;
}
- ListAppRootFolders(callback);
+ ListAppRootFolders(token.Pass());
}
-void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) {
+void SyncEngineInitializer::CreateSyncRoot(scoped_ptr<SyncTaskToken> token) {
DCHECK(!sync_root_folder_);
set_used_network(true);
cancel_callback_ = drive_service_->AddNewDirectory(
@@ -280,11 +266,11 @@ void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) {
drive::DriveServiceInterface::AddNewDirectoryOptions(),
base::Bind(&SyncEngineInitializer::DidCreateSyncRoot,
weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Passed(&token)));
}
void SyncEngineInitializer::DidCreateSyncRoot(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::ResourceEntry> entry) {
DCHECK(!sync_root_folder_);
@@ -294,25 +280,25 @@ void SyncEngineInitializer::DidCreateSyncRoot(
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to create sync root.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
- FindSyncRoot(callback);
+ FindSyncRoot(token.Pass());
}
-void SyncEngineInitializer::DetachSyncRoot(const SyncStatusCallback& callback) {
+void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) {
DCHECK(sync_root_folder_);
set_used_network(true);
cancel_callback_ = drive_service_->RemoveResourceFromDirectory(
- root_folder_id_, GetID(*sync_root_folder_),
+ root_folder_id_, sync_root_folder_->resource_id(),
base::Bind(&SyncEngineInitializer::DidDetachSyncRoot,
weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Passed(&token)));
}
void SyncEngineInitializer::DidDetachSyncRoot(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error) {
cancel_callback_.Reset();
@@ -320,26 +306,26 @@ void SyncEngineInitializer::DidDetachSyncRoot(
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to detach sync root.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
- ListAppRootFolders(callback);
+ ListAppRootFolders(token.Pass());
}
void SyncEngineInitializer::ListAppRootFolders(
- const SyncStatusCallback& callback) {
+ scoped_ptr<SyncTaskToken> token) {
DCHECK(sync_root_folder_);
set_used_network(true);
cancel_callback_ = drive_service_->GetResourceListInDirectory(
- GetID(*sync_root_folder_),
+ sync_root_folder_->resource_id(),
base::Bind(&SyncEngineInitializer::DidListAppRootFolders,
weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Passed(&token)));
}
void SyncEngineInitializer::DidListAppRootFolders(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::ResourceList> resource_list) {
cancel_callback_.Reset();
@@ -348,7 +334,7 @@ void SyncEngineInitializer::DidListAppRootFolders(
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to get initial app-root folders.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
@@ -356,7 +342,7 @@ void SyncEngineInitializer::DidListAppRootFolders(
NOTREACHED();
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Got invalid initial app-root list.");
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
@@ -367,19 +353,20 @@ void SyncEngineInitializer::DidListAppRootFolders(
new_entries->weak_clear();
set_used_network(true);
- if (GetRemainingFileList(
- &cancel_callback_,
- drive_service_,
- *resource_list,
- base::Bind(&SyncEngineInitializer::DidListAppRootFolders,
- weak_ptr_factory_.GetWeakPtr(), callback)))
+ GURL next_url;
+ if (resource_list->GetNextFeedURL(&next_url)) {
+ cancel_callback_ = drive_service_->GetRemainingFileList(
+ next_url,
+ base::Bind(&SyncEngineInitializer::DidListAppRootFolders,
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
return;
+ }
- PopulateDatabase(callback);
+ PopulateDatabase(token.Pass());
}
void SyncEngineInitializer::PopulateDatabase(
- const SyncStatusCallback& callback) {
+ scoped_ptr<SyncTaskToken> token) {
DCHECK(sync_root_folder_);
metadata_database_->PopulateInitialData(
largest_change_id_,
@@ -387,24 +374,23 @@ void SyncEngineInitializer::PopulateDatabase(
*sync_root_folder_),
ConvertResourceEntriesToFileResources(app_root_folders_),
base::Bind(&SyncEngineInitializer::DidPopulateDatabase,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
}
void SyncEngineInitializer::DidPopulateDatabase(
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
SyncStatusCode status) {
if (status != SYNC_STATUS_OK) {
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Failed to populate initial data"
" to MetadataDatabase.");
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
util::Log(logging::LOG_VERBOSE, FROM_HERE,
"[Initialize] Completed successfully.");
- callback.Run(SYNC_STATUS_OK);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
}
} // namespace drive_backend

Powered by Google App Engine
This is Rietveld 408576698