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 |