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

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

Issue 62583003: [Retry][SyncFS] Implement LargestKnownChangeID handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: +comment Created 7 years, 1 month 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 6401a5578469e6928f7281ca1638fcb7783227b5..1fa24f1bf182cddf6fa7da904427852b70fb4120 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());
@@ -954,7 +957,9 @@ bool MetadataDatabase::GetLowPriorityDirtyTracker(FileTracker* tracker) {
}
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);
}
@@ -1048,6 +1053,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();
@@ -1555,5 +1561,14 @@ scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles(
return files.Pass();
}
+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

Powered by Google App Engine
This is Rietveld 408576698