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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <stack> 8 #include <stack>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 493
494 int64 MetadataDatabase::GetLargestFetchedChangeID() const { 494 int64 MetadataDatabase::GetLargestFetchedChangeID() const {
495 return service_metadata_->largest_change_id(); 495 return service_metadata_->largest_change_id();
496 } 496 }
497 497
498 int64 MetadataDatabase::GetSyncRootTrackerID() const { 498 int64 MetadataDatabase::GetSyncRootTrackerID() const {
499 return service_metadata_->sync_root_tracker_id(); 499 return service_metadata_->sync_root_tracker_id();
500 } 500 }
501 501
502 int64 MetadataDatabase::GetLargestKnownChangeID() const { 502 int64 MetadataDatabase::GetLargestKnownChangeID() const {
503 // TODO(tzik): Implement: 503 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_);
504 // - Add |largest_known_file_id| member to hold the value, that should 504 return largest_known_change_id_;
505 // initially have the same value to |largest_change_id|.
506 // - Change UpdateByFileResource and UpdateByChangeList not to overwrite
507 // FileMetadata if the newer one.
508 // - Change ListChangesTask to set UpdateLargestKnownChangeID.
509 return GetLargestFetchedChangeID();
510 } 505 }
511 506
512 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { 507 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) {
513 NOTIMPLEMENTED(); 508 if (largest_known_change_id_ < change_id)
509 largest_known_change_id_ = change_id;
514 } 510 }
515 511
516 bool MetadataDatabase::HasSyncRoot() const { 512 bool MetadataDatabase::HasSyncRoot() const {
517 return service_metadata_->has_sync_root_tracker_id() && 513 return service_metadata_->has_sync_root_tracker_id() &&
518 !!service_metadata_->sync_root_tracker_id(); 514 !!service_metadata_->sync_root_tracker_id();
519 } 515 }
520 516
521 void MetadataDatabase::PopulateInitialData( 517 void MetadataDatabase::PopulateInitialData(
522 int64 largest_change_id, 518 int64 largest_change_id,
523 const google_apis::FileResource& sync_root_folder, 519 const google_apis::FileResource& sync_root_folder,
524 const ScopedVector<google_apis::FileResource>& app_root_folders, 520 const ScopedVector<google_apis::FileResource>& app_root_folders,
525 const SyncStatusCallback& callback) { 521 const SyncStatusCallback& callback) {
526 DCHECK(tracker_by_id_.empty()); 522 DCHECK(tracker_by_id_.empty());
527 DCHECK(file_by_id_.empty()); 523 DCHECK(file_by_id_.empty());
528 524
529 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 525 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
530 service_metadata_->set_largest_change_id(largest_change_id); 526 service_metadata_->set_largest_change_id(largest_change_id);
527 UpdateLargestKnownChangeID(largest_change_id);
531 528
532 FileTracker* sync_root_tracker = NULL; 529 FileTracker* sync_root_tracker = NULL;
533 int64 sync_root_tracker_id = 0; 530 int64 sync_root_tracker_id = 0;
534 { 531 {
535 scoped_ptr<FileMetadata> folder; 532 scoped_ptr<FileMetadata> folder;
536 scoped_ptr<FileTracker> tracker; 533 scoped_ptr<FileTracker> tracker;
537 CreateInitialSyncRootTracker(GetNextTrackerID(batch.get()), 534 CreateInitialSyncRootTracker(GetNextTrackerID(batch.get()),
538 sync_root_folder, 535 sync_root_folder,
539 &folder, 536 &folder,
540 &tracker); 537 &tracker);
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 const SyncStatusCallback& callback) { 751 const SyncStatusCallback& callback) {
755 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); 752 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id);
756 753
757 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 754 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
758 755
759 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr = 756 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr =
760 changes.begin(); 757 changes.begin();
761 itr != changes.end(); 758 itr != changes.end();
762 ++itr) { 759 ++itr) {
763 const google_apis::ChangeResource& change = **itr; 760 const google_apis::ChangeResource& change = **itr;
761 if (HasNewerFileMetadata(change.file_id(), change.change_id()))
762 continue;
763
764 scoped_ptr<FileMetadata> file( 764 scoped_ptr<FileMetadata> file(
765 CreateFileMetadataFromChangeResource(change)); 765 CreateFileMetadataFromChangeResource(change));
766 std::string file_id = file->file_id(); 766 std::string file_id = file->file_id();
767 767
768 MarkTrackersDirtyByFileID(file_id, batch.get()); 768 MarkTrackersDirtyByFileID(file_id, batch.get());
769 if (!file->details().deleted()) 769 if (!file->details().deleted())
770 MaybeAddTrackersForNewFile(*file, batch.get()); 770 MaybeAddTrackersForNewFile(*file, batch.get());
771 771
772 if (FindTrackersByFileID(file_id, NULL)) { 772 if (FindTrackersByFileID(file_id, NULL)) {
773 PutFileToBatch(*file, batch.get()); 773 PutFileToBatch(*file, batch.get());
774 774
775 // Set |file| to |file_by_id_[file_id]| and delete old value. 775 // Set |file| to |file_by_id_[file_id]| and delete old value.
776 FileMetadata* file_ptr = file.release(); 776 FileMetadata* file_ptr = file.release();
777 std::swap(file_ptr, file_by_id_[file_id]); 777 std::swap(file_ptr, file_by_id_[file_id]);
778 delete file_ptr; 778 delete file_ptr;
779 } 779 }
780 } 780 }
781 781
782 UpdateLargestKnownChangeID(largest_change_id);
782 service_metadata_->set_largest_change_id(largest_change_id); 783 service_metadata_->set_largest_change_id(largest_change_id);
783 PutServiceMetadataToBatch(*service_metadata_, batch.get()); 784 PutServiceMetadataToBatch(*service_metadata_, batch.get());
784 WriteToDatabase(batch.Pass(), callback); 785 WriteToDatabase(batch.Pass(), callback);
785 } 786 }
786 787
787 void MetadataDatabase::UpdateByFileResource( 788 void MetadataDatabase::UpdateByFileResource(
788 int64 change_id, 789 int64 change_id,
789 const google_apis::FileResource& resource, 790 const google_apis::FileResource& resource,
790 const SyncStatusCallback& callback) { 791 const SyncStatusCallback& callback) {
791 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 792 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
792 793
793 scoped_ptr<FileMetadata> file( 794 scoped_ptr<FileMetadata> file(
794 CreateFileMetadataFromFileResource(change_id, resource)); 795 CreateFileMetadataFromFileResource(change_id, resource));
795 std::string file_id = file->file_id(); 796 std::string file_id = file->file_id();
797 if (HasNewerFileMetadata(file_id, change_id))
798 return;
796 799
797 // TODO(tzik): Consolidate with UpdateByChangeList. 800 // TODO(tzik): Consolidate with UpdateByChangeList.
798 MarkTrackersDirtyByFileID(file_id, batch.get()); 801 MarkTrackersDirtyByFileID(file_id, batch.get());
799 if (!file->details().deleted()) { 802 if (!file->details().deleted()) {
800 MaybeAddTrackersForNewFile(*file, batch.get()); 803 MaybeAddTrackersForNewFile(*file, batch.get());
801 804
802 if (FindTrackersByFileID(file_id, NULL)) { 805 if (FindTrackersByFileID(file_id, NULL)) {
803 PutFileToBatch(*file, batch.get()); 806 PutFileToBatch(*file, batch.get());
804 807
805 // Set |file| to |file_by_id_[file_id]| and delete old value. 808 // Set |file| to |file_by_id_[file_id]| and delete old value.
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 NOTIMPLEMENTED(); 950 NOTIMPLEMENTED();
948 return false; 951 return false;
949 } 952 }
950 953
951 bool MetadataDatabase::GetLowPriorityDirtyTracker(FileTracker* tracker) { 954 bool MetadataDatabase::GetLowPriorityDirtyTracker(FileTracker* tracker) {
952 NOTIMPLEMENTED(); 955 NOTIMPLEMENTED();
953 return false; 956 return false;
954 } 957 }
955 958
956 MetadataDatabase::MetadataDatabase(base::SequencedTaskRunner* task_runner) 959 MetadataDatabase::MetadataDatabase(base::SequencedTaskRunner* task_runner)
957 : task_runner_(task_runner), weak_ptr_factory_(this) { 960 : task_runner_(task_runner),
961 largest_known_change_id_(0),
962 weak_ptr_factory_(this) {
958 DCHECK(task_runner); 963 DCHECK(task_runner);
959 } 964 }
960 965
961 // static 966 // static
962 void MetadataDatabase::CreateOnTaskRunner( 967 void MetadataDatabase::CreateOnTaskRunner(
963 base::SingleThreadTaskRunner* callback_runner, 968 base::SingleThreadTaskRunner* callback_runner,
964 base::SequencedTaskRunner* task_runner, 969 base::SequencedTaskRunner* task_runner,
965 const base::FilePath& database_path, 970 const base::FilePath& database_path,
966 const CreateCallback& callback) { 971 const CreateCallback& callback) {
967 scoped_ptr<MetadataDatabase> metadata_database( 972 scoped_ptr<MetadataDatabase> metadata_database(
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 db_->Write(leveldb::WriteOptions(), &batch)); 1046 db_->Write(leveldb::WriteOptions(), &batch));
1042 if (status != SYNC_STATUS_OK) 1047 if (status != SYNC_STATUS_OK)
1043 return status; 1048 return status;
1044 1049
1045 BuildIndexes(&contents); 1050 BuildIndexes(&contents);
1046 return status; 1051 return status;
1047 } 1052 }
1048 1053
1049 void MetadataDatabase::BuildIndexes(DatabaseContents* contents) { 1054 void MetadataDatabase::BuildIndexes(DatabaseContents* contents) {
1050 service_metadata_ = contents->service_metadata.Pass(); 1055 service_metadata_ = contents->service_metadata.Pass();
1056 UpdateLargestKnownChangeID(service_metadata_->largest_change_id());
1051 1057
1052 for (ScopedVector<FileMetadata>::const_iterator itr = 1058 for (ScopedVector<FileMetadata>::const_iterator itr =
1053 contents->file_metadata.begin(); 1059 contents->file_metadata.begin();
1054 itr != contents->file_metadata.end(); 1060 itr != contents->file_metadata.end();
1055 ++itr) { 1061 ++itr) {
1056 file_by_id_[(*itr)->file_id()] = *itr; 1062 file_by_id_[(*itr)->file_id()] = *itr;
1057 } 1063 }
1058 contents->file_metadata.weak_clear(); 1064 contents->file_metadata.weak_clear();
1059 1065
1060 for (ScopedVector<FileTracker>::const_iterator itr = 1066 for (ScopedVector<FileTracker>::const_iterator itr =
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 details->SetString("dirty", tracker->dirty() ? "true" : "false"); 1554 details->SetString("dirty", tracker->dirty() ? "true" : "false");
1549 1555
1550 file->Set("details", details); 1556 file->Set("details", details);
1551 1557
1552 files->Append(file); 1558 files->Append(file);
1553 } 1559 }
1554 1560
1555 return files.Pass(); 1561 return files.Pass();
1556 } 1562 }
1557 1563
1564 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id,
1565 int64 change_id) {
1566 FileByID::const_iterator found = file_by_id_.find(file_id);
1567 if (found == file_by_id_.end())
1568 return false;
1569 DCHECK(found->second->has_details());
1570 return found->second->details().change_id() >= change_id;
1571 }
1572
1558 } // namespace drive_backend 1573 } // namespace drive_backend
1559 } // namespace sync_file_system 1574 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698