diff options
author | tzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 11:45:20 +0000 |
---|---|---|
committer | tzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 11:45:20 +0000 |
commit | aa76e979b9e2648f520873f9f0f50b6b01c9e2ed (patch) | |
tree | 43a7951488d57716c4d42427bed89a19d187e73a | |
parent | 3c347373e423e5741349e3f13d051897bc75d3d6 (diff) | |
download | chromium_src-aa76e979b9e2648f520873f9f0f50b6b01c9e2ed.zip chromium_src-aa76e979b9e2648f520873f9f0f50b6b01c9e2ed.tar.gz chromium_src-aa76e979b9e2648f520873f9f0f50b6b01c9e2ed.tar.bz2 |
[Retry][SyncFS] Implement LargestKnownChangeID handling
BUG=240165
R=kinuko@chromium.org, nhiroki@chromium.org
NOTRY=true
Review URL: https://codereview.chromium.org/62583003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235709 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 34 insertions, 9 deletions
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 7926452..a5f995f 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc @@ -500,17 +500,13 @@ int64 MetadataDatabase::GetSyncRootTrackerID() const { } int64 MetadataDatabase::GetLargestKnownChangeID() const { - // TODO(tzik): Implement: - // - Add |largest_known_file_id| member to hold the value, that should - // initially have the same value to |largest_change_id|. - // - Change UpdateByFileResource and UpdateByChangeList not to overwrite - // FileMetadata if the newer one. - // - Change ListChangesTask to set UpdateLargestKnownChangeID. - return GetLargestFetchedChangeID(); + DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); + return largest_known_change_id_; } void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { - NOTIMPLEMENTED(); + if (largest_known_change_id_ < change_id) + largest_known_change_id_ = change_id; } bool MetadataDatabase::HasSyncRoot() const { @@ -528,6 +524,7 @@ void MetadataDatabase::PopulateInitialData( scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); service_metadata_->set_largest_change_id(largest_change_id); + UpdateLargestKnownChangeID(largest_change_id); FileTracker* sync_root_tracker = NULL; int64 sync_root_tracker_id = 0; @@ -761,6 +758,9 @@ void MetadataDatabase::UpdateByChangeList( itr != changes.end(); ++itr) { const google_apis::ChangeResource& change = **itr; + if (HasNewerFileMetadata(change.file_id(), change.change_id())) + continue; + scoped_ptr<FileMetadata> file( CreateFileMetadataFromChangeResource(change)); std::string file_id = file->file_id(); @@ -779,6 +779,7 @@ void MetadataDatabase::UpdateByChangeList( } } + UpdateLargestKnownChangeID(largest_change_id); service_metadata_->set_largest_change_id(largest_change_id); PutServiceMetadataToBatch(*service_metadata_, batch.get()); WriteToDatabase(batch.Pass(), callback); @@ -793,6 +794,8 @@ void MetadataDatabase::UpdateByFileResource( scoped_ptr<FileMetadata> file( CreateFileMetadataFromFileResource(change_id, resource)); std::string file_id = file->file_id(); + if (HasNewerFileMetadata(file_id, change_id)) + return; // TODO(tzik): Consolidate with UpdateByChangeList. MarkTrackersDirtyByFileID(file_id, batch.get()); @@ -961,7 +964,9 @@ bool MetadataDatabase::GetLowPriorityDirtyTracker( } MetadataDatabase::MetadataDatabase(base::SequencedTaskRunner* task_runner) - : task_runner_(task_runner), weak_ptr_factory_(this) { + : task_runner_(task_runner), + largest_known_change_id_(0), + weak_ptr_factory_(this) { DCHECK(task_runner); } @@ -1055,6 +1060,7 @@ SyncStatusCode MetadataDatabase::InitializeOnTaskRunner( void MetadataDatabase::BuildIndexes(DatabaseContents* contents) { service_metadata_ = contents->service_metadata.Pass(); + UpdateLargestKnownChangeID(service_metadata_->largest_change_id()); for (ScopedVector<FileMetadata>::const_iterator itr = contents->file_metadata.begin(); @@ -1572,5 +1578,14 @@ void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { } } +bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, + int64 change_id) { + FileByID::const_iterator found = file_by_id_.find(file_id); + if (found == file_by_id_.end()) + return false; + DCHECK(found->second->has_details()); + return found->second->details().change_id() >= change_id; +} + } // namespace drive_backend } // namespace sync_file_system diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.h b/chrome/browser/sync_file_system/drive_backend/metadata_database.h index 0590712..04ece53 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database.h +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.h @@ -338,10 +338,13 @@ class MetadataDatabase { void WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, const SyncStatusCallback& callback); + bool HasNewerFileMetadata(const std::string& file_id, int64 change_id); + scoped_refptr<base::SequencedTaskRunner> task_runner_; scoped_ptr<leveldb::DB> db_; scoped_ptr<ServiceMetadata> service_metadata_; + int64 largest_known_change_id_; FileByID file_by_id_; // Owned. TrackerByID tracker_by_id_; // Owned. diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc index 27da3410..f9724b4 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc @@ -401,6 +401,10 @@ class MetadataDatabaseTest : public testing::Test { details->set_change_id(++current_change_id_); } + void ApplyNoopChangeToMetadata(FileMetadata* file) { + file->mutable_details()->set_change_id(++current_change_id_); + } + void PushToChangeList(scoped_ptr<google_apis::ChangeResource> change, ScopedVector<google_apis::ChangeResource>* changes) { changes->push_back(change.release()); @@ -749,6 +753,9 @@ TEST_F(MetadataDatabaseTest, UpdateByChangeListTest) { &reorganized_file.metadata); ApplyContentChangeToMetadata(&updated_file.metadata); + // Update change ID. + ApplyNoopChangeToMetadata(&noop_file.metadata); + ScopedVector<google_apis::ChangeResource> changes; PushToChangeList( CreateChangeResourceFromMetadata(renamed_file.metadata), &changes); |