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 |