| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_index.
h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index.
h" |
| 6 | 6 |
| 7 #include <tuple> | 7 #include <tuple> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/memory/ptr_util.h" |
| 10 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 11 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 13 #include "base/threading/thread_restrictions.h" | 14 #include "base/threading/thread_restrictions.h" |
| 14 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 15 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
| 15 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" | 16 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" |
| 16 #include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h" | 17 #include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h" |
| 17 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 18 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
| 18 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" | 19 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" |
| 19 #include "chrome/browser/sync_file_system/logger.h" | 20 #include "chrome/browser/sync_file_system/logger.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 typename Container::const_iterator found = container.find(key); | 76 typename Container::const_iterator found = container.find(key); |
| 76 if (found == container.end()) | 77 if (found == container.end()) |
| 77 return typename Container::mapped_type(); | 78 return typename Container::mapped_type(); |
| 78 return found->second; | 79 return found->second; |
| 79 } | 80 } |
| 80 | 81 |
| 81 void ReadDatabaseContents(LevelDBWrapper* db, DatabaseContents* contents) { | 82 void ReadDatabaseContents(LevelDBWrapper* db, DatabaseContents* contents) { |
| 82 DCHECK(db); | 83 DCHECK(db); |
| 83 DCHECK(contents); | 84 DCHECK(contents); |
| 84 | 85 |
| 85 scoped_ptr<LevelDBWrapper::Iterator> itr(db->NewIterator()); | 86 std::unique_ptr<LevelDBWrapper::Iterator> itr(db->NewIterator()); |
| 86 for (itr->SeekToFirst(); itr->Valid(); itr->Next()) { | 87 for (itr->SeekToFirst(); itr->Valid(); itr->Next()) { |
| 87 std::string key = itr->key().ToString(); | 88 std::string key = itr->key().ToString(); |
| 88 std::string value = itr->value().ToString(); | 89 std::string value = itr->value().ToString(); |
| 89 | 90 |
| 90 std::string file_id; | 91 std::string file_id; |
| 91 if (RemovePrefix(key, kFileMetadataKeyPrefix, &file_id)) { | 92 if (RemovePrefix(key, kFileMetadataKeyPrefix, &file_id)) { |
| 92 scoped_ptr<FileMetadata> metadata(new FileMetadata); | 93 std::unique_ptr<FileMetadata> metadata(new FileMetadata); |
| 93 if (!metadata->ParseFromString(itr->value().ToString())) { | 94 if (!metadata->ParseFromString(itr->value().ToString())) { |
| 94 util::Log(logging::LOG_WARNING, FROM_HERE, | 95 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 95 "Failed to parse a FileMetadata"); | 96 "Failed to parse a FileMetadata"); |
| 96 continue; | 97 continue; |
| 97 } | 98 } |
| 98 | 99 |
| 99 contents->file_metadata.push_back(metadata.release()); | 100 contents->file_metadata.push_back(metadata.release()); |
| 100 continue; | 101 continue; |
| 101 } | 102 } |
| 102 | 103 |
| 103 std::string tracker_id_str; | 104 std::string tracker_id_str; |
| 104 if (RemovePrefix(key, kFileTrackerKeyPrefix, &tracker_id_str)) { | 105 if (RemovePrefix(key, kFileTrackerKeyPrefix, &tracker_id_str)) { |
| 105 int64_t tracker_id = 0; | 106 int64_t tracker_id = 0; |
| 106 if (!base::StringToInt64(tracker_id_str, &tracker_id)) { | 107 if (!base::StringToInt64(tracker_id_str, &tracker_id)) { |
| 107 util::Log(logging::LOG_WARNING, FROM_HERE, | 108 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 108 "Failed to parse TrackerID"); | 109 "Failed to parse TrackerID"); |
| 109 continue; | 110 continue; |
| 110 } | 111 } |
| 111 | 112 |
| 112 scoped_ptr<FileTracker> tracker(new FileTracker); | 113 std::unique_ptr<FileTracker> tracker(new FileTracker); |
| 113 if (!tracker->ParseFromString(itr->value().ToString())) { | 114 if (!tracker->ParseFromString(itr->value().ToString())) { |
| 114 util::Log(logging::LOG_WARNING, FROM_HERE, | 115 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 115 "Failed to parse a Tracker"); | 116 "Failed to parse a Tracker"); |
| 116 continue; | 117 continue; |
| 117 } | 118 } |
| 118 contents->file_trackers.push_back(tracker.release()); | 119 contents->file_trackers.push_back(tracker.release()); |
| 119 continue; | 120 continue; |
| 120 } | 121 } |
| 121 } | 122 } |
| 122 } | 123 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 } else { | 194 } else { |
| 194 PutFileMetadataDeletionToDB(metadata->file_id(), db); | 195 PutFileMetadataDeletionToDB(metadata->file_id(), db); |
| 195 } | 196 } |
| 196 } | 197 } |
| 197 contents->file_metadata = std::move(referred_file_metadata); | 198 contents->file_metadata = std::move(referred_file_metadata); |
| 198 } | 199 } |
| 199 | 200 |
| 200 } // namespace | 201 } // namespace |
| 201 | 202 |
| 202 // static | 203 // static |
| 203 scoped_ptr<MetadataDatabaseIndex> | 204 std::unique_ptr<MetadataDatabaseIndex> MetadataDatabaseIndex::Create( |
| 204 MetadataDatabaseIndex::Create(LevelDBWrapper* db) { | 205 LevelDBWrapper* db) { |
| 205 DCHECK(db); | 206 DCHECK(db); |
| 206 | 207 |
| 207 scoped_ptr<ServiceMetadata> service_metadata = InitializeServiceMetadata(db); | 208 std::unique_ptr<ServiceMetadata> service_metadata = |
| 209 InitializeServiceMetadata(db); |
| 208 if (!service_metadata) | 210 if (!service_metadata) |
| 209 return scoped_ptr<MetadataDatabaseIndex>(); | 211 return std::unique_ptr<MetadataDatabaseIndex>(); |
| 210 | 212 |
| 211 DatabaseContents contents; | 213 DatabaseContents contents; |
| 212 PutVersionToDB(kCurrentDatabaseVersion, db); | 214 PutVersionToDB(kCurrentDatabaseVersion, db); |
| 213 ReadDatabaseContents(db, &contents); | 215 ReadDatabaseContents(db, &contents); |
| 214 RemoveUnreachableItemsFromDB(&contents, | 216 RemoveUnreachableItemsFromDB(&contents, |
| 215 service_metadata->sync_root_tracker_id(), | 217 service_metadata->sync_root_tracker_id(), |
| 216 db); | 218 db); |
| 217 | 219 |
| 218 scoped_ptr<MetadataDatabaseIndex> index(new MetadataDatabaseIndex(db)); | 220 std::unique_ptr<MetadataDatabaseIndex> index(new MetadataDatabaseIndex(db)); |
| 219 index->Initialize(std::move(service_metadata), &contents); | 221 index->Initialize(std::move(service_metadata), &contents); |
| 220 return index; | 222 return index; |
| 221 } | 223 } |
| 222 | 224 |
| 223 // static | 225 // static |
| 224 scoped_ptr<MetadataDatabaseIndex> | 226 std::unique_ptr<MetadataDatabaseIndex> MetadataDatabaseIndex::CreateForTesting( |
| 225 MetadataDatabaseIndex::CreateForTesting(DatabaseContents* contents, | 227 DatabaseContents* contents, |
| 226 LevelDBWrapper* db) { | 228 LevelDBWrapper* db) { |
| 227 scoped_ptr<MetadataDatabaseIndex> index(new MetadataDatabaseIndex(db)); | 229 std::unique_ptr<MetadataDatabaseIndex> index(new MetadataDatabaseIndex(db)); |
| 228 index->Initialize(make_scoped_ptr(new ServiceMetadata), contents); | 230 index->Initialize(base::WrapUnique(new ServiceMetadata), contents); |
| 229 return index; | 231 return index; |
| 230 } | 232 } |
| 231 | 233 |
| 232 void MetadataDatabaseIndex::Initialize( | 234 void MetadataDatabaseIndex::Initialize( |
| 233 scoped_ptr<ServiceMetadata> service_metadata, | 235 std::unique_ptr<ServiceMetadata> service_metadata, |
| 234 DatabaseContents* contents) { | 236 DatabaseContents* contents) { |
| 235 service_metadata_ = std::move(service_metadata); | 237 service_metadata_ = std::move(service_metadata); |
| 236 | 238 |
| 237 for (size_t i = 0; i < contents->file_metadata.size(); ++i) | 239 for (size_t i = 0; i < contents->file_metadata.size(); ++i) |
| 238 StoreFileMetadata(make_scoped_ptr(contents->file_metadata[i])); | 240 StoreFileMetadata(base::WrapUnique(contents->file_metadata[i])); |
| 239 contents->file_metadata.weak_clear(); | 241 contents->file_metadata.weak_clear(); |
| 240 | 242 |
| 241 for (size_t i = 0; i < contents->file_trackers.size(); ++i) | 243 for (size_t i = 0; i < contents->file_trackers.size(); ++i) |
| 242 StoreFileTracker(make_scoped_ptr(contents->file_trackers[i])); | 244 StoreFileTracker(base::WrapUnique(contents->file_trackers[i])); |
| 243 contents->file_trackers.weak_clear(); | 245 contents->file_trackers.weak_clear(); |
| 244 | 246 |
| 245 UMA_HISTOGRAM_COUNTS("SyncFileSystem.MetadataNumber", metadata_by_id_.size()); | 247 UMA_HISTOGRAM_COUNTS("SyncFileSystem.MetadataNumber", metadata_by_id_.size()); |
| 246 UMA_HISTOGRAM_COUNTS("SyncFileSystem.TrackerNumber", tracker_by_id_.size()); | 248 UMA_HISTOGRAM_COUNTS("SyncFileSystem.TrackerNumber", tracker_by_id_.size()); |
| 247 UMA_HISTOGRAM_COUNTS_100("SyncFileSystem.RegisteredAppNumber", | 249 UMA_HISTOGRAM_COUNTS_100("SyncFileSystem.RegisteredAppNumber", |
| 248 app_root_by_app_id_.size()); | 250 app_root_by_app_id_.size()); |
| 249 } | 251 } |
| 250 | 252 |
| 251 MetadataDatabaseIndex::MetadataDatabaseIndex(LevelDBWrapper* db) : db_(db) {} | 253 MetadataDatabaseIndex::MetadataDatabaseIndex(LevelDBWrapper* db) : db_(db) {} |
| 252 MetadataDatabaseIndex::~MetadataDatabaseIndex() {} | 254 MetadataDatabaseIndex::~MetadataDatabaseIndex() {} |
| (...skipping 18 matching lines...) Expand all Loading... |
| 271 FileTracker* tracker) const { | 273 FileTracker* tracker) const { |
| 272 FileTracker* identified = tracker_by_id_.get(tracker_id); | 274 FileTracker* identified = tracker_by_id_.get(tracker_id); |
| 273 if (!identified) | 275 if (!identified) |
| 274 return false; | 276 return false; |
| 275 if (tracker) | 277 if (tracker) |
| 276 tracker->CopyFrom(*identified); | 278 tracker->CopyFrom(*identified); |
| 277 return true; | 279 return true; |
| 278 } | 280 } |
| 279 | 281 |
| 280 void MetadataDatabaseIndex::StoreFileMetadata( | 282 void MetadataDatabaseIndex::StoreFileMetadata( |
| 281 scoped_ptr<FileMetadata> metadata) { | 283 std::unique_ptr<FileMetadata> metadata) { |
| 282 PutFileMetadataToDB(*metadata.get(), db_); | 284 PutFileMetadataToDB(*metadata.get(), db_); |
| 283 if (!metadata) { | 285 if (!metadata) { |
| 284 NOTREACHED(); | 286 NOTREACHED(); |
| 285 return; | 287 return; |
| 286 } | 288 } |
| 287 | 289 |
| 288 std::string file_id = metadata->file_id(); | 290 std::string file_id = metadata->file_id(); |
| 289 metadata_by_id_.set(file_id, std::move(metadata)); | 291 metadata_by_id_.set(file_id, std::move(metadata)); |
| 290 } | 292 } |
| 291 | 293 |
| 292 void MetadataDatabaseIndex::StoreFileTracker( | 294 void MetadataDatabaseIndex::StoreFileTracker( |
| 293 scoped_ptr<FileTracker> tracker) { | 295 std::unique_ptr<FileTracker> tracker) { |
| 294 PutFileTrackerToDB(*tracker.get(), db_); | 296 PutFileTrackerToDB(*tracker.get(), db_); |
| 295 if (!tracker) { | 297 if (!tracker) { |
| 296 NOTREACHED(); | 298 NOTREACHED(); |
| 297 return; | 299 return; |
| 298 } | 300 } |
| 299 | 301 |
| 300 int64_t tracker_id = tracker->tracker_id(); | 302 int64_t tracker_id = tracker->tracker_id(); |
| 301 FileTracker* old_tracker = tracker_by_id_.get(tracker_id); | 303 FileTracker* old_tracker = tracker_by_id_.get(tracker_id); |
| 302 | 304 |
| 303 if (!old_tracker) { | 305 if (!old_tracker) { |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 | 765 |
| 764 DVLOG(3) << " Remove from dirty_trackers_: " << tracker_id; | 766 DVLOG(3) << " Remove from dirty_trackers_: " << tracker_id; |
| 765 dirty_trackers_.erase(tracker_id); | 767 dirty_trackers_.erase(tracker_id); |
| 766 | 768 |
| 767 demoted_dirty_trackers_.erase(tracker_id); | 769 demoted_dirty_trackers_.erase(tracker_id); |
| 768 } | 770 } |
| 769 } | 771 } |
| 770 | 772 |
| 771 } // namespace drive_backend | 773 } // namespace drive_backend |
| 772 } // namespace sync_file_system | 774 } // namespace sync_file_system |
| OLD | NEW |