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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 388913005: [SyncFS] Migrate ServiceMetadata from MDDB to MDDBIndex. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove usage of undefined variable Created 6 years, 5 months 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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 288
289 SyncStatusCode WriteVersionInfo(leveldb::DB* db) { 289 SyncStatusCode WriteVersionInfo(leveldb::DB* db) {
290 base::ThreadRestrictions::AssertIOAllowed(); 290 base::ThreadRestrictions::AssertIOAllowed();
291 DCHECK(db); 291 DCHECK(db);
292 return LevelDBStatusToSyncStatusCode( 292 return LevelDBStatusToSyncStatusCode(
293 db->Put(leveldb::WriteOptions(), 293 db->Put(leveldb::WriteOptions(),
294 kDatabaseVersionKey, 294 kDatabaseVersionKey,
295 base::Int64ToString(kCurrentDatabaseVersion))); 295 base::Int64ToString(kCurrentDatabaseVersion)));
296 } 296 }
297 297
298 scoped_ptr<ServiceMetadata> ReadServiceMetadata(leveldb::DB* db) {
299 base::ThreadRestrictions::AssertIOAllowed();
300 DCHECK(db);
301
302 std::string value;
303 leveldb::Status status = db->Get(leveldb::ReadOptions(),
304 kServiceMetadataKey,
305 &value);
306 if (!status.ok())
307 return scoped_ptr<ServiceMetadata>();
308
309 scoped_ptr<ServiceMetadata> service_metadata(new ServiceMetadata);
310 if (!service_metadata->ParseFromString(value)) {
311 util::Log(logging::LOG_WARNING, FROM_HERE,
312 "Failed to parse SyncServiceMetadata");
313 return scoped_ptr<ServiceMetadata>();
314 }
315 return service_metadata.Pass();
316 }
317
318 scoped_ptr<ServiceMetadata> InitializeServiceMetadata(
319 leveldb::DB* db, leveldb::WriteBatch* batch) {
320 scoped_ptr<ServiceMetadata> service_metadata = ReadServiceMetadata(db);
321 if (!service_metadata) {
322 service_metadata.reset(new ServiceMetadata);
323 service_metadata->set_next_tracker_id(1);
324
325 std::string value;
326 service_metadata->SerializeToString(&value);
327 if (batch)
328 batch->Put(kServiceMetadataKey, value);
329 }
330 return service_metadata.Pass();
331 }
332
333 bool HasInvalidTitle(const std::string& title) { 298 bool HasInvalidTitle(const std::string& title) {
334 return title.empty() || 299 return title.empty() ||
335 title.find('/') != std::string::npos || 300 title.find('/') != std::string::npos ||
336 title.find('\\') != std::string::npos; 301 title.find('\\') != std::string::npos;
337 } 302 }
338 303
339 void MarkTrackerSetDirty(const TrackerIDSet& trackers, 304 void MarkTrackerSetDirty(const TrackerIDSet& trackers,
340 MetadataDatabaseIndexInterface* index, 305 MetadataDatabaseIndexInterface* index,
341 leveldb::WriteBatch* batch) { 306 leveldb::WriteBatch* batch) {
342 for (TrackerIDSet::const_iterator itr = trackers.begin(); 307 for (TrackerIDSet::const_iterator itr = trackers.begin();
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 metadata_database.reset(); 616 metadata_database.reset();
652 617
653 file_task_runner->PostTask( 618 file_task_runner->PostTask(
654 FROM_HERE, 619 FROM_HERE,
655 base::Bind(base::IgnoreResult(base::DeleteFile), 620 base::Bind(base::IgnoreResult(base::DeleteFile),
656 database_path, true /* recursive */)); 621 database_path, true /* recursive */));
657 } 622 }
658 623
659 int64 MetadataDatabase::GetLargestFetchedChangeID() const { 624 int64 MetadataDatabase::GetLargestFetchedChangeID() const {
660 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 625 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
661 return service_metadata_->largest_change_id(); 626 return index_->GetLargestChangeID();
662 } 627 }
663 628
664 int64 MetadataDatabase::GetSyncRootTrackerID() const { 629 int64 MetadataDatabase::GetSyncRootTrackerID() const {
665 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 630 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
666 return service_metadata_->sync_root_tracker_id(); 631 return index_->GetSyncRootTrackerID();
667 } 632 }
668 633
669 int64 MetadataDatabase::GetLargestKnownChangeID() const { 634 int64 MetadataDatabase::GetLargestKnownChangeID() const {
670 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 635 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
671 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); 636 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_);
672 return largest_known_change_id_; 637 return largest_known_change_id_;
673 } 638 }
674 639
675 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { 640 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) {
676 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 641 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
677 if (largest_known_change_id_ < change_id) 642 if (largest_known_change_id_ < change_id)
678 largest_known_change_id_ = change_id; 643 largest_known_change_id_ = change_id;
679 } 644 }
680 645
681 bool MetadataDatabase::HasSyncRoot() const { 646 bool MetadataDatabase::HasSyncRoot() const {
682 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 647 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
683 return service_metadata_->has_sync_root_tracker_id() && 648 return index_->GetSyncRootTrackerID() != kInvalidTrackerID;
684 !!service_metadata_->sync_root_tracker_id();
685 } 649 }
686 650
687 void MetadataDatabase::PopulateInitialData( 651 void MetadataDatabase::PopulateInitialData(
688 int64 largest_change_id, 652 int64 largest_change_id,
689 const google_apis::FileResource& sync_root_folder, 653 const google_apis::FileResource& sync_root_folder,
690 const ScopedVector<google_apis::FileResource>& app_root_folders, 654 const ScopedVector<google_apis::FileResource>& app_root_folders,
691 const SyncStatusCallback& callback) { 655 const SyncStatusCallback& callback) {
692 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 656 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
693 657
694 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 658 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
695 service_metadata_->set_largest_change_id(largest_change_id); 659 index_->SetLargestChangeID(largest_change_id, batch.get());
696 UpdateLargestKnownChangeID(largest_change_id); 660 UpdateLargestKnownChangeID(largest_change_id);
697 661
698 AttachSyncRoot(sync_root_folder, batch.get()); 662 AttachSyncRoot(sync_root_folder, batch.get());
699 for (size_t i = 0; i < app_root_folders.size(); ++i) 663 for (size_t i = 0; i < app_root_folders.size(); ++i)
700 AttachInitialAppRoot(*app_root_folders[i], batch.get()); 664 AttachInitialAppRoot(*app_root_folders[i], batch.get());
701 665
702 WriteToDatabase(batch.Pass(), callback); 666 WriteToDatabase(batch.Pass(), callback);
703 } 667 }
704 668
705 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { 669 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 if (trackers.has_active()) { 703 if (trackers.has_active()) {
740 // The folder is tracked by another tracker. 704 // The folder is tracked by another tracker.
741 util::Log(logging::LOG_WARNING, FROM_HERE, 705 util::Log(logging::LOG_WARNING, FROM_HERE,
742 "Failed to register App for %s", app_id.c_str()); 706 "Failed to register App for %s", app_id.c_str());
743 worker_task_runner_->PostTask( 707 worker_task_runner_->PostTask(
744 FROM_HERE, 708 FROM_HERE,
745 base::Bind(callback, SYNC_STATUS_HAS_CONFLICT)); 709 base::Bind(callback, SYNC_STATUS_HAS_CONFLICT));
746 return; 710 return;
747 } 711 }
748 712
749 int64 sync_root_tracker_id = service_metadata_->sync_root_tracker_id(); 713 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID();
750 if (!sync_root_tracker_id) { 714 if (!sync_root_tracker_id) {
751 util::Log(logging::LOG_WARNING, FROM_HERE, 715 util::Log(logging::LOG_WARNING, FROM_HERE,
752 "Sync-root needs to be set up before registering app-root"); 716 "Sync-root needs to be set up before registering app-root");
753 worker_task_runner_->PostTask( 717 worker_task_runner_->PostTask(
754 FROM_HERE, 718 FROM_HERE,
755 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND)); 719 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
756 return; 720 return;
757 } 721 }
758 722
759 scoped_ptr<FileTracker> tracker(new FileTracker); 723 scoped_ptr<FileTracker> tracker(new FileTracker);
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 } 968 }
1005 969
1006 return true; 970 return true;
1007 } 971 }
1008 972
1009 void MetadataDatabase::UpdateByChangeList( 973 void MetadataDatabase::UpdateByChangeList(
1010 int64 largest_change_id, 974 int64 largest_change_id,
1011 ScopedVector<google_apis::ChangeResource> changes, 975 ScopedVector<google_apis::ChangeResource> changes,
1012 const SyncStatusCallback& callback) { 976 const SyncStatusCallback& callback) {
1013 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 977 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1014 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); 978 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id);
1015 979
1016 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 980 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
1017 981
1018 for (size_t i = 0; i < changes.size(); ++i) { 982 for (size_t i = 0; i < changes.size(); ++i) {
1019 const google_apis::ChangeResource& change = *changes[i]; 983 const google_apis::ChangeResource& change = *changes[i];
1020 if (HasNewerFileMetadata(change.file_id(), change.change_id())) 984 if (HasNewerFileMetadata(change.file_id(), change.change_id()))
1021 continue; 985 continue;
1022 986
1023 scoped_ptr<FileMetadata> metadata( 987 scoped_ptr<FileMetadata> metadata(
1024 CreateFileMetadataFromChangeResource(change)); 988 CreateFileMetadataFromChangeResource(change));
1025 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 989 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
1026 UPDATE_TRACKER_FOR_UNSYNCED_FILE, 990 UPDATE_TRACKER_FOR_UNSYNCED_FILE,
1027 batch.get()); 991 batch.get());
1028 } 992 }
1029 993
1030 UpdateLargestKnownChangeID(largest_change_id); 994 UpdateLargestKnownChangeID(largest_change_id);
1031 service_metadata_->set_largest_change_id(largest_change_id); 995 index_->SetLargestChangeID(largest_change_id, batch.get());
1032 PutServiceMetadataToBatch(*service_metadata_, batch.get());
1033 WriteToDatabase(batch.Pass(), callback); 996 WriteToDatabase(batch.Pass(), callback);
1034 } 997 }
1035 998
1036 void MetadataDatabase::UpdateByFileResource( 999 void MetadataDatabase::UpdateByFileResource(
1037 const google_apis::FileResource& resource, 1000 const google_apis::FileResource& resource,
1038 const SyncStatusCallback& callback) { 1001 const SyncStatusCallback& callback) {
1039 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1002 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1040 1003
1041 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); 1004 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch);
1042 1005
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 status = WriteVersionInfo(db_.get()); 1485 status = WriteVersionInfo(db_.get());
1523 if (status != SYNC_STATUS_OK) 1486 if (status != SYNC_STATUS_OK)
1524 return status; 1487 return status;
1525 } else { 1488 } else {
1526 status = MigrateDatabaseIfNeeded(db_.get()); 1489 status = MigrateDatabaseIfNeeded(db_.get());
1527 if (status != SYNC_STATUS_OK) 1490 if (status != SYNC_STATUS_OK)
1528 return status; 1491 return status;
1529 } 1492 }
1530 1493
1531 leveldb::WriteBatch batch; 1494 leveldb::WriteBatch batch;
1532 service_metadata_ = InitializeServiceMetadata(db_.get(), &batch); 1495 index_ = MetadataDatabaseIndex::Create(db_.get(), &batch);
1533 index_ = MetadataDatabaseIndex::Create(
1534 db_.get(), service_metadata_->sync_root_tracker_id(), &batch);
1535 1496
1536 status = LevelDBStatusToSyncStatusCode( 1497 status = LevelDBStatusToSyncStatusCode(
1537 db_->Write(leveldb::WriteOptions(), &batch)); 1498 db_->Write(leveldb::WriteOptions(), &batch));
1538 if (status != SYNC_STATUS_OK) 1499 if (status != SYNC_STATUS_OK)
1539 return status; 1500 return status;
1540 1501
1541 UpdateLargestKnownChangeID(service_metadata_->largest_change_id()); 1502 UpdateLargestKnownChangeID(index_->GetLargestChangeID());
1542 1503
1543 return status; 1504 return status;
1544 } 1505 }
1545 1506
1546 void MetadataDatabase::CreateTrackerForParentAndFileID( 1507 void MetadataDatabase::CreateTrackerForParentAndFileID(
1547 const FileTracker& parent_tracker, 1508 const FileTracker& parent_tracker,
1548 const std::string& file_id, 1509 const std::string& file_id,
1549 leveldb::WriteBatch* batch) { 1510 leveldb::WriteBatch* batch) {
1550 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1511 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1551 CreateTrackerInternal(parent_tracker, file_id, NULL, 1512 CreateTrackerInternal(parent_tracker, file_id, NULL,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 1600
1640 CreateTrackerForParentAndFileMetadata( 1601 CreateTrackerForParentAndFileMetadata(
1641 parent_tracker, metadata, option, batch); 1602 parent_tracker, metadata, option, batch);
1642 } 1603 }
1643 } 1604 }
1644 } 1605 }
1645 1606
1646 int64 MetadataDatabase::IncrementTrackerID(leveldb::WriteBatch* batch) { 1607 int64 MetadataDatabase::IncrementTrackerID(leveldb::WriteBatch* batch) {
1647 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1608 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1648 1609
1649 int64 tracker_id = service_metadata_->next_tracker_id(); 1610 int64 tracker_id = index_->GetNextTrackerID();
1650 service_metadata_->set_next_tracker_id(tracker_id + 1); 1611 index_->SetNextTrackerID(tracker_id + 1, batch);
1651 PutServiceMetadataToBatch(*service_metadata_, batch);
1652 DCHECK_GT(tracker_id, 0); 1612 DCHECK_GT(tracker_id, 0);
1653 return tracker_id; 1613 return tracker_id;
1654 } 1614 }
1655 1615
1656 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { 1616 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) {
1657 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1617 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1658 DCHECK(!tracker.active()); 1618 DCHECK(!tracker.active());
1659 DCHECK_NE(service_metadata_->sync_root_tracker_id(), tracker.tracker_id()); 1619 DCHECK_NE(index_->GetSyncRootTrackerID(), tracker.tracker_id());
1660 1620
1661 if (HasActiveTrackerForFileID(tracker.file_id())) 1621 if (HasActiveTrackerForFileID(tracker.file_id()))
1662 return false; 1622 return false;
1663 1623
1664 if (tracker.app_id().empty() && 1624 if (tracker.app_id().empty() &&
1665 tracker.tracker_id() != GetSyncRootTrackerID()) { 1625 tracker.tracker_id() != GetSyncRootTrackerID()) {
1666 return false; 1626 return false;
1667 } 1627 }
1668 1628
1669 if (!tracker.has_synced_details()) 1629 if (!tracker.has_synced_details())
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1995 const google_apis::FileResource& sync_root_folder, 1955 const google_apis::FileResource& sync_root_folder,
1996 leveldb::WriteBatch* batch) { 1956 leveldb::WriteBatch* batch) {
1997 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); 1957 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1998 1958
1999 scoped_ptr<FileMetadata> sync_root_metadata = 1959 scoped_ptr<FileMetadata> sync_root_metadata =
2000 CreateFileMetadataFromFileResource( 1960 CreateFileMetadataFromFileResource(
2001 GetLargestKnownChangeID(), sync_root_folder); 1961 GetLargestKnownChangeID(), sync_root_folder);
2002 scoped_ptr<FileTracker> sync_root_tracker = 1962 scoped_ptr<FileTracker> sync_root_tracker =
2003 CreateSyncRootTracker(IncrementTrackerID(batch), *sync_root_metadata); 1963 CreateSyncRootTracker(IncrementTrackerID(batch), *sync_root_metadata);
2004 1964
2005 service_metadata_->set_sync_root_tracker_id(sync_root_tracker->tracker_id()); 1965 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id(), batch);
2006 PutServiceMetadataToBatch(*service_metadata_, batch);
2007
2008 index_->StoreFileMetadata(sync_root_metadata.Pass(), batch); 1966 index_->StoreFileMetadata(sync_root_metadata.Pass(), batch);
2009 index_->StoreFileTracker(sync_root_tracker.Pass(), batch); 1967 index_->StoreFileTracker(sync_root_tracker.Pass(), batch);
2010 } 1968 }
2011 1969
2012 void MetadataDatabase::AttachInitialAppRoot( 1970 void MetadataDatabase::AttachInitialAppRoot(
2013 const google_apis::FileResource& app_root_folder, 1971 const google_apis::FileResource& app_root_folder,
2014 leveldb::WriteBatch* batch) { 1972 leveldb::WriteBatch* batch) {
2015 scoped_ptr<FileMetadata> app_root_metadata = 1973 scoped_ptr<FileMetadata> app_root_metadata =
2016 CreateFileMetadataFromFileResource( 1974 CreateFileMetadataFromFileResource(
2017 GetLargestKnownChangeID(), app_root_folder); 1975 GetLargestKnownChangeID(), app_root_folder);
2018 scoped_ptr<FileTracker> app_root_tracker = 1976 scoped_ptr<FileTracker> app_root_tracker =
2019 CreateInitialAppRootTracker(IncrementTrackerID(batch), 1977 CreateInitialAppRootTracker(IncrementTrackerID(batch),
2020 GetSyncRootTrackerID(), 1978 GetSyncRootTrackerID(),
2021 *app_root_metadata); 1979 *app_root_metadata);
2022 1980
2023 index_->StoreFileMetadata(app_root_metadata.Pass(), batch); 1981 index_->StoreFileMetadata(app_root_metadata.Pass(), batch);
2024 index_->StoreFileTracker(app_root_tracker.Pass(), batch); 1982 index_->StoreFileTracker(app_root_tracker.Pass(), batch);
2025 } 1983 }
2026 1984
2027 void MetadataDatabase::DetachFromSequence() { 1985 void MetadataDatabase::DetachFromSequence() {
2028 worker_sequence_checker_.DetachFromSequence(); 1986 worker_sequence_checker_.DetachFromSequence();
2029 } 1987 }
2030 1988
2031 } // namespace drive_backend 1989 } // namespace drive_backend
2032 } // namespace sync_file_system 1990 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698