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

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

Issue 558603002: [SyncFS] Make MetadataDatabase operations synchronous (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@01_create
Patch Set: +TODO Created 6 years, 3 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/metadata_database.cc
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
index 1524cbdfbcc49d969d68147f8163b80e4b5aa61f..d635f1701108436eab2c0015ff6c0486f69701e8 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
@@ -8,7 +8,6 @@
#include <stack>
#include "base/bind.h"
-#include "base/callback.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
@@ -48,8 +47,6 @@ namespace {
// Command line flag to disable on-disk indexing.
const char kDisableMetadataDatabaseOnDisk[] = "disable-syncfs-on-disk-indexing";
-void EmptyStatusCallback(SyncStatusCode status) {}
-
std::string FileKindToString(FileKind file_kind) {
switch (file_kind) {
case FILE_KIND_UNSUPPORTED:
@@ -520,10 +517,10 @@ void RemoveFileTracker(int64 tracker_id,
} // namespace
// static
-void MetadataDatabase::Create(
+scoped_ptr<MetadataDatabase> MetadataDatabase::Create(
const base::FilePath& database_path,
leveldb::Env* env_override,
- const CreateCallback& callback) {
+ SyncStatusCode* status_out) {
bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch(
kDisableMetadataDatabaseOnDisk);
scoped_ptr<MetadataDatabase> metadata_database(
@@ -547,7 +544,8 @@ void MetadataDatabase::Create(
if (status != SYNC_STATUS_OK)
metadata_database.reset();
- callback.Run(status, metadata_database.Pass());
+ *status_out = status;
+ return metadata_database.Pass();
}
// static
@@ -602,11 +600,10 @@ bool MetadataDatabase::HasSyncRoot() const {
return index_->GetSyncRootTrackerID() != kInvalidTrackerID;
}
-void MetadataDatabase::PopulateInitialData(
+SyncStatusCode MetadataDatabase::PopulateInitialData(
int64 largest_change_id,
const google_apis::FileResource& sync_root_folder,
- const ScopedVector<google_apis::FileResource>& app_root_folders,
- const SyncStatusCallback& callback) {
+ const ScopedVector<google_apis::FileResource>& app_root_folders) {
index_->SetLargestChangeID(largest_change_id);
UpdateLargestKnownChangeID(largest_change_id);
@@ -614,7 +611,7 @@ void MetadataDatabase::PopulateInitialData(
for (size_t i = 0; i < app_root_folders.size(); ++i)
AttachInitialAppRoot(*app_root_folders[i]);
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const {
@@ -628,42 +625,36 @@ bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const {
return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT;
}
-void MetadataDatabase::RegisterApp(const std::string& app_id,
- const std::string& folder_id,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::RegisterApp(const std::string& app_id,
+ const std::string& folder_id) {
if (index_->GetAppRootTracker(app_id)) {
// The app-root is already registered.
- callback.Run(SYNC_STATUS_OK);
- return;
+ return SYNC_STATUS_OK;
}
TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id);
if (trackers.empty()) {
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
if (trackers.has_active()) {
// The folder is tracked by another tracker.
util::Log(logging::LOG_WARNING, FROM_HERE,
"Failed to register App for %s", app_id.c_str());
- callback.Run(SYNC_STATUS_HAS_CONFLICT);
- return;
+ return SYNC_STATUS_HAS_CONFLICT;
}
int64 sync_root_tracker_id = index_->GetSyncRootTrackerID();
if (!sync_root_tracker_id) {
util::Log(logging::LOG_WARNING, FROM_HERE,
"Sync-root needs to be set up before registering app-root");
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
scoped_ptr<FileTracker> tracker(new FileTracker);
if (!FilterFileTrackersByParent(index_.get(), trackers,
sync_root_tracker_id, tracker.get())) {
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
tracker->set_app_id(app_id);
@@ -673,21 +664,18 @@ void MetadataDatabase::RegisterApp(const std::string& app_id,
tracker->set_dirty(true);
index_->StoreFileTracker(tracker.Pass());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::DisableApp(const std::string& app_id,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) {
int64 tracker_id = index_->GetAppRootTracker(app_id);
scoped_ptr<FileTracker> tracker(new FileTracker);
if (!index_->GetFileTracker(tracker_id, tracker.get())) {
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) {
- callback.Run(SYNC_STATUS_OK);
- return;
+ return SYNC_STATUS_OK;
}
DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind());
@@ -698,21 +686,18 @@ void MetadataDatabase::DisableApp(const std::string& app_id,
tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT);
index_->StoreFileTracker(tracker.Pass());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::EnableApp(const std::string& app_id,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) {
int64 tracker_id = index_->GetAppRootTracker(app_id);
scoped_ptr<FileTracker> tracker(new FileTracker);
if (!index_->GetFileTracker(tracker_id, tracker.get())) {
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) {
- callback.Run(SYNC_STATUS_OK);
- return;
+ return SYNC_STATUS_OK;
}
DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind());
@@ -722,17 +707,15 @@ void MetadataDatabase::EnableApp(const std::string& app_id,
index_->StoreFileTracker(tracker.Pass());
MarkTrackersDirtyRecursively(tracker_id, index_.get());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UnregisterApp(const std::string& app_id,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) {
int64 tracker_id = index_->GetAppRootTracker(app_id);
scoped_ptr<FileTracker> tracker(new FileTracker);
if (!index_->GetFileTracker(tracker_id, tracker.get()) ||
tracker->tracker_kind() == TRACKER_KIND_REGULAR) {
- callback.Run(SYNC_STATUS_OK);
- return;
+ return SYNC_STATUS_OK;
}
RemoveAllDescendantTrackers(tracker_id, index_.get());
@@ -743,7 +726,7 @@ void MetadataDatabase::UnregisterApp(const std::string& app_id,
tracker->set_dirty(true);
index_->StoreFileTracker(tracker.Pass());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
bool MetadataDatabase::FindAppRootTracker(const std::string& app_id,
@@ -880,10 +863,9 @@ bool MetadataDatabase::FindNearestActiveAncestor(
return true;
}
-void MetadataDatabase::UpdateByChangeList(
+SyncStatusCode MetadataDatabase::UpdateByChangeList(
int64 largest_change_id,
- ScopedVector<google_apis::ChangeResource> changes,
- const SyncStatusCallback& callback) {
+ ScopedVector<google_apis::ChangeResource> changes) {
DCHECK_LE(index_->GetLargestChangeID(), largest_change_id);
for (size_t i = 0; i < changes.size(); ++i) {
@@ -899,23 +881,21 @@ void MetadataDatabase::UpdateByChangeList(
UpdateLargestKnownChangeID(largest_change_id);
index_->SetLargestChangeID(largest_change_id);
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UpdateByFileResource(
- const google_apis::FileResource& resource,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UpdateByFileResource(
+ const google_apis::FileResource& resource) {
scoped_ptr<FileMetadata> metadata(
CreateFileMetadataFromFileResource(
GetLargestKnownChangeID(), resource));
UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
UPDATE_TRACKER_FOR_UNSYNCED_FILE);
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UpdateByFileResourceList(
- ScopedVector<google_apis::FileResource> resources,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UpdateByFileResourceList(
+ ScopedVector<google_apis::FileResource> resources) {
for (size_t i = 0; i < resources.size(); ++i) {
scoped_ptr<FileMetadata> metadata(
CreateFileMetadataFromFileResource(
@@ -923,22 +903,20 @@ void MetadataDatabase::UpdateByFileResourceList(
UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
UPDATE_TRACKER_FOR_UNSYNCED_FILE);
}
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UpdateByDeletedRemoteFile(
- const std::string& file_id,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile(
+ const std::string& file_id) {
scoped_ptr<FileMetadata> metadata(
CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id));
UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
UPDATE_TRACKER_FOR_UNSYNCED_FILE);
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UpdateByDeletedRemoteFileList(
- const FileIDList& file_ids,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList(
+ const FileIDList& file_ids) {
for (FileIDList::const_iterator itr = file_ids.begin();
itr != file_ids.end(); ++itr) {
scoped_ptr<FileMetadata> metadata(
@@ -946,13 +924,12 @@ void MetadataDatabase::UpdateByDeletedRemoteFileList(
UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
UPDATE_TRACKER_FOR_UNSYNCED_FILE);
}
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::ReplaceActiveTrackerWithNewResource(
+SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource(
int64 parent_tracker_id,
- const google_apis::FileResource& resource,
- const SyncStatusCallback& callback) {
+ const google_apis::FileResource& resource) {
DCHECK(!index_->GetFileMetadata(resource.file_id(), NULL));
DCHECK(index_->GetFileTracker(parent_tracker_id, NULL));
@@ -971,8 +948,7 @@ void MetadataDatabase::ReplaceActiveTrackerWithNewResource(
if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers,
resource.file_id(), &to_be_activated)) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
- return;
+ return SYNC_STATUS_FAILED;
}
int64 tracker_id = to_be_activated.tracker_id();
@@ -984,27 +960,24 @@ void MetadataDatabase::ReplaceActiveTrackerWithNewResource(
}
ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::PopulateFolderByChildList(
+SyncStatusCode MetadataDatabase::PopulateFolderByChildList(
const std::string& folder_id,
- const FileIDList& child_file_ids,
- const SyncStatusCallback& callback) {
+ const FileIDList& child_file_ids) {
TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id);
if (!trackers.has_active()) {
// It's OK that there is no folder to populate its children.
// Inactive folders should ignore their contents updates.
- callback.Run(SYNC_STATUS_OK);
- return;
+ return SYNC_STATUS_OK;
}
scoped_ptr<FileTracker> folder_tracker(new FileTracker);
if (!index_->GetFileTracker(trackers.active_tracker(),
folder_tracker.get())) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
- return;
+ return SYNC_STATUS_FAILED;
}
base::hash_set<std::string> children(child_file_ids.begin(),
@@ -1029,16 +1002,15 @@ void MetadataDatabase::PopulateFolderByChildList(
folder_tracker->set_dirty(false);
index_->StoreFileTracker(folder_tracker.Pass());
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
-void MetadataDatabase::UpdateTracker(int64 tracker_id,
- const FileDetails& updated_details,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::UpdateTracker(
+ int64 tracker_id,
+ const FileDetails& updated_details) {
FileTracker tracker;
if (!index_->GetFileTracker(tracker_id, &tracker)) {
- callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
- return;
+ return SYNC_DATABASE_ERROR_NOT_FOUND;
}
// Check if the tracker is to be deleted.
@@ -1052,8 +1024,7 @@ void MetadataDatabase::UpdateTracker(int64 tracker_id,
MARK_SAME_FILE_ID_TRACKERS_DIRTY |
MARK_SAME_PATH_TRACKERS_DIRTY,
index_.get());
- WriteToDatabase(callback);
- return;
+ return WriteToDatabase();
}
}
@@ -1074,8 +1045,7 @@ void MetadataDatabase::UpdateTracker(int64 tracker_id,
RemoveFileTracker(tracker.tracker_id(),
MARK_SAME_PATH_TRACKERS_DIRTY,
index_.get());
- WriteToDatabase(callback);
- return;
+ return WriteToDatabase();
}
if (tracker.has_synced_details()) {
@@ -1085,8 +1055,7 @@ void MetadataDatabase::UpdateTracker(int64 tracker_id,
RemoveFileTracker(tracker.tracker_id(),
MARK_SAME_FILE_ID_TRACKERS_DIRTY,
index_.get());
- WriteToDatabase(callback);
- return;
+ return WriteToDatabase();
}
} else {
// Check if any other tracker exists has the same parent, title and
@@ -1102,8 +1071,7 @@ void MetadataDatabase::UpdateTracker(int64 tracker_id,
RemoveFileTracker(tracker.tracker_id(),
MARK_NOTHING_DIRTY,
index_.get());
- WriteToDatabase(callback);
- return;
+ return WriteToDatabase();
}
}
}
@@ -1129,17 +1097,17 @@ void MetadataDatabase::UpdateTracker(int64 tracker_id,
if (should_promote)
index_->PromoteDemotedDirtyTracker(tracker_id);
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker(
int64 parent_tracker_id,
const std::string& file_id,
- const SyncStatusCallback& callback) {
+ SyncStatusCode* status_out) {
FileMetadata metadata;
if (!index_->GetFileMetadata(file_id, &metadata)) {
NOTREACHED();
- callback.Run(SYNC_STATUS_FAILED);
+ *status_out = SYNC_STATUS_FAILED;
return ACTIVATION_PENDING;
}
std::string title = metadata.details().title();
@@ -1193,24 +1161,24 @@ MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker(
index_->StoreFileTracker(tracker_to_be_activated.Pass());
- WriteToDatabase(callback);
+ *status_out = WriteToDatabase();
return ACTIVATION_PENDING;
}
void MetadataDatabase::DemoteTracker(int64 tracker_id) {
index_->DemoteDirtyTracker(tracker_id);
- WriteToDatabase(base::Bind(&EmptyStatusCallback));
+ WriteToDatabase();
}
bool MetadataDatabase::PromoteDemotedTrackers() {
bool promoted = index_->PromoteDemotedDirtyTrackers();
- WriteToDatabase(base::Bind(&EmptyStatusCallback));
+ WriteToDatabase();
return promoted;
}
void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) {
index_->PromoteDemotedDirtyTracker(tracker_id);
- WriteToDatabase(base::Bind(&EmptyStatusCallback));
+ WriteToDatabase();
}
bool MetadataDatabase::GetDirtyTracker(
@@ -1291,9 +1259,8 @@ void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) {
*app_ids = index_->GetRegisteredAppIDs();
}
-void MetadataDatabase::SweepDirtyTrackers(
- const std::vector<std::string>& file_ids,
- const SyncStatusCallback& callback) {
+SyncStatusCode MetadataDatabase::SweepDirtyTrackers(
+ const std::vector<std::string>& file_ids) {
std::set<int64> tracker_ids;
for (size_t i = 0; i < file_ids.size(); ++i) {
TrackerIDSet trackers_for_file_id =
@@ -1313,7 +1280,7 @@ void MetadataDatabase::SweepDirtyTrackers(
index_->StoreFileTracker(tracker.Pass());
}
- WriteToDatabase(callback);
+ return WriteToDatabase();
}
MetadataDatabase::MetadataDatabase(
@@ -1586,9 +1553,9 @@ void MetadataDatabase::UpdateByFileMetadata(
}
}
-void MetadataDatabase::WriteToDatabase(const SyncStatusCallback& callback) {
- leveldb::Status status = db_->Commit();
- callback.Run(LevelDBStatusToSyncStatusCode(status));
+
+SyncStatusCode MetadataDatabase::WriteToDatabase() {
+ return LevelDBStatusToSyncStatusCode(db_->Commit());
}
scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles(

Powered by Google App Engine
This is Rietveld 408576698