| 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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 result.reserve(total_size); | 77 result.reserve(total_size); |
| 78 for (PathComponents::const_reverse_iterator itr = components.rbegin(); | 78 for (PathComponents::const_reverse_iterator itr = components.rbegin(); |
| 79 itr != components.rend(); ++itr) { | 79 itr != components.rend(); ++itr) { |
| 80 result.append(1, base::FilePath::kSeparators[0]); | 80 result.append(1, base::FilePath::kSeparators[0]); |
| 81 result.append(itr->value()); | 81 result.append(itr->value()); |
| 82 } | 82 } |
| 83 | 83 |
| 84 return base::FilePath(result).NormalizePathSeparators(); | 84 return base::FilePath(result).NormalizePathSeparators(); |
| 85 } | 85 } |
| 86 | 86 |
| 87 void CreateInitialSyncRootTracker( | 87 scoped_ptr<FileTracker> CreateSyncRootTracker( |
| 88 int64 tracker_id, | 88 int64 tracker_id, |
| 89 const google_apis::FileResource& file_resource, | 89 const FileMetadata& sync_root_metadata) { |
| 90 scoped_ptr<FileMetadata>* file_out, | 90 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); |
| 91 scoped_ptr<FileTracker>* tracker_out) { | 91 sync_root_tracker->set_tracker_id(tracker_id); |
| 92 FileDetails details; | 92 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); |
| 93 PopulateFileDetailsByFileResource(file_resource, &details); | 93 sync_root_tracker->set_parent_tracker_id(0); |
| 94 | 94 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 95 scoped_ptr<FileMetadata> file(new FileMetadata); | 95 sync_root_tracker->set_dirty(false); |
| 96 file->set_file_id(file_resource.file_id()); | 96 sync_root_tracker->set_active(true); |
| 97 *file->mutable_details() = details; | 97 sync_root_tracker->set_needs_folder_listing(false); |
| 98 | 98 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); |
| 99 scoped_ptr<FileTracker> tracker(new FileTracker); | 99 return sync_root_tracker.Pass(); |
| 100 tracker->set_tracker_id(tracker_id); | |
| 101 tracker->set_file_id(file_resource.file_id()); | |
| 102 tracker->set_parent_tracker_id(0); | |
| 103 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | |
| 104 tracker->set_dirty(false); | |
| 105 tracker->set_active(true); | |
| 106 tracker->set_needs_folder_listing(false); | |
| 107 *tracker->mutable_synced_details() = details; | |
| 108 | |
| 109 *file_out = file.Pass(); | |
| 110 *tracker_out = tracker.Pass(); | |
| 111 } | 100 } |
| 112 | 101 |
| 113 void CreateInitialAppRootTracker( | 102 void CreateInitialAppRootTracker( |
| 114 int64 tracker_id, | 103 int64 tracker_id, |
| 115 const FileTracker& parent_tracker, | 104 const FileTracker& parent_tracker, |
| 116 const google_apis::FileResource& file_resource, | 105 const google_apis::FileResource& file_resource, |
| 117 scoped_ptr<FileMetadata>* file_out, | 106 scoped_ptr<FileMetadata>* file_out, |
| 118 scoped_ptr<FileTracker>* tracker_out) { | 107 scoped_ptr<FileTracker>* tracker_out) { |
| 119 FileDetails details; | 108 FileDetails details; |
| 120 PopulateFileDetailsByFileResource(file_resource, &details); | 109 PopulateFileDetailsByFileResource(file_resource, &details); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 137 *tracker_out = tracker.Pass(); | 126 *tracker_out = tracker.Pass(); |
| 138 } | 127 } |
| 139 | 128 |
| 140 void AdaptLevelDBStatusToSyncStatusCode(const SyncStatusCallback& callback, | 129 void AdaptLevelDBStatusToSyncStatusCode(const SyncStatusCallback& callback, |
| 141 const leveldb::Status& status) { | 130 const leveldb::Status& status) { |
| 142 callback.Run(LevelDBStatusToSyncStatusCode(status)); | 131 callback.Run(LevelDBStatusToSyncStatusCode(status)); |
| 143 } | 132 } |
| 144 | 133 |
| 145 void PutFileDeletionToBatch(const std::string& file_id, | 134 void PutFileDeletionToBatch(const std::string& file_id, |
| 146 leveldb::WriteBatch* batch) { | 135 leveldb::WriteBatch* batch) { |
| 147 batch->Delete(kFileMetadataKeyPrefix + file_id); | 136 if (batch) |
| 137 batch->Delete(kFileMetadataKeyPrefix + file_id); |
| 148 } | 138 } |
| 149 | 139 |
| 150 void PutTrackerDeletionToBatch(int64 tracker_id, leveldb::WriteBatch* batch) { | 140 void PutTrackerDeletionToBatch(int64 tracker_id, leveldb::WriteBatch* batch) { |
| 151 batch->Delete(kFileTrackerKeyPrefix + base::Int64ToString(tracker_id)); | 141 if (batch) |
| 142 batch->Delete(kFileTrackerKeyPrefix + base::Int64ToString(tracker_id)); |
| 152 } | 143 } |
| 153 | 144 |
| 154 template <typename OutputIterator> | 145 template <typename OutputIterator> |
| 155 OutputIterator PushChildTrackersToContainer( | 146 OutputIterator PushChildTrackersToContainer( |
| 156 const TrackersByParentAndTitle& trackers_by_parent, | 147 const TrackersByParentAndTitle& trackers_by_parent, |
| 157 int64 parent_tracker_id, | 148 int64 parent_tracker_id, |
| 158 OutputIterator target_itr) { | 149 OutputIterator target_itr) { |
| 159 TrackersByParentAndTitle::const_iterator found = | 150 TrackersByParentAndTitle::const_iterator found = |
| 160 trackers_by_parent.find(parent_tracker_id); | 151 trackers_by_parent.find(parent_tracker_id); |
| 161 if (found == trackers_by_parent.end()) | 152 if (found == trackers_by_parent.end()) |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 } | 317 } |
| 327 | 318 |
| 328 SyncStatusCode InitializeServiceMetadata(DatabaseContents* contents, | 319 SyncStatusCode InitializeServiceMetadata(DatabaseContents* contents, |
| 329 leveldb::WriteBatch* batch) { | 320 leveldb::WriteBatch* batch) { |
| 330 if (!contents->service_metadata) { | 321 if (!contents->service_metadata) { |
| 331 contents->service_metadata.reset(new ServiceMetadata); | 322 contents->service_metadata.reset(new ServiceMetadata); |
| 332 contents->service_metadata->set_next_tracker_id(1); | 323 contents->service_metadata->set_next_tracker_id(1); |
| 333 | 324 |
| 334 std::string value; | 325 std::string value; |
| 335 contents->service_metadata->SerializeToString(&value); | 326 contents->service_metadata->SerializeToString(&value); |
| 336 batch->Put(kServiceMetadataKey, value); | 327 if (batch) |
| 328 batch->Put(kServiceMetadataKey, value); |
| 337 } | 329 } |
| 338 return SYNC_STATUS_OK; | 330 return SYNC_STATUS_OK; |
| 339 } | 331 } |
| 340 | 332 |
| 341 SyncStatusCode RemoveUnreachableItems(DatabaseContents* contents, | 333 SyncStatusCode RemoveUnreachableItems(DatabaseContents* contents, |
| 342 leveldb::WriteBatch* batch) { | 334 leveldb::WriteBatch* batch) { |
| 343 TrackerByID unvisited_trackers; | 335 TrackerByID unvisited_trackers; |
| 344 typedef std::map<int64, std::set<FileTracker*> > TrackersByParent; | 336 typedef std::map<int64, std::set<FileTracker*> > TrackersByParent; |
| 345 TrackersByParent trackers_by_parent; | 337 TrackersByParent trackers_by_parent; |
| 346 | 338 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 DCHECK(tracker_by_id_.empty()); | 541 DCHECK(tracker_by_id_.empty()); |
| 550 DCHECK(file_by_id_.empty()); | 542 DCHECK(file_by_id_.empty()); |
| 551 | 543 |
| 552 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 544 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
| 553 service_metadata_->set_largest_change_id(largest_change_id); | 545 service_metadata_->set_largest_change_id(largest_change_id); |
| 554 UpdateLargestKnownChangeID(largest_change_id); | 546 UpdateLargestKnownChangeID(largest_change_id); |
| 555 | 547 |
| 556 FileTracker* sync_root_tracker = NULL; | 548 FileTracker* sync_root_tracker = NULL; |
| 557 int64 sync_root_tracker_id = 0; | 549 int64 sync_root_tracker_id = 0; |
| 558 { | 550 { |
| 559 scoped_ptr<FileMetadata> folder; | 551 scoped_ptr<FileMetadata> folder = |
| 560 scoped_ptr<FileTracker> tracker; | 552 CreateFileMetadataFromFileResource(largest_change_id, sync_root_folder); |
| 561 CreateInitialSyncRootTracker(IncrementTrackerID(batch.get()), | 553 scoped_ptr<FileTracker> tracker = |
| 562 sync_root_folder, | 554 CreateSyncRootTracker(IncrementTrackerID(batch.get()), *folder); |
| 563 &folder, | 555 |
| 564 &tracker); | |
| 565 std::string sync_root_folder_id = folder->file_id(); | 556 std::string sync_root_folder_id = folder->file_id(); |
| 566 sync_root_tracker = tracker.get(); | 557 sync_root_tracker = tracker.get(); |
| 567 sync_root_tracker_id = tracker->tracker_id(); | 558 sync_root_tracker_id = tracker->tracker_id(); |
| 568 | 559 |
| 569 PutFileToBatch(*folder, batch.get()); | 560 PutFileToBatch(*folder, batch.get()); |
| 570 PutTrackerToBatch(*tracker, batch.get()); | 561 PutTrackerToBatch(*tracker, batch.get()); |
| 571 | 562 |
| 572 service_metadata_->set_sync_root_tracker_id(tracker->tracker_id()); | 563 service_metadata_->set_sync_root_tracker_id(tracker->tracker_id()); |
| 573 PutServiceMetadataToBatch(*service_metadata_, batch.get()); | 564 PutServiceMetadataToBatch(*service_metadata_, batch.get()); |
| 574 | 565 |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 MakeTrackerActive(new_tracker->tracker_id(), batch.get()); | 944 MakeTrackerActive(new_tracker->tracker_id(), batch.get()); |
| 954 | 945 |
| 955 if (new_tracker->synced_details().title() != title) { | 946 if (new_tracker->synced_details().title() != title) { |
| 956 trackers_by_parent_and_title_[parent_tracker_id] | 947 trackers_by_parent_and_title_[parent_tracker_id] |
| 957 [GetTrackerTitle(*new_tracker)].Erase(new_tracker); | 948 [GetTrackerTitle(*new_tracker)].Erase(new_tracker); |
| 958 trackers_by_parent_and_title_[parent_tracker_id][title].Insert( | 949 trackers_by_parent_and_title_[parent_tracker_id][title].Insert( |
| 959 new_tracker); | 950 new_tracker); |
| 960 } | 951 } |
| 961 *new_tracker->mutable_synced_details() = new_file_details; | 952 *new_tracker->mutable_synced_details() = new_file_details; |
| 962 | 953 |
| 963 new_tracker->set_dirty(false); | 954 ClearDirty(new_tracker, batch.get()); |
| 964 dirty_trackers_.erase(new_tracker); | |
| 965 low_priority_dirty_trackers_.erase(new_tracker); | |
| 966 PutTrackerToBatch(*new_tracker, batch.get()); | |
| 967 | |
| 968 WriteToDatabase(batch.Pass(), callback); | 955 WriteToDatabase(batch.Pass(), callback); |
| 969 } | 956 } |
| 970 | 957 |
| 971 void MetadataDatabase::PopulateFolderByChildList( | 958 void MetadataDatabase::PopulateFolderByChildList( |
| 972 const std::string& folder_id, | 959 const std::string& folder_id, |
| 973 const FileIDList& child_file_ids, | 960 const FileIDList& child_file_ids, |
| 974 const SyncStatusCallback& callback) { | 961 const SyncStatusCallback& callback) { |
| 975 TrackerSet trackers; | 962 TrackerSet trackers; |
| 976 if (!FindTrackersByFileID(folder_id, &trackers) || | 963 if (!FindTrackersByFileID(folder_id, &trackers) || |
| 977 !trackers.has_active()) { | 964 !trackers.has_active()) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 992 std::back_inserter(known_children)); | 979 std::back_inserter(known_children)); |
| 993 for (std::vector<int64>::iterator itr = known_children.begin(); | 980 for (std::vector<int64>::iterator itr = known_children.begin(); |
| 994 itr != known_children.end(); ++itr) | 981 itr != known_children.end(); ++itr) |
| 995 children.erase(tracker_by_id_[*itr]->file_id()); | 982 children.erase(tracker_by_id_[*itr]->file_id()); |
| 996 | 983 |
| 997 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 984 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
| 998 for (FileIDList::const_iterator itr = child_file_ids.begin(); | 985 for (FileIDList::const_iterator itr = child_file_ids.begin(); |
| 999 itr != child_file_ids.end(); ++itr) | 986 itr != child_file_ids.end(); ++itr) |
| 1000 CreateTrackerForParentAndFileID(*folder_tracker, *itr, batch.get()); | 987 CreateTrackerForParentAndFileID(*folder_tracker, *itr, batch.get()); |
| 1001 folder_tracker->set_needs_folder_listing(false); | 988 folder_tracker->set_needs_folder_listing(false); |
| 1002 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) { | 989 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) |
| 1003 folder_tracker->set_dirty(false); | 990 ClearDirty(folder_tracker, NULL); |
| 1004 dirty_trackers_.erase(folder_tracker); | |
| 1005 low_priority_dirty_trackers_.erase(folder_tracker); | |
| 1006 } | |
| 1007 PutTrackerToBatch(*folder_tracker, batch.get()); | 991 PutTrackerToBatch(*folder_tracker, batch.get()); |
| 1008 | 992 |
| 1009 WriteToDatabase(batch.Pass(), callback); | 993 WriteToDatabase(batch.Pass(), callback); |
| 1010 } | 994 } |
| 1011 | 995 |
| 1012 void MetadataDatabase::UpdateTracker(int64 tracker_id, | 996 void MetadataDatabase::UpdateTracker(int64 tracker_id, |
| 1013 const FileDetails& updated_details, | 997 const FileDetails& updated_details, |
| 1014 const SyncStatusCallback& callback) { | 998 const SyncStatusCallback& callback) { |
| 1015 TrackerByID::iterator found = tracker_by_id_.find(tracker_id); | 999 TrackerByID::iterator found = tracker_by_id_.find(tracker_id); |
| 1016 if (found == tracker_by_id_.end()) { | 1000 if (found == tracker_by_id_.end()) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 } | 1065 } |
| 1082 } | 1066 } |
| 1083 | 1067 |
| 1084 *tracker->mutable_synced_details() = updated_details; | 1068 *tracker->mutable_synced_details() = updated_details; |
| 1085 | 1069 |
| 1086 // Activate the tracker if: | 1070 // Activate the tracker if: |
| 1087 // - There is no active tracker that tracks |tracker->file_id()|. | 1071 // - There is no active tracker that tracks |tracker->file_id()|. |
| 1088 // - There is no active tracker that has the same |parent| and |title|. | 1072 // - There is no active tracker that has the same |parent| and |title|. |
| 1089 if (!tracker->active() && CanActivateTracker(*tracker)) | 1073 if (!tracker->active() && CanActivateTracker(*tracker)) |
| 1090 MakeTrackerActive(tracker->tracker_id(), batch.get()); | 1074 MakeTrackerActive(tracker->tracker_id(), batch.get()); |
| 1091 if (tracker->dirty() && !ShouldKeepDirty(*tracker)) { | 1075 if (tracker->dirty() && !ShouldKeepDirty(*tracker)) |
| 1092 tracker->set_dirty(false); | 1076 ClearDirty(tracker, NULL); |
| 1093 dirty_trackers_.erase(tracker); | |
| 1094 low_priority_dirty_trackers_.erase(tracker); | |
| 1095 } | |
| 1096 PutTrackerToBatch(*tracker, batch.get()); | 1077 PutTrackerToBatch(*tracker, batch.get()); |
| 1097 | 1078 |
| 1098 WriteToDatabase(batch.Pass(), callback); | 1079 WriteToDatabase(batch.Pass(), callback); |
| 1099 } | 1080 } |
| 1100 | 1081 |
| 1101 MetadataDatabase::ActivationStatus MetadataDatabase::TryNoSideEffectActivation( | 1082 MetadataDatabase::ActivationStatus MetadataDatabase::TryNoSideEffectActivation( |
| 1102 int64 parent_tracker_id, | 1083 int64 parent_tracker_id, |
| 1103 const std::string& file_id, | 1084 const std::string& file_id, |
| 1104 const SyncStatusCallback& callback) { | 1085 const SyncStatusCallback& callback) { |
| 1105 DCHECK(ContainsKey(tracker_by_id_, parent_tracker_id)); | 1086 DCHECK(ContainsKey(tracker_by_id_, parent_tracker_id)); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1146 if (!tracker->has_synced_details() || | 1127 if (!tracker->has_synced_details() || |
| 1147 tracker->synced_details().title() != title) { | 1128 tracker->synced_details().title() != title) { |
| 1148 trackers_by_parent_and_title_[parent_tracker_id] | 1129 trackers_by_parent_and_title_[parent_tracker_id] |
| 1149 [GetTrackerTitle(*tracker)].Erase(tracker); | 1130 [GetTrackerTitle(*tracker)].Erase(tracker); |
| 1150 trackers_by_parent_and_title_[parent_tracker_id][title].Insert( | 1131 trackers_by_parent_and_title_[parent_tracker_id][title].Insert( |
| 1151 tracker); | 1132 tracker); |
| 1152 } | 1133 } |
| 1153 *tracker->mutable_synced_details() = file.details(); | 1134 *tracker->mutable_synced_details() = file.details(); |
| 1154 | 1135 |
| 1155 MakeTrackerActive(tracker->tracker_id(), batch.get()); | 1136 MakeTrackerActive(tracker->tracker_id(), batch.get()); |
| 1156 tracker->set_dirty(false); | 1137 ClearDirty(tracker, batch.get()); |
| 1157 dirty_trackers_.erase(tracker); | |
| 1158 low_priority_dirty_trackers_.erase(tracker); | |
| 1159 PutTrackerToBatch(*tracker, batch.get()); | |
| 1160 | 1138 |
| 1161 WriteToDatabase(batch.Pass(), callback); | 1139 WriteToDatabase(batch.Pass(), callback); |
| 1162 return ACTIVATION_PENDING; | 1140 return ACTIVATION_PENDING; |
| 1163 } | 1141 } |
| 1164 | 1142 |
| 1165 void MetadataDatabase::LowerTrackerPriority(int64 tracker_id) { | 1143 void MetadataDatabase::LowerTrackerPriority(int64 tracker_id) { |
| 1166 TrackerByID::const_iterator found = tracker_by_id_.find(tracker_id); | 1144 TrackerByID::const_iterator found = tracker_by_id_.find(tracker_id); |
| 1167 if (found == tracker_by_id_.end()) | 1145 if (found == tracker_by_id_.end()) |
| 1168 return; | 1146 return; |
| 1169 | 1147 |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 trackers_by_file_id_[tracker->file_id()].Activate(tracker); | 1389 trackers_by_file_id_[tracker->file_id()].Activate(tracker); |
| 1412 if (parent_tracker_id) { | 1390 if (parent_tracker_id) { |
| 1413 trackers_by_parent_and_title_[parent_tracker_id][ | 1391 trackers_by_parent_and_title_[parent_tracker_id][ |
| 1414 tracker->synced_details().title()].Activate(tracker); | 1392 tracker->synced_details().title()].Activate(tracker); |
| 1415 } | 1393 } |
| 1416 tracker->set_active(true); | 1394 tracker->set_active(true); |
| 1417 tracker->set_needs_folder_listing( | 1395 tracker->set_needs_folder_listing( |
| 1418 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); | 1396 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); |
| 1419 | 1397 |
| 1420 // Make |tracker| a normal priority dirty tracker. | 1398 // Make |tracker| a normal priority dirty tracker. |
| 1421 if (tracker->dirty()) | 1399 MarkSingleTrackerAsDirty(tracker, NULL); |
| 1422 low_priority_dirty_trackers_.erase(tracker); | |
| 1423 tracker->set_dirty(true); | |
| 1424 dirty_trackers_.insert(tracker); | |
| 1425 | |
| 1426 PutTrackerToBatch(*tracker, batch); | 1400 PutTrackerToBatch(*tracker, batch); |
| 1427 } | 1401 } |
| 1428 | 1402 |
| 1429 void MetadataDatabase::MakeTrackerInactive(int64 tracker_id, | 1403 void MetadataDatabase::MakeTrackerInactive(int64 tracker_id, |
| 1430 leveldb::WriteBatch* batch) { | 1404 leveldb::WriteBatch* batch) { |
| 1431 FileTracker* tracker = tracker_by_id_[tracker_id]; | 1405 FileTracker* tracker = tracker_by_id_[tracker_id]; |
| 1432 DCHECK(tracker); | 1406 DCHECK(tracker); |
| 1433 DCHECK(tracker->active()); | 1407 DCHECK(tracker->active()); |
| 1434 DCHECK_EQ(TRACKER_KIND_REGULAR, tracker->tracker_kind()); | 1408 DCHECK_EQ(TRACKER_KIND_REGULAR, tracker->tracker_kind()); |
| 1435 trackers_by_file_id_[tracker->file_id()].Inactivate(tracker); | 1409 trackers_by_file_id_[tracker->file_id()].Inactivate(tracker); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 TrackerSet* conflicting_trackers = &found_by_title->second; | 1633 TrackerSet* conflicting_trackers = &found_by_title->second; |
| 1660 conflicting_trackers->Erase(tracker); | 1634 conflicting_trackers->Erase(tracker); |
| 1661 | 1635 |
| 1662 if (conflicting_trackers->tracker_set().empty()) { | 1636 if (conflicting_trackers->tracker_set().empty()) { |
| 1663 trackers_by_title->erase(found_by_title); | 1637 trackers_by_title->erase(found_by_title); |
| 1664 if (trackers_by_title->empty()) | 1638 if (trackers_by_title->empty()) |
| 1665 trackers_by_parent_and_title_.erase(found); | 1639 trackers_by_parent_and_title_.erase(found); |
| 1666 } | 1640 } |
| 1667 } | 1641 } |
| 1668 | 1642 |
| 1669 void MetadataDatabase::MarkSingleTrackerDirty(FileTracker* tracker, | 1643 void MetadataDatabase::MarkSingleTrackerAsDirty(FileTracker* tracker, |
| 1670 leveldb::WriteBatch* batch) { | 1644 leveldb::WriteBatch* batch) { |
| 1671 if (!tracker->dirty()) { | 1645 if (!tracker->dirty()) { |
| 1672 tracker->set_dirty(true); | 1646 tracker->set_dirty(true); |
| 1673 PutTrackerToBatch(*tracker, batch); | 1647 PutTrackerToBatch(*tracker, batch); |
| 1674 } | 1648 } |
| 1675 dirty_trackers_.insert(tracker); | 1649 dirty_trackers_.insert(tracker); |
| 1676 low_priority_dirty_trackers_.erase(tracker); | 1650 low_priority_dirty_trackers_.erase(tracker); |
| 1677 } | 1651 } |
| 1678 | 1652 |
| 1653 void MetadataDatabase::ClearDirty(FileTracker* tracker, |
| 1654 leveldb::WriteBatch* batch) { |
| 1655 if (tracker->dirty()) { |
| 1656 tracker->set_dirty(false); |
| 1657 PutTrackerToBatch(*tracker, batch); |
| 1658 } |
| 1659 |
| 1660 dirty_trackers_.erase(tracker); |
| 1661 low_priority_dirty_trackers_.erase(tracker); |
| 1662 } |
| 1663 |
| 1679 void MetadataDatabase::MarkTrackerSetDirty( | 1664 void MetadataDatabase::MarkTrackerSetDirty( |
| 1680 TrackerSet* trackers, | 1665 TrackerSet* trackers, |
| 1681 leveldb::WriteBatch* batch) { | 1666 leveldb::WriteBatch* batch) { |
| 1682 for (TrackerSet::iterator itr = trackers->begin(); | 1667 for (TrackerSet::iterator itr = trackers->begin(); |
| 1683 itr != trackers->end(); ++itr) { | 1668 itr != trackers->end(); ++itr) { |
| 1684 MarkSingleTrackerDirty(*itr, batch); | 1669 MarkSingleTrackerAsDirty(*itr, batch); |
| 1685 } | 1670 } |
| 1686 } | 1671 } |
| 1687 | 1672 |
| 1688 void MetadataDatabase::MarkTrackersDirtyByFileID( | 1673 void MetadataDatabase::MarkTrackersDirtyByFileID( |
| 1689 const std::string& file_id, | 1674 const std::string& file_id, |
| 1690 leveldb::WriteBatch* batch) { | 1675 leveldb::WriteBatch* batch) { |
| 1691 TrackersByFileID::iterator found = trackers_by_file_id_.find(file_id); | 1676 TrackersByFileID::iterator found = trackers_by_file_id_.find(file_id); |
| 1692 if (found != trackers_by_file_id_.end()) | 1677 if (found != trackers_by_file_id_.end()) |
| 1693 MarkTrackerSetDirty(&found->second, batch); | 1678 MarkTrackerSetDirty(&found->second, batch); |
| 1694 } | 1679 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1717 void MetadataDatabase::RecursiveMarkTrackerAsDirty(int64 root_tracker_id, | 1702 void MetadataDatabase::RecursiveMarkTrackerAsDirty(int64 root_tracker_id, |
| 1718 leveldb::WriteBatch* batch) { | 1703 leveldb::WriteBatch* batch) { |
| 1719 std::vector<int64> stack; | 1704 std::vector<int64> stack; |
| 1720 stack.push_back(root_tracker_id); | 1705 stack.push_back(root_tracker_id); |
| 1721 while (!stack.empty()) { | 1706 while (!stack.empty()) { |
| 1722 int64 tracker_id = stack.back(); | 1707 int64 tracker_id = stack.back(); |
| 1723 stack.pop_back(); | 1708 stack.pop_back(); |
| 1724 PushChildTrackersToContainer( | 1709 PushChildTrackersToContainer( |
| 1725 trackers_by_parent_and_title_, tracker_id, std::back_inserter(stack)); | 1710 trackers_by_parent_and_title_, tracker_id, std::back_inserter(stack)); |
| 1726 | 1711 |
| 1727 FileTracker* tracker = tracker_by_id_[tracker_id]; | 1712 MarkSingleTrackerAsDirty(tracker_by_id_[tracker_id], batch); |
| 1728 if (!tracker->dirty()) { | |
| 1729 tracker->set_dirty(true); | |
| 1730 PutTrackerToBatch(*tracker, batch); | |
| 1731 dirty_trackers_.insert(tracker); | |
| 1732 low_priority_dirty_trackers_.erase(tracker); | |
| 1733 } | |
| 1734 } | 1713 } |
| 1735 } | 1714 } |
| 1736 | 1715 |
| 1737 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { | 1716 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { |
| 1738 DCHECK(!tracker.active()); | 1717 DCHECK(!tracker.active()); |
| 1739 DCHECK_NE(service_metadata_->sync_root_tracker_id(), tracker.tracker_id()); | 1718 DCHECK_NE(service_metadata_->sync_root_tracker_id(), tracker.tracker_id()); |
| 1740 | 1719 |
| 1741 if (HasActiveTrackerForFileID(tracker.file_id())) | 1720 if (HasActiveTrackerForFileID(tracker.file_id())) |
| 1742 return false; | 1721 return false; |
| 1743 | 1722 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1855 | 1834 |
| 1856 if (FindTrackersByFileID(file_id, NULL)) { | 1835 if (FindTrackersByFileID(file_id, NULL)) { |
| 1857 MarkTrackersDirtyByFileID(file_id, batch); | 1836 MarkTrackersDirtyByFileID(file_id, batch); |
| 1858 PutFileToBatch(*file, batch); | 1837 PutFileToBatch(*file, batch); |
| 1859 StoreFileMetadata(file.Pass()); | 1838 StoreFileMetadata(file.Pass()); |
| 1860 } | 1839 } |
| 1861 } | 1840 } |
| 1862 | 1841 |
| 1863 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, | 1842 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, |
| 1864 const SyncStatusCallback& callback) { | 1843 const SyncStatusCallback& callback) { |
| 1844 if (!batch) { |
| 1845 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); |
| 1846 return; |
| 1847 } |
| 1848 |
| 1865 base::PostTaskAndReplyWithResult( | 1849 base::PostTaskAndReplyWithResult( |
| 1866 task_runner_.get(), | 1850 task_runner_.get(), |
| 1867 FROM_HERE, | 1851 FROM_HERE, |
| 1868 base::Bind(&leveldb::DB::Write, | 1852 base::Bind(&leveldb::DB::Write, |
| 1869 base::Unretained(db_.get()), | 1853 base::Unretained(db_.get()), |
| 1870 leveldb::WriteOptions(), | 1854 leveldb::WriteOptions(), |
| 1871 base::Owned(batch.release())), | 1855 base::Owned(batch.release())), |
| 1872 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); | 1856 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); |
| 1873 } | 1857 } |
| 1874 | 1858 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2043 void MetadataDatabase::StoreFileTracker(scoped_ptr<FileTracker> file_tracker) { | 2027 void MetadataDatabase::StoreFileTracker(scoped_ptr<FileTracker> file_tracker) { |
| 2044 DCHECK(file_tracker); | 2028 DCHECK(file_tracker); |
| 2045 | 2029 |
| 2046 int64 tracker_id = file_tracker->tracker_id(); | 2030 int64 tracker_id = file_tracker->tracker_id(); |
| 2047 DCHECK(!ContainsKey(tracker_by_id_, tracker_id)); | 2031 DCHECK(!ContainsKey(tracker_by_id_, tracker_id)); |
| 2048 tracker_by_id_[tracker_id] = file_tracker.release(); | 2032 tracker_by_id_[tracker_id] = file_tracker.release(); |
| 2049 } | 2033 } |
| 2050 | 2034 |
| 2051 } // namespace drive_backend | 2035 } // namespace drive_backend |
| 2052 } // namespace sync_file_system | 2036 } // namespace sync_file_system |
| OLD | NEW |