| 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 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |