Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 134863003: [SyncFS] Refactor MetadataDatabase on dirty flag handling and sync-root creation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: testfix Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698