| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |