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

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

Issue 302003013: [SyncFS] Run V2 backend tasks as SyncTask (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc
diff --git a/chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc b/chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc
index 449e7a920d668cf06800fd978fcbb193a211dd9d..340c173658d400b36ce6ce74b479eec7f48a9899 100644
--- a/chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc
+++ b/chrome/browser/sync_file_system/drive_backend/conflict_resolver.cc
@@ -8,6 +8,7 @@
#include "base/format_macros.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/strings/stringprintf.h"
#include "chrome/browser/drive/drive_api_util.h"
#include "chrome/browser/drive/drive_service_interface.h"
#include "chrome/browser/drive/drive_uploader.h"
@@ -15,6 +16,8 @@
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.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"
@@ -27,17 +30,28 @@ ConflictResolver::ConflictResolver(SyncEngineContext* sync_context)
ConflictResolver::~ConflictResolver() {}
-void ConflictResolver::RunExclusive(const SyncStatusCallback& callback) {
+void ConflictResolver::RunPreflight(scoped_ptr<SyncTaskToken> token) {
+ token->InitializeTaskLog("Conflict Resolution");
+
+ scoped_ptr<BlockingFactor> blocking_factor(new BlockingFactor);
+ blocking_factor->exclusive = true;
+ SyncTaskManager::UpdateBlockingFactor(
+ token.Pass(), blocking_factor.Pass(),
+ base::Bind(&ConflictResolver::RunExclusive,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void ConflictResolver::RunExclusive(scoped_ptr<SyncTaskToken> token) {
if (!IsContextReady()) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
// Conflict resolution should be invoked on clean tree.
if (metadata_database()->HasDirtyTracker()) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
@@ -47,14 +61,13 @@ void ConflictResolver::RunExclusive(const SyncStatusCallback& callback) {
DCHECK_LT(1u, trackers.size());
if (!trackers.has_active()) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
- util::Log(logging::LOG_VERBOSE, FROM_HERE,
- "[ConflictResolver] Detected multi-parent trackers "
- "(active tracker_id=%" PRId64 ")",
- trackers.active_tracker());
+ token->RecordLog(base::StringPrintf(
+ "Detected multi-parent trackers (active tracker_id=%" PRId64 ")",
+ trackers.active_tracker()));
DCHECK(trackers.has_active());
for (TrackerIDSet::const_iterator itr = trackers.begin();
@@ -73,12 +86,12 @@ void ConflictResolver::RunExclusive(const SyncStatusCallback& callback) {
tracker.parent_tracker_id(), &parent_tracker);
if (!should_success) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
parents_to_remove_.push_back(parent_tracker.file_id());
}
- DetachFromNonPrimaryParents(callback);
+ DetachFromNonPrimaryParents(token.Pass());
return;
}
@@ -101,50 +114,52 @@ void ConflictResolver::RunExclusive(const SyncStatusCallback& callback) {
}
}
- util::Log(logging::LOG_VERBOSE, FROM_HERE,
- "[ConflictResolver] Detected %" PRIuS " conflicting trackers "
- "(primary tracker_id=%" PRId64 ")",
- non_primary_file_ids_.size(), primary_tracker_id);
+ token->RecordLog(base::StringPrintf(
+ "Detected %" PRIuS " conflicting trackers "
+ "(primary tracker_id=%" PRId64 ")",
+ non_primary_file_ids_.size(), primary_tracker_id));
- RemoveNonPrimaryFiles(callback);
+ RemoveNonPrimaryFiles(token.Pass());
return;
}
- callback.Run(SYNC_STATUS_NO_CONFLICT);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_NO_CONFLICT);
}
void ConflictResolver::DetachFromNonPrimaryParents(
- const SyncStatusCallback& callback) {
+ scoped_ptr<SyncTaskToken> token) {
DCHECK(!parents_to_remove_.empty());
// TODO(tzik): Check if ETag match is available for
// RemoteResourceFromDirectory.
std::string parent_folder_id = parents_to_remove_.back();
parents_to_remove_.pop_back();
+
+ token->RecordLog(base::StringPrintf(
+ "Detach %s from %s",
+ target_file_id_.c_str(), parent_folder_id.c_str()));
+
drive_service()->RemoveResourceFromDirectory(
parent_folder_id, target_file_id_,
base::Bind(&ConflictResolver::DidDetachFromParent,
weak_ptr_factory_.GetWeakPtr(),
- callback));
- util::Log(logging::LOG_VERBOSE, FROM_HERE,
- "[ConflictResolver] Detach %s from %s",
- target_file_id_.c_str(), parent_folder_id.c_str());
+ base::Passed(&token)));
}
-void ConflictResolver::DidDetachFromParent(const SyncStatusCallback& callback,
+void ConflictResolver::DidDetachFromParent(scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error) {
SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error);
if (status != SYNC_STATUS_OK) {
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
if (!parents_to_remove_.empty()) {
- DetachFromNonPrimaryParents(callback);
+ DetachFromNonPrimaryParents(token.Pass());
return;
}
- callback.Run(SYNC_STATUS_OK);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
}
std::string ConflictResolver::PickPrimaryFile(const TrackerIDSet& trackers) {
@@ -212,8 +227,7 @@ std::string ConflictResolver::PickPrimaryFile(const TrackerIDSet& trackers) {
return std::string();
}
-void ConflictResolver::RemoveNonPrimaryFiles(
- const SyncStatusCallback& callback) {
+void ConflictResolver::RemoveNonPrimaryFiles(scoped_ptr<SyncTaskToken> token) {
DCHECK(!non_primary_file_ids_.empty());
std::string file_id = non_primary_file_ids_.back().first;
@@ -222,8 +236,8 @@ void ConflictResolver::RemoveNonPrimaryFiles(
DCHECK_NE(target_file_id_, file_id);
- util::Log(logging::LOG_VERBOSE, FROM_HERE,
- "[ConflictResolver] Remove non-primary file %s", file_id.c_str());
+ token->RecordLog(base::StringPrintf(
+ "Remove non-primary file %s", file_id.c_str()));
// TODO(tzik): Check if the file is a folder, and merge its contents into
// the folder identified by |target_file_id_|.
@@ -231,32 +245,32 @@ void ConflictResolver::RemoveNonPrimaryFiles(
file_id, etag,
base::Bind(&ConflictResolver::DidRemoveFile,
weak_ptr_factory_.GetWeakPtr(),
- callback, file_id));
+ base::Passed(&token), file_id));
}
-void ConflictResolver::DidRemoveFile(const SyncStatusCallback& callback,
+void ConflictResolver::DidRemoveFile(scoped_ptr<SyncTaskToken> token,
const std::string& file_id,
google_apis::GDataErrorCode error) {
if (error == google_apis::HTTP_PRECONDITION ||
error == google_apis::HTTP_CONFLICT) {
- UpdateFileMetadata(file_id, callback);
+ UpdateFileMetadata(file_id, token.Pass());
return;
}
SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error);
if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) {
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
deleted_file_ids_.push_back(file_id);
if (!non_primary_file_ids_.empty()) {
- RemoveNonPrimaryFiles(callback);
+ RemoveNonPrimaryFiles(token.Pass());
return;
}
metadata_database()->UpdateByDeletedRemoteFileList(
- deleted_file_ids_, callback);
+ deleted_file_ids_, SyncTaskToken::WrapToCallback(token.Pass()));
}
bool ConflictResolver::IsContextReady() {
@@ -266,36 +280,39 @@ bool ConflictResolver::IsContextReady() {
void ConflictResolver::UpdateFileMetadata(
const std::string& file_id,
- const SyncStatusCallback& callback) {
+ scoped_ptr<SyncTaskToken> token) {
drive_service()->GetFileResource(
file_id,
base::Bind(&ConflictResolver::DidGetRemoteMetadata,
- weak_ptr_factory_.GetWeakPtr(), file_id, callback));
+ weak_ptr_factory_.GetWeakPtr(), file_id,
+ base::Passed(&token)));
}
void ConflictResolver::DidGetRemoteMetadata(
const std::string& file_id,
- const SyncStatusCallback& callback,
+ scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::FileResource> entry) {
SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error);
if (status != SYNC_STATUS_OK && error != google_apis::HTTP_NOT_FOUND) {
- callback.Run(status);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
if (error != google_apis::HTTP_NOT_FOUND) {
- metadata_database()->UpdateByDeletedRemoteFile(file_id, callback);
+ metadata_database()->UpdateByDeletedRemoteFile(
+ file_id, SyncTaskToken::WrapToCallback(token.Pass()));
return;
}
if (!entry) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED);
return;
}
- metadata_database()->UpdateByFileResource(*entry, callback);
+ metadata_database()->UpdateByFileResource(
+ *entry, SyncTaskToken::WrapToCallback(token.Pass()));
}
drive::DriveServiceInterface* ConflictResolver::drive_service() {

Powered by Google App Engine
This is Rietveld 408576698