| 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 #ifndef SYNC_SYNCABLE_DIRECTORY_H_ | 5 #ifndef COMPONENTS_SYNC_SYNCABLE_DIRECTORY_H_ |
| 6 #define SYNC_SYNCABLE_DIRECTORY_H_ | 6 #define COMPONENTS_SYNC_SYNCABLE_DIRECTORY_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <deque> | 11 #include <deque> |
| 12 #include <set> | 12 #include <set> |
| 13 #include <string> | 13 #include <string> |
| 14 #include <unordered_map> | 14 #include <unordered_map> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/callback.h" | 17 #include "base/callback.h" |
| 18 #include "base/containers/hash_tables.h" | 18 #include "base/containers/hash_tables.h" |
| 19 #include "base/files/file_util.h" | 19 #include "base/files/file_util.h" |
| 20 #include "base/gtest_prod_util.h" | 20 #include "base/gtest_prod_util.h" |
| 21 #include "base/macros.h" | 21 #include "base/macros.h" |
| 22 #include "base/values.h" | 22 #include "base/values.h" |
| 23 #include "sync/api/attachments/attachment_id.h" | 23 #include "components/sync/api/attachments/attachment_id.h" |
| 24 #include "sync/base/sync_export.h" | 24 #include "components/sync/base/sync_export.h" |
| 25 #include "sync/internal_api/public/util/weak_handle.h" | 25 #include "components/sync/base/weak_handle.h" |
| 26 #include "sync/syncable/dir_open_result.h" | 26 #include "components/sync/syncable/dir_open_result.h" |
| 27 #include "sync/syncable/entry.h" | 27 #include "components/sync/syncable/entry.h" |
| 28 #include "sync/syncable/entry_kernel.h" | 28 #include "components/sync/syncable/entry_kernel.h" |
| 29 #include "sync/syncable/metahandle_set.h" | 29 #include "components/sync/syncable/metahandle_set.h" |
| 30 #include "sync/syncable/parent_child_index.h" | 30 #include "components/sync/syncable/parent_child_index.h" |
| 31 #include "sync/syncable/syncable_delete_journal.h" | 31 #include "components/sync/syncable/syncable_delete_journal.h" |
| 32 | 32 |
| 33 namespace syncer { | 33 namespace syncer { |
| 34 | 34 |
| 35 class Cryptographer; | 35 class Cryptographer; |
| 36 class TestUserShare; | 36 class TestUserShare; |
| 37 class UnrecoverableErrorHandler; | 37 class UnrecoverableErrorHandler; |
| 38 | 38 |
| 39 namespace syncable { | 39 namespace syncable { |
| 40 | 40 |
| 41 class BaseTransaction; | 41 class BaseTransaction; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 // The per-datatype context. | 113 // The per-datatype context. |
| 114 sync_pb::DataTypeContext datatype_context[MODEL_TYPE_COUNT]; | 114 sync_pb::DataTypeContext datatype_context[MODEL_TYPE_COUNT]; |
| 115 }; | 115 }; |
| 116 | 116 |
| 117 // What the Directory needs on initialization to create itself and its Kernel. | 117 // What the Directory needs on initialization to create itself and its Kernel. |
| 118 // Filled by DirectoryBackingStore::Load. | 118 // Filled by DirectoryBackingStore::Load. |
| 119 struct KernelLoadInfo { | 119 struct KernelLoadInfo { |
| 120 PersistedKernelInfo kernel_info; | 120 PersistedKernelInfo kernel_info; |
| 121 std::string cache_guid; // Created on first initialization, never changes. | 121 std::string cache_guid; // Created on first initialization, never changes. |
| 122 int64_t max_metahandle; // Computed (using sql MAX aggregate) on init. | 122 int64_t max_metahandle; // Computed (using sql MAX aggregate) on init. |
| 123 KernelLoadInfo() : max_metahandle(0) { | 123 KernelLoadInfo() : max_metahandle(0) {} |
| 124 } | |
| 125 }; | 124 }; |
| 126 | 125 |
| 127 // When the Directory is told to SaveChanges, a SaveChangesSnapshot is | 126 // When the Directory is told to SaveChanges, a SaveChangesSnapshot is |
| 128 // constructed and forms a consistent snapshot of what needs to be sent to | 127 // constructed and forms a consistent snapshot of what needs to be sent to |
| 129 // the backing store. | 128 // the backing store. |
| 130 struct SYNC_EXPORT SaveChangesSnapshot { | 129 struct SYNC_EXPORT SaveChangesSnapshot { |
| 131 SaveChangesSnapshot(); | 130 SaveChangesSnapshot(); |
| 132 ~SaveChangesSnapshot(); | 131 ~SaveChangesSnapshot(); |
| 133 | 132 |
| 134 // Returns true if this snapshot has any unsaved metahandle changes. | 133 // Returns true if this snapshot has any unsaved metahandle changes. |
| 135 bool HasUnsavedMetahandleChanges() const; | 134 bool HasUnsavedMetahandleChanges() const; |
| 136 | 135 |
| 137 KernelShareInfoStatus kernel_info_status; | 136 KernelShareInfoStatus kernel_info_status; |
| 138 PersistedKernelInfo kernel_info; | 137 PersistedKernelInfo kernel_info; |
| 139 EntryKernelSet dirty_metas; | 138 EntryKernelSet dirty_metas; |
| 140 MetahandleSet metahandles_to_purge; | 139 MetahandleSet metahandles_to_purge; |
| 141 EntryKernelSet delete_journals; | 140 EntryKernelSet delete_journals; |
| 142 MetahandleSet delete_journals_to_purge; | 141 MetahandleSet delete_journals_to_purge; |
| 143 }; | 142 }; |
| 144 | 143 |
| 145 struct Kernel { | 144 struct Kernel { |
| 146 // |delegate| must not be NULL. |transaction_observer| must be | 145 // |delegate| must not be NULL. |transaction_observer| must be |
| 147 // initialized. | 146 // initialized. |
| 148 Kernel(const std::string& name, const KernelLoadInfo& info, | 147 Kernel(const std::string& name, |
| 148 const KernelLoadInfo& info, |
| 149 DirectoryChangeDelegate* delegate, | 149 DirectoryChangeDelegate* delegate, |
| 150 const WeakHandle<TransactionObserver>& transaction_observer); | 150 const WeakHandle<TransactionObserver>& transaction_observer); |
| 151 | 151 |
| 152 ~Kernel(); | 152 ~Kernel(); |
| 153 | 153 |
| 154 // Implements ReadTransaction / WriteTransaction using a simple lock. | 154 // Implements ReadTransaction / WriteTransaction using a simple lock. |
| 155 base::Lock transaction_mutex; | 155 base::Lock transaction_mutex; |
| 156 | 156 |
| 157 // Protected by transaction_mutex. Used by WriteTransactions. | 157 // Protected by transaction_mutex. Used by WriteTransactions. |
| 158 int64_t next_write_transaction_id; | 158 int64_t next_write_transaction_id; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 const WeakHandle<UnrecoverableErrorHandler>& unrecoverable_error_handler, | 249 const WeakHandle<UnrecoverableErrorHandler>& unrecoverable_error_handler, |
| 250 const base::Closure& report_unrecoverable_error_function, | 250 const base::Closure& report_unrecoverable_error_function, |
| 251 NigoriHandler* nigori_handler, | 251 NigoriHandler* nigori_handler, |
| 252 Cryptographer* cryptographer); | 252 Cryptographer* cryptographer); |
| 253 virtual ~Directory(); | 253 virtual ~Directory(); |
| 254 | 254 |
| 255 // Does not take ownership of |delegate|, which must not be NULL. | 255 // Does not take ownership of |delegate|, which must not be NULL. |
| 256 // Starts sending events to |delegate| if the returned result is | 256 // Starts sending events to |delegate| if the returned result is |
| 257 // OPENED. Note that events to |delegate| may be sent from *any* | 257 // OPENED. Note that events to |delegate| may be sent from *any* |
| 258 // thread. |transaction_observer| must be initialized. | 258 // thread. |transaction_observer| must be initialized. |
| 259 DirOpenResult Open(const std::string& name, | 259 DirOpenResult Open( |
| 260 DirectoryChangeDelegate* delegate, | 260 const std::string& name, |
| 261 const WeakHandle<TransactionObserver>& | 261 DirectoryChangeDelegate* delegate, |
| 262 transaction_observer); | 262 const WeakHandle<TransactionObserver>& transaction_observer); |
| 263 | 263 |
| 264 int64_t NextMetahandle(); | 264 int64_t NextMetahandle(); |
| 265 // Generates next client ID based on a randomly generated GUID. | 265 // Generates next client ID based on a randomly generated GUID. |
| 266 syncable::Id NextId(); | 266 syncable::Id NextId(); |
| 267 | 267 |
| 268 bool good() const { return NULL != kernel_; } | 268 bool good() const { return NULL != kernel_; } |
| 269 | 269 |
| 270 // The download progress is an opaque token provided by the sync server | 270 // The download progress is an opaque token provided by the sync server |
| 271 // to indicate the continuation state of the next GetUpdates operation. | 271 // to indicate the continuation state of the next GetUpdates operation. |
| 272 void GetDownloadProgress( | 272 void GetDownloadProgress(ModelType type, |
| 273 ModelType type, | 273 sync_pb::DataTypeProgressMarker* value_out) const; |
| 274 sync_pb::DataTypeProgressMarker* value_out) const; | 274 void GetDownloadProgressAsString(ModelType type, |
| 275 void GetDownloadProgressAsString( | 275 std::string* value_out) const; |
| 276 ModelType type, | 276 void SetDownloadProgress(ModelType type, |
| 277 std::string* value_out) const; | 277 const sync_pb::DataTypeProgressMarker& value); |
| 278 void SetDownloadProgress( | |
| 279 ModelType type, | |
| 280 const sync_pb::DataTypeProgressMarker& value); | |
| 281 bool HasEmptyDownloadProgress(ModelType type) const; | 278 bool HasEmptyDownloadProgress(ModelType type) const; |
| 282 | 279 |
| 283 // Gets the total number of entries in the directory. | 280 // Gets the total number of entries in the directory. |
| 284 size_t GetEntriesCount() const; | 281 size_t GetEntriesCount() const; |
| 285 | 282 |
| 286 // Gets/Increments transaction version of a model type. Must be called when | 283 // Gets/Increments transaction version of a model type. Must be called when |
| 287 // holding kernel mutex. | 284 // holding kernel mutex. |
| 288 int64_t GetTransactionVersion(ModelType type) const; | 285 int64_t GetTransactionVersion(ModelType type) const; |
| 289 void IncrementTransactionVersion(ModelType type); | 286 void IncrementTransactionVersion(ModelType type); |
| 290 | 287 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 Cryptographer* GetCryptographer(const BaseTransaction* trans); | 326 Cryptographer* GetCryptographer(const BaseTransaction* trans); |
| 330 | 327 |
| 331 // Called to immediately report an unrecoverable error (but don't | 328 // Called to immediately report an unrecoverable error (but don't |
| 332 // propagate it up). | 329 // propagate it up). |
| 333 void ReportUnrecoverableError(); | 330 void ReportUnrecoverableError(); |
| 334 | 331 |
| 335 // Called to set the unrecoverable error on the directory and to propagate | 332 // Called to set the unrecoverable error on the directory and to propagate |
| 336 // the error to upper layers. | 333 // the error to upper layers. |
| 337 void OnUnrecoverableError(const BaseTransaction* trans, | 334 void OnUnrecoverableError(const BaseTransaction* trans, |
| 338 const tracked_objects::Location& location, | 335 const tracked_objects::Location& location, |
| 339 const std::string & message); | 336 const std::string& message); |
| 340 | 337 |
| 341 DeleteJournal* delete_journal(); | 338 DeleteJournal* delete_journal(); |
| 342 | 339 |
| 343 // Returns the child meta handles (even those for deleted/unlinked | 340 // Returns the child meta handles (even those for deleted/unlinked |
| 344 // nodes) for given parent id. Clears |result| if there are no | 341 // nodes) for given parent id. Clears |result| if there are no |
| 345 // children. | 342 // children. |
| 346 bool GetChildHandlesById(BaseTransaction*, const Id& parent_id, | 343 bool GetChildHandlesById(BaseTransaction*, |
| 347 Metahandles* result); | 344 const Id& parent_id, |
| 345 Metahandles* result); |
| 348 | 346 |
| 349 // Counts all items under the given node, including the node itself. | 347 // Counts all items under the given node, including the node itself. |
| 350 int GetTotalNodeCount(BaseTransaction*, EntryKernel* kernel_) const; | 348 int GetTotalNodeCount(BaseTransaction*, EntryKernel* kernel_) const; |
| 351 | 349 |
| 352 // Returns this item's position within its parent folder. | 350 // Returns this item's position within its parent folder. |
| 353 // The left-most item is 0, second left-most is 1, etc. | 351 // The left-most item is 0, second left-most is 1, etc. |
| 354 int GetPositionIndex(BaseTransaction*, EntryKernel* kernel_) const; | 352 int GetPositionIndex(BaseTransaction*, EntryKernel* kernel_) const; |
| 355 | 353 |
| 356 // Returns true iff |id| has children. | 354 // Returns true iff |id| has children. |
| 357 bool HasChildren(BaseTransaction* trans, const Id& id); | 355 bool HasChildren(BaseTransaction* trans, const Id& id); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 // | 389 // |
| 392 // WARNING: THIS METHOD PERFORMS SYNCHRONOUS I/O VIA SQLITE. | 390 // WARNING: THIS METHOD PERFORMS SYNCHRONOUS I/O VIA SQLITE. |
| 393 bool SaveChanges(); | 391 bool SaveChanges(); |
| 394 | 392 |
| 395 // Returns the number of entities with the unsynced bit set. | 393 // Returns the number of entities with the unsynced bit set. |
| 396 int64_t unsynced_entity_count() const; | 394 int64_t unsynced_entity_count() const; |
| 397 | 395 |
| 398 // Get GetUnsyncedMetaHandles should only be called after SaveChanges and | 396 // Get GetUnsyncedMetaHandles should only be called after SaveChanges and |
| 399 // before any new entries have been created. The intention is that the | 397 // before any new entries have been created. The intention is that the |
| 400 // syncer should call it from its PerformSyncQueries member. | 398 // syncer should call it from its PerformSyncQueries member. |
| 401 void GetUnsyncedMetaHandles(BaseTransaction* trans, | 399 void GetUnsyncedMetaHandles(BaseTransaction* trans, Metahandles* result); |
| 402 Metahandles* result); | |
| 403 | 400 |
| 404 // Returns whether or not this |type| has unapplied updates. | 401 // Returns whether or not this |type| has unapplied updates. |
| 405 bool TypeHasUnappliedUpdates(ModelType type); | 402 bool TypeHasUnappliedUpdates(ModelType type); |
| 406 | 403 |
| 407 // Get all the metahandles for unapplied updates for a given set of | 404 // Get all the metahandles for unapplied updates for a given set of |
| 408 // server types. | 405 // server types. |
| 409 void GetUnappliedUpdateMetaHandles(BaseTransaction* trans, | 406 void GetUnappliedUpdateMetaHandles(BaseTransaction* trans, |
| 410 FullModelTypeSet server_types, | 407 FullModelTypeSet server_types, |
| 411 std::vector<int64_t>* result); | 408 std::vector<int64_t>* result); |
| 412 | 409 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 425 // Returns a ListValue serialization of all nodes for the given type. | 422 // Returns a ListValue serialization of all nodes for the given type. |
| 426 std::unique_ptr<base::ListValue> GetNodeDetailsForType(BaseTransaction* trans, | 423 std::unique_ptr<base::ListValue> GetNodeDetailsForType(BaseTransaction* trans, |
| 427 ModelType type); | 424 ModelType type); |
| 428 | 425 |
| 429 // Sets the level of invariant checking performed after transactions. | 426 // Sets the level of invariant checking performed after transactions. |
| 430 void SetInvariantCheckLevel(InvariantCheckLevel check_level); | 427 void SetInvariantCheckLevel(InvariantCheckLevel check_level); |
| 431 | 428 |
| 432 // Checks tree metadata consistency following a transaction. It is intended | 429 // Checks tree metadata consistency following a transaction. It is intended |
| 433 // to provide a reasonable tradeoff between performance and comprehensiveness | 430 // to provide a reasonable tradeoff between performance and comprehensiveness |
| 434 // and may be used in release code. | 431 // and may be used in release code. |
| 435 bool CheckInvariantsOnTransactionClose( | 432 bool CheckInvariantsOnTransactionClose(syncable::BaseTransaction* trans, |
| 436 syncable::BaseTransaction* trans, | 433 const MetahandleSet& modified_handles); |
| 437 const MetahandleSet& modified_handles); | |
| 438 | 434 |
| 439 // Forces a full check of the directory. This operation may be slow and | 435 // Forces a full check of the directory. This operation may be slow and |
| 440 // should not be invoked outside of tests. | 436 // should not be invoked outside of tests. |
| 441 bool FullyCheckTreeInvariants(BaseTransaction *trans); | 437 bool FullyCheckTreeInvariants(BaseTransaction* trans); |
| 442 | 438 |
| 443 // Purges data associated with any entries whose ModelType or ServerModelType | 439 // Purges data associated with any entries whose ModelType or ServerModelType |
| 444 // is found in |disabled_types|, from sync directory _both_ in memory and on | 440 // is found in |disabled_types|, from sync directory _both_ in memory and on |
| 445 // disk. Only valid, "real" model types are allowed in |disabled_types| (see | 441 // disk. Only valid, "real" model types are allowed in |disabled_types| (see |
| 446 // model_type.h for definitions). | 442 // model_type.h for definitions). |
| 447 // 1. Data associated with |types_to_journal| is saved in the delete journal | 443 // 1. Data associated with |types_to_journal| is saved in the delete journal |
| 448 // to help prevent back-from-dead problem due to offline delete in the next | 444 // to help prevent back-from-dead problem due to offline delete in the next |
| 449 // sync session. |types_to_journal| must be a subset of |disabled_types|. | 445 // sync session. |types_to_journal| must be a subset of |disabled_types|. |
| 450 // 2. Data associated with |types_to_unapply| is reset to an "unapplied" | 446 // 2. Data associated with |types_to_unapply| is reset to an "unapplied" |
| 451 // state, wherein all local data is deleted and IS_UNAPPLIED is set to true. | 447 // state, wherein all local data is deleted and IS_UNAPPLIED is set to true. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 void UpdateAttachmentIndex(const int64_t metahandle, | 497 void UpdateAttachmentIndex(const int64_t metahandle, |
| 502 const sync_pb::AttachmentMetadata& old_metadata, | 498 const sync_pb::AttachmentMetadata& old_metadata, |
| 503 const sync_pb::AttachmentMetadata& new_metadata); | 499 const sync_pb::AttachmentMetadata& new_metadata); |
| 504 | 500 |
| 505 virtual EntryKernel* GetEntryById(const Id& id); | 501 virtual EntryKernel* GetEntryById(const Id& id); |
| 506 virtual EntryKernel* GetEntryByClientTag(const std::string& tag); | 502 virtual EntryKernel* GetEntryByClientTag(const std::string& tag); |
| 507 EntryKernel* GetEntryByServerTag(const std::string& tag); | 503 EntryKernel* GetEntryByServerTag(const std::string& tag); |
| 508 | 504 |
| 509 virtual EntryKernel* GetEntryByHandle(int64_t handle); | 505 virtual EntryKernel* GetEntryByHandle(int64_t handle); |
| 510 | 506 |
| 511 bool ReindexId(BaseWriteTransaction* trans, EntryKernel* const entry, | 507 bool ReindexId(BaseWriteTransaction* trans, |
| 508 EntryKernel* const entry, |
| 512 const Id& new_id); | 509 const Id& new_id); |
| 513 | 510 |
| 514 bool ReindexParentId(BaseWriteTransaction* trans, EntryKernel* const entry, | 511 bool ReindexParentId(BaseWriteTransaction* trans, |
| 512 EntryKernel* const entry, |
| 515 const Id& new_parent_id); | 513 const Id& new_parent_id); |
| 516 | 514 |
| 517 // Accessors for the underlying Kernel. Although these are public methods, the | 515 // Accessors for the underlying Kernel. Although these are public methods, the |
| 518 // number of classes that call these should be limited. | 516 // number of classes that call these should be limited. |
| 519 Kernel* kernel(); | 517 Kernel* kernel(); |
| 520 const Kernel* kernel() const; | 518 const Kernel* kernel() const; |
| 521 | 519 |
| 522 private: | 520 private: |
| 523 friend class SyncableDirectoryTest; | 521 friend class SyncableDirectoryTest; |
| 524 friend class syncer::TestUserShare; | 522 friend class syncer::TestUserShare; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 std::unique_ptr<DeleteJournal> delete_journal_; | 650 std::unique_ptr<DeleteJournal> delete_journal_; |
| 653 | 651 |
| 654 base::WeakPtrFactory<Directory> weak_ptr_factory_; | 652 base::WeakPtrFactory<Directory> weak_ptr_factory_; |
| 655 | 653 |
| 656 DISALLOW_COPY_AND_ASSIGN(Directory); | 654 DISALLOW_COPY_AND_ASSIGN(Directory); |
| 657 }; | 655 }; |
| 658 | 656 |
| 659 } // namespace syncable | 657 } // namespace syncable |
| 660 } // namespace syncer | 658 } // namespace syncer |
| 661 | 659 |
| 662 #endif // SYNC_SYNCABLE_DIRECTORY_H_ | 660 #endif // COMPONENTS_SYNC_SYNCABLE_DIRECTORY_H_ |
| OLD | NEW |