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

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

Powered by Google App Engine
This is Rietveld 408576698