summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 11:45:20 +0000
committertzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 11:45:20 +0000
commitaa76e979b9e2648f520873f9f0f50b6b01c9e2ed (patch)
tree43a7951488d57716c4d42427bed89a19d187e73a
parent3c347373e423e5741349e3f13d051897bc75d3d6 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database.cc33
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database.h3
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc7
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);