Commit 3dbd7595 authored by tzik@chromium.org's avatar tzik@chromium.org

[SyncFS] Clear dirty flag on changelist application phase

Clear trivially solvable dirty flag in earlier phase than before, so that consecutive local changes doesn't conflict to each other.

BUG=344769
TEST=unit_tests --gtest_filter=DriveBackendSyncTest.*

Review URL: https://codereview.chromium.org/443793003

Cr-Commit-Position: refs/heads/master@{#289271}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289271 0039d316-1c4b-4281-b951-d872f2087c98
parent bc8c161f
...@@ -113,9 +113,27 @@ void ListChangesTask::CheckInChangeList(int64 largest_change_id, ...@@ -113,9 +113,27 @@ void ListChangesTask::CheckInChangeList(int64 largest_change_id,
"Got %" PRIuS " changes, updating MetadataDatabase.", "Got %" PRIuS " changes, updating MetadataDatabase.",
change_list_.size())); change_list_.size()));
DCHECK(file_ids_.empty());
file_ids_.reserve(change_list_.size());
for (size_t i = 0; i < change_list_.size(); ++i)
file_ids_.push_back(change_list_[i]->file_id());
metadata_database()->UpdateByChangeList( metadata_database()->UpdateByChangeList(
largest_change_id, largest_change_id,
change_list_.Pass(), change_list_.Pass(),
base::Bind(&ListChangesTask::DidCheckInChangeList,
weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
}
void ListChangesTask::DidCheckInChangeList(scoped_ptr<SyncTaskToken> token,
SyncStatusCode status) {
if (status != SYNC_STATUS_OK) {
SyncTaskManager::NotifyTaskDone(token.Pass(), status);
return;
}
metadata_database()->SweepDirtyTrackers(
file_ids_,
base::Bind(&SyncTaskManager::NotifyTaskDone, base::Passed(&token))); base::Bind(&SyncTaskManager::NotifyTaskDone, base::Passed(&token)));
} }
......
...@@ -40,6 +40,8 @@ class ListChangesTask : public SyncTask { ...@@ -40,6 +40,8 @@ class ListChangesTask : public SyncTask {
scoped_ptr<google_apis::ChangeList> change_list); scoped_ptr<google_apis::ChangeList> change_list);
void CheckInChangeList(int64 largest_change_id, void CheckInChangeList(int64 largest_change_id,
scoped_ptr<SyncTaskToken> token); scoped_ptr<SyncTaskToken> token);
void DidCheckInChangeList(scoped_ptr<SyncTaskToken> token,
SyncStatusCode status);
bool IsContextReady(); bool IsContextReady();
MetadataDatabase* metadata_database(); MetadataDatabase* metadata_database();
...@@ -48,6 +50,8 @@ class ListChangesTask : public SyncTask { ...@@ -48,6 +50,8 @@ class ListChangesTask : public SyncTask {
SyncEngineContext* sync_context_; SyncEngineContext* sync_context_;
ScopedVector<google_apis::ChangeResource> change_list_; ScopedVector<google_apis::ChangeResource> change_list_;
std::vector<std::string> file_ids_;
base::WeakPtrFactory<ListChangesTask> weak_ptr_factory_; base::WeakPtrFactory<ListChangesTask> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ListChangesTask); DISALLOW_COPY_AND_ASSIGN(ListChangesTask);
......
...@@ -1387,6 +1387,33 @@ void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { ...@@ -1387,6 +1387,33 @@ void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) {
*app_ids = index_->GetRegisteredAppIDs(); *app_ids = index_->GetRegisteredAppIDs();
} }
void MetadataDatabase::SweepDirtyTrackers(
const std::vector<std::string>& file_ids,
const SyncStatusCallback& callback) {
DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
std::set<int64> tracker_ids;
for (size_t i = 0; i < file_ids.size(); ++i) {
TrackerIDSet trackers_for_file_id =
index_->GetFileTrackerIDsByFileID(file_ids[i]);
for (TrackerIDSet::iterator itr = trackers_for_file_id.begin();
itr != trackers_for_file_id.end(); ++itr)
tracker_ids.insert(*itr);
}
for (std::set<int64>::iterator itr = tracker_ids.begin();
itr != tracker_ids.end(); ++itr) {
scoped_ptr<FileTracker> tracker(new FileTracker);
if (!index_->GetFileTracker(*itr, tracker.get()) ||
!CanClearDirty(*tracker))
continue;
tracker->set_dirty(false);
index_->StoreFileTracker(tracker.Pass());
}
WriteToDatabase(callback);
}
MetadataDatabase::MetadataDatabase( MetadataDatabase::MetadataDatabase(
base::SequencedTaskRunner* worker_task_runner, base::SequencedTaskRunner* worker_task_runner,
const base::FilePath& database_path, const base::FilePath& database_path,
...@@ -1913,5 +1940,35 @@ void MetadataDatabase::DetachFromSequence() { ...@@ -1913,5 +1940,35 @@ void MetadataDatabase::DetachFromSequence() {
worker_sequence_checker_.DetachFromSequence(); worker_sequence_checker_.DetachFromSequence();
} }
bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) {
DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
FileMetadata metadata;
if (!index_->GetFileMetadata(tracker.file_id(), &metadata) ||
!tracker.active() || !tracker.dirty() ||
!tracker.has_synced_details() ||
tracker.needs_folder_listing())
return false;
const FileDetails& remote_details = metadata.details();
const FileDetails& synced_details = tracker.synced_details();
if (remote_details.title() != synced_details.title() ||
remote_details.md5() != synced_details.md5())
return false;
std::set<std::string> parents;
for (int i = 0; i < remote_details.parent_folder_ids_size(); ++i)
parents.insert(remote_details.parent_folder_ids(i));
for (int i = 0; i < synced_details.parent_folder_ids_size(); ++i)
if (parents.erase(synced_details.parent_folder_ids(i)) != 1)
return false;
if (!parents.empty())
return false;
return true;
}
} // namespace drive_backend } // namespace drive_backend
} // namespace sync_file_system } // namespace sync_file_system
...@@ -345,6 +345,11 @@ class MetadataDatabase { ...@@ -345,6 +345,11 @@ class MetadataDatabase {
// Sets |app_ids| to a list of all registered app ids. // Sets |app_ids| to a list of all registered app ids.
void GetRegisteredAppIDs(std::vector<std::string>* app_ids); void GetRegisteredAppIDs(std::vector<std::string>* app_ids);
// Clears dirty flag of trackers that can be cleared without external
// interactien.
void SweepDirtyTrackers(const std::vector<std::string>& file_ids,
const SyncStatusCallback& callback);
private: private:
friend class MetadataDatabaseTest; friend class MetadataDatabaseTest;
struct CreateParam; struct CreateParam;
...@@ -404,6 +409,7 @@ class MetadataDatabase { ...@@ -404,6 +409,7 @@ class MetadataDatabase {
const std::string& file_id); const std::string& file_id);
void DetachFromSequence(); void DetachFromSequence();
bool CanClearDirty(const FileTracker& tracker);
scoped_refptr<base::SequencedTaskRunner> worker_task_runner_; scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
base::FilePath database_path_; base::FilePath database_path_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment