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

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

Issue 177233005: [SyncFS] Wire up MetadataDatabaseIndex to MetadataDatabase (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 9 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 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 5 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 namespace tracked_objects { 42 namespace tracked_objects {
43 class Location; 43 class Location;
44 } 44 }
45 45
46 namespace sync_file_system { 46 namespace sync_file_system {
47 namespace drive_backend { 47 namespace drive_backend {
48 48
49 class FileDetails; 49 class FileDetails;
50 class FileMetadata; 50 class FileMetadata;
51 class FileTracker; 51 class FileTracker;
52 class MetadataDatabaseIndex;
52 class ServiceMetadata; 53 class ServiceMetadata;
53 54
54 struct DatabaseContents { 55 struct DatabaseContents {
55 scoped_ptr<ServiceMetadata> service_metadata; 56 scoped_ptr<ServiceMetadata> service_metadata;
56 ScopedVector<FileMetadata> file_metadata; 57 ScopedVector<FileMetadata> file_metadata;
57 ScopedVector<FileTracker> file_trackers; 58 ScopedVector<FileTracker> file_trackers;
58 59
59 DatabaseContents(); 60 DatabaseContents();
60 ~DatabaseContents(); 61 ~DatabaseContents();
61 }; 62 };
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 // - have |needs_folder_listing| flag and dirty flag, or 114 // - have |needs_folder_listing| flag and dirty flag, or
114 // - have all children at the stored largest change ID. 115 // - have all children at the stored largest change ID.
115 // 116 //
116 // - If multiple trackers have the same parent tracker and same title, they 117 // - If multiple trackers have the same parent tracker and same title, they
117 // must not have same |file_id|, and at most one of them may be active. 118 // must not have same |file_id|, and at most one of them may be active.
118 // - If multiple trackers have the same |file_id|, at most one of them may be 119 // - If multiple trackers have the same |file_id|, at most one of them may be
119 // active. 120 // active.
120 // 121 //
121 class MetadataDatabase { 122 class MetadataDatabase {
122 public: 123 public:
123 typedef base::ScopedPtrHashMap<std::string, FileMetadata> MetadataByID;
124 typedef base::ScopedPtrHashMap<int64, FileTracker> TrackerByID;
125 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByFileID;
126 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByTitle;
127 typedef std::map<int64, TrackerIDsByTitle> TrackerIDsByParentAndTitle;
128 typedef base::hash_map<std::string, int64> TrackerIDByAppID;
129 typedef std::vector<std::string> FileIDList; 124 typedef std::vector<std::string> FileIDList;
130 125
131 typedef base::Callback< 126 typedef base::Callback<
132 void(SyncStatusCode status, scoped_ptr<MetadataDatabase> instance)> 127 void(SyncStatusCode status, scoped_ptr<MetadataDatabase> instance)>
133 CreateCallback; 128 CreateCallback;
134 129
135 enum ActivationStatus { 130 enum ActivationStatus {
136 ACTIVATION_PENDING, 131 ACTIVATION_PENDING,
137 ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER, 132 ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER,
138 }; 133 };
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 bool GetMultiParentFileTrackers(std::string* file_id, 348 bool GetMultiParentFileTrackers(std::string* file_id,
354 TrackerIDSet* trackers); 349 TrackerIDSet* trackers);
355 bool GetConflictingTrackers(TrackerIDSet* trackers); 350 bool GetConflictingTrackers(TrackerIDSet* trackers);
356 351
357 // Sets |app_ids| to a list of all registered app ids. 352 // Sets |app_ids| to a list of all registered app ids.
358 void GetRegisteredAppIDs(std::vector<std::string>* app_ids); 353 void GetRegisteredAppIDs(std::vector<std::string>* app_ids);
359 354
360 private: 355 private:
361 friend class MetadataDatabaseTest; 356 friend class MetadataDatabaseTest;
362 357
363 struct DirtyTrackerComparator {
364 bool operator()(const FileTracker* left,
365 const FileTracker* right) const;
366 };
367
368 typedef std::set<FileTracker*, DirtyTrackerComparator> DirtyTrackers;
369
370 MetadataDatabase(base::SequencedTaskRunner* task_runner, 358 MetadataDatabase(base::SequencedTaskRunner* task_runner,
371 const base::FilePath& database_path, 359 const base::FilePath& database_path,
372 leveldb::Env* env_override); 360 leveldb::Env* env_override);
373 static void CreateOnTaskRunner(base::SingleThreadTaskRunner* callback_runner, 361 static void CreateOnTaskRunner(base::SingleThreadTaskRunner* callback_runner,
374 base::SequencedTaskRunner* task_runner, 362 base::SequencedTaskRunner* task_runner,
375 const base::FilePath& database_path, 363 const base::FilePath& database_path,
376 leveldb::Env* env_override, 364 leveldb::Env* env_override,
377 const CreateCallback& callback); 365 const CreateCallback& callback);
378 SyncStatusCode InitializeOnTaskRunner(); 366 SyncStatusCode InitializeOnTaskRunner();
379 void BuildIndexes(DatabaseContents* contents); 367 void BuildIndexes(DatabaseContents* contents);
380 368
381 // Database manipulation methods. 369 // Database manipulation methods.
382 void RegisterTrackerAsAppRoot(const std::string& app_id, 370 void RegisterTrackerAsAppRoot(const std::string& app_id,
383 int64 tracker_id, 371 int64 tracker_id,
384 leveldb::WriteBatch* batch); 372 leveldb::WriteBatch* batch);
385 void MakeTrackerActive(int64 tracker_id, leveldb::WriteBatch* batch);
386 void MakeTrackerInactive(int64 tracker_id, leveldb::WriteBatch* batch);
387 void MakeAppRootDisabled(int64 tracker_id, leveldb::WriteBatch* batch);
388 void MakeAppRootEnabled(int64 tracker_id, leveldb::WriteBatch* batch);
389
390 void UnregisterTrackerAsAppRoot(const std::string& app_id,
391 leveldb::WriteBatch* batch);
392 void RemoveAllDescendantTrackers(int64 root_tracker_id,
393 leveldb::WriteBatch* batch);
394 373
395 void CreateTrackerForParentAndFileID(const FileTracker& parent_tracker, 374 void CreateTrackerForParentAndFileID(const FileTracker& parent_tracker,
396 const std::string& file_id, 375 const std::string& file_id,
397 leveldb::WriteBatch* batch); 376 leveldb::WriteBatch* batch);
398 void CreateTrackerForParentAndFileMetadata(const FileTracker& parent_tracker, 377 void CreateTrackerForParentAndFileMetadata(const FileTracker& parent_tracker,
399 const FileMetadata& file_metadata, 378 const FileMetadata& file_metadata,
400 UpdateOption option, 379 UpdateOption option,
401 leveldb::WriteBatch* batch); 380 leveldb::WriteBatch* batch);
402 void CreateTrackerInternal(const FileTracker& parent_tracker, 381 void CreateTrackerInternal(const FileTracker& parent_tracker,
403 const std::string& file_id, 382 const std::string& file_id,
404 const FileDetails* details, 383 const FileDetails* details,
405 UpdateOption option, 384 UpdateOption option,
406 leveldb::WriteBatch* batch); 385 leveldb::WriteBatch* batch);
407 386
408 void RemoveTracker(int64 tracker_id, leveldb::WriteBatch* batch);
409 void RemoveTrackerIgnoringSameTitle(int64 tracker_id,
410 leveldb::WriteBatch* batch);
411 void RemoveTrackerInternal(int64 tracker_id,
412 leveldb::WriteBatch* batch,
413 bool ignoring_same_title);
414 void MaybeAddTrackersForNewFile(const FileMetadata& file, 387 void MaybeAddTrackersForNewFile(const FileMetadata& file,
415 UpdateOption option, 388 UpdateOption option,
416 leveldb::WriteBatch* batch); 389 leveldb::WriteBatch* batch);
417 390
418 void MarkSingleTrackerAsDirty(FileTracker* tracker,
419 leveldb::WriteBatch* batch);
420 void ClearDirty(FileTracker* tracker, leveldb::WriteBatch* batch);
421 void MarkTrackerSetDirty(TrackerIDSet* trackers,
422 leveldb::WriteBatch* batch);
423 void MarkTrackersDirtyByFileID(const std::string& file_id,
424 leveldb::WriteBatch* batch);
425 void MarkTrackersDirtyByPath(int64 parent_tracker_id,
426 const std::string& title,
427 leveldb::WriteBatch* batch);
428
429 void EraseTrackerFromFileIDIndex(FileTracker* tracker,
430 leveldb::WriteBatch* batch);
431 void EraseTrackerFromPathIndex(FileTracker* tracker);
432 void EraseFileFromDatabase(const std::string& file_id,
433 leveldb::WriteBatch* batch);
434
435 int64 IncrementTrackerID(leveldb::WriteBatch* batch); 391 int64 IncrementTrackerID(leveldb::WriteBatch* batch);
436 392
437 void RecursiveMarkTrackerAsDirty(int64 root_tracker_id,
438 leveldb::WriteBatch* batch);
439 bool CanActivateTracker(const FileTracker& tracker); 393 bool CanActivateTracker(const FileTracker& tracker);
440 bool ShouldKeepDirty(const FileTracker& tracker) const; 394 bool ShouldKeepDirty(const FileTracker& tracker) const;
441 395
442 bool HasDisabledAppRoot(const FileTracker& tracker) const; 396 bool HasDisabledAppRoot(const FileTracker& tracker) const;
443 bool HasActiveTrackerForFileID(const std::string& file_id) const; 397 bool HasActiveTrackerForFileID(const std::string& file_id) const;
444 bool HasActiveTrackerForPath(int64 parent_tracker, 398 bool HasActiveTrackerForPath(int64 parent_tracker,
445 const std::string& title) const; 399 const std::string& title) const;
446 400
447 void RemoveUnneededTrackersForMissingFile(const std::string& file_id, 401 void RemoveUnneededTrackersForMissingFile(const std::string& file_id,
448 leveldb::WriteBatch* batch); 402 leveldb::WriteBatch* batch);
449 void UpdateByFileMetadata(const tracked_objects::Location& from_where, 403 void UpdateByFileMetadata(const tracked_objects::Location& from_where,
450 scoped_ptr<FileMetadata> file, 404 scoped_ptr<FileMetadata> file,
451 UpdateOption option, 405 UpdateOption option,
452 leveldb::WriteBatch* batch); 406 leveldb::WriteBatch* batch);
453 407
454 void WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, 408 void WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch,
455 const SyncStatusCallback& callback); 409 const SyncStatusCallback& callback);
456 410
457 bool HasNewerFileMetadata(const std::string& file_id, int64 change_id); 411 bool HasNewerFileMetadata(const std::string& file_id, int64 change_id);
458 412
459 scoped_ptr<base::ListValue> DumpTrackers(); 413 scoped_ptr<base::ListValue> DumpTrackers();
460 scoped_ptr<base::ListValue> DumpMetadata(); 414 scoped_ptr<base::ListValue> DumpMetadata();
461 415
462 void StoreFileMetadata(scoped_ptr<FileMetadata> file_metadata);
463 void StoreFileTracker(scoped_ptr<FileTracker> file_tracker);
464
465 void AttachSyncRoot(const google_apis::FileResource& sync_root_folder, 416 void AttachSyncRoot(const google_apis::FileResource& sync_root_folder,
466 leveldb::WriteBatch* batch); 417 leveldb::WriteBatch* batch);
467 void AttachInitialAppRoot(const google_apis::FileResource& app_root_folder, 418 void AttachInitialAppRoot(const google_apis::FileResource& app_root_folder,
468 leveldb::WriteBatch* batch); 419 leveldb::WriteBatch* batch);
469 void InsertFileTrackerToIndex(FileTracker* tracker);
470 420
471 void ForceActivateTrackerByPath(int64 parent_tracker_id, 421 void ForceActivateTrackerByPath(int64 parent_tracker_id,
472 const std::string& title, 422 const std::string& title,
473 const std::string& file_id, 423 const std::string& file_id,
474 leveldb::WriteBatch* batch); 424 leveldb::WriteBatch* batch);
475 425
476 scoped_refptr<base::SequencedTaskRunner> task_runner_; 426 scoped_refptr<base::SequencedTaskRunner> task_runner_;
477 base::FilePath database_path_; 427 base::FilePath database_path_;
478 leveldb::Env* env_override_; 428 leveldb::Env* env_override_;
479 scoped_ptr<leveldb::DB> db_; 429 scoped_ptr<leveldb::DB> db_;
480 430
481 scoped_ptr<ServiceMetadata> service_metadata_; 431 scoped_ptr<ServiceMetadata> service_metadata_;
482 int64 largest_known_change_id_; 432 int64 largest_known_change_id_;
483 433
484 MetadataByID metadata_by_id_; // Owned. 434 scoped_ptr<MetadataDatabaseIndex> index_;
485 TrackerByID tracker_by_id_; // Owned.
486
487 // Maps FileID to trackers. The active tracker must be unique per FileID.
488 // This must be updated when updating |active| field of a tracker.
489 TrackerIDsByFileID trackers_by_file_id_; // Not owned.
490
491 // Maps AppID to the app-root tracker.
492 // This must be updated when a tracker is registered/unregistered as an
493 // app-root.
494 TrackerIDByAppID app_root_by_app_id_; // Not owned.
495
496 // Maps |tracker_id| to its children grouped by their |title|.
497 // If the title is unknown for a tracker, treats its title as empty. Empty
498 // titled file must not be active.
499 // The active tracker must be unique per its parent_tracker and its title.
500 // This must be updated when updating |title|, |active| or
501 // |parent_tracker_id|.
502 TrackerIDsByParentAndTitle trackers_by_parent_and_title_;
503
504 // Holds all trackers which marked as dirty.
505 // This must be updated when updating |dirty| field of a tracker.
506 DirtyTrackers dirty_trackers_; // Not owned.
507 DirtyTrackers low_priority_dirty_trackers_; // Not owned.
508 435
509 base::WeakPtrFactory<MetadataDatabase> weak_ptr_factory_; 436 base::WeakPtrFactory<MetadataDatabase> weak_ptr_factory_;
510 437
511 DISALLOW_COPY_AND_ASSIGN(MetadataDatabase); 438 DISALLOW_COPY_AND_ASSIGN(MetadataDatabase);
512 }; 439 };
513 440
514 } // namespace drive_backend 441 } // namespace drive_backend
515 } // namespace sync_file_system 442 } // namespace sync_file_system
516 443
517 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 444 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698