proto_database_selector.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_LEVELDB_PROTO_INTERNAL_PROTO_DATABASE_SELECTOR_H_
  5. #define COMPONENTS_LEVELDB_PROTO_INTERNAL_PROTO_DATABASE_SELECTOR_H_
  6. #include <memory>
  7. #include <string>
  8. #include "base/component_export.h"
  9. #include "base/containers/queue.h"
  10. #include "base/files/file_path.h"
  11. #include "base/task/sequenced_task_runner.h"
  12. #include "components/leveldb_proto/internal/proto_leveldb_wrapper.h"
  13. #include "components/leveldb_proto/public/shared_proto_database_client_list.h"
  14. namespace leveldb_proto {
  15. class MigrationDelegate;
  16. class SharedProtoDatabase;
  17. class SharedProtoDatabaseClient;
  18. class SharedProtoDatabaseProvider;
  19. class UniqueProtoDatabase;
  20. // A wrapper around unique and shared database client. Handles initialization of
  21. // underlying database as unique or shared as requested.
  22. // TODO: Discuss the init flow/migration path for unique/shared DB here.
  23. class COMPONENT_EXPORT(LEVELDB_PROTO) ProtoDatabaseSelector
  24. : public base::RefCountedThreadSafe<ProtoDatabaseSelector> {
  25. public:
  26. // These values are logged to UMA. Entries should not be renumbered and
  27. // numeric values should never be reused. Please keep in sync with
  28. // "ProtoDatabaseInitState" in src/tools/metrics/histograms/enums.xml.
  29. enum class ProtoDatabaseInitState {
  30. kSharedDbInitAttempted = 0,
  31. kFailureUniqueDbCorrupted = 1,
  32. kFailureNoDatabaseProvider = 2, // Deprecated.
  33. kBothUniqueAndSharedFailedOpen = 3,
  34. kSharedDbClientMissingInitFailed = 4,
  35. kSharedDbClientMissingUniqueReturned = 5,
  36. kSharedDbOpenFailed = 6,
  37. kUniqueDbMissingSharedReturned = 7,
  38. kUniqueDbOpenFailed = 8,
  39. kMigrateToSharedAttempted = 9,
  40. kMigrateToUniqueAttempted = 10,
  41. kMigratedSharedDbOpened = 11,
  42. kDeletionOfOldDataFailed = 12,
  43. kMigrateToSharedFailed = 13,
  44. kMigrateToUniqueFailed = 14,
  45. kMigrateToSharedCompleteDeletionFailed = 15,
  46. kMigrateToUniqueCompleteDeletionFailed = 16,
  47. kMigrateToSharedSuccess = 17,
  48. kMigrateToUniqueSuccess = 18,
  49. kLegacyInitCalled = 19,
  50. kSharedDbMetadataLoadFailed = 20,
  51. kSharedDbMetadataWriteFailed = 21,
  52. kSharedDbClientCorrupt = 22,
  53. kSharedDbClientSuccess = 23,
  54. kSharedLevelDbInitFailure = 24,
  55. kSharedDbClientMissing = 25,
  56. kFailureNoSharedDBProviderUniqueFailed = 26,
  57. kSuccessNoSharedDBProviderUniqueSucceeded = 27,
  58. kFailureUniqueDbMissingClearSharedFailed = 28,
  59. kDeletedSharedDbOnRepeatedFailures = 29,
  60. kDeletionOfSharedDbFailed = 30,
  61. kMaxValue = kDeletionOfSharedDbFailed,
  62. };
  63. static void RecordInitState(ProtoDatabaseInitState state);
  64. ProtoDatabaseSelector(
  65. ProtoDbType db_type,
  66. scoped_refptr<base::SequencedTaskRunner> task_runner,
  67. std::unique_ptr<SharedProtoDatabaseProvider> db_provider);
  68. void InitWithDatabase(
  69. LevelDB* database,
  70. const base::FilePath& database_dir,
  71. const leveldb_env::Options& options,
  72. scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
  73. Callbacks::InitStatusCallback callback);
  74. void InitUniqueOrShared(
  75. const std::string& client_name,
  76. base::FilePath db_dir,
  77. const leveldb_env::Options& unique_db_options,
  78. bool use_shared_db,
  79. scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
  80. Callbacks::InitStatusCallback callback);
  81. void AddTransaction(base::OnceClosure task);
  82. // DO NOT USE any of the functions below directly. They should be posted as
  83. // transaction tasks using AddTransaction().
  84. void UpdateEntries(std::unique_ptr<KeyValueVector> entries_to_save,
  85. std::unique_ptr<KeyVector> keys_to_remove,
  86. Callbacks::UpdateCallback callback);
  87. void UpdateEntriesWithRemoveFilter(
  88. std::unique_ptr<KeyValueVector> entries_to_save,
  89. const KeyFilter& delete_key_filter,
  90. Callbacks::UpdateCallback callback);
  91. void LoadEntries(typename Callbacks::LoadCallback callback);
  92. void LoadEntriesWithFilter(const KeyFilter& key_filter,
  93. const leveldb::ReadOptions& options,
  94. const std::string& target_prefix,
  95. typename Callbacks::LoadCallback callback);
  96. void LoadKeysAndEntries(
  97. typename Callbacks::LoadKeysAndEntriesCallback callback);
  98. void LoadKeysAndEntriesWithFilter(
  99. const KeyFilter& filter,
  100. const leveldb::ReadOptions& options,
  101. const std::string& target_prefix,
  102. typename Callbacks::LoadKeysAndEntriesCallback callback);
  103. void LoadKeysAndEntriesInRange(
  104. const std::string& start,
  105. const std::string& end,
  106. typename Callbacks::LoadKeysAndEntriesCallback callback);
  107. void LoadKeysAndEntriesWhile(
  108. const std::string& start,
  109. const KeyIteratorController& controller,
  110. typename Callbacks::LoadKeysAndEntriesCallback callback);
  111. void LoadKeys(Callbacks::LoadKeysCallback callback);
  112. void GetEntry(const std::string& key,
  113. typename Callbacks::GetCallback callback);
  114. void Destroy(Callbacks::DestroyCallback callback);
  115. void RemoveKeysForTesting(const KeyFilter& key_filter,
  116. const std::string& target_prefix,
  117. Callbacks::UpdateCallback callback);
  118. UniqueProtoDatabase* db_for_testing() { return db_.get(); }
  119. private:
  120. friend class base::RefCountedThreadSafe<ProtoDatabaseSelector>;
  121. template <typename T>
  122. friend class ProtoDatabaseImplTest;
  123. enum class InitStatus {
  124. NOT_STARTED,
  125. IN_PROGRESS,
  126. DONE // success or failure.
  127. };
  128. ~ProtoDatabaseSelector();
  129. void OnInitUniqueDB(std::unique_ptr<UniqueProtoDatabase> db,
  130. bool use_shared_db,
  131. Callbacks::InitStatusCallback callback,
  132. Enums::InitStatus status);
  133. void OnInitSharedDB(std::unique_ptr<UniqueProtoDatabase> unique_db,
  134. Enums::InitStatus unique_db_status,
  135. bool use_shared_db,
  136. Callbacks::InitStatusCallback callback,
  137. scoped_refptr<SharedProtoDatabase> shared_db);
  138. void OnGetSharedDBClient(std::unique_ptr<UniqueProtoDatabase> unique_db,
  139. Enums::InitStatus unique_db_status,
  140. bool use_shared_db,
  141. Callbacks::InitStatusCallback callback,
  142. std::unique_ptr<SharedProtoDatabaseClient> client,
  143. Enums::InitStatus shared_db_status);
  144. void DeleteOldDataAndMigrate(
  145. std::unique_ptr<UniqueProtoDatabase> unique_db,
  146. std::unique_ptr<SharedProtoDatabaseClient> client,
  147. bool use_shared_db,
  148. Callbacks::InitStatusCallback callback);
  149. void MaybeDoMigrationOnDeletingOld(
  150. std::unique_ptr<UniqueProtoDatabase> unique_db,
  151. std::unique_ptr<SharedProtoDatabaseClient> client,
  152. Callbacks::InitStatusCallback init_callback,
  153. bool use_shared_db,
  154. bool delete_success);
  155. void OnMigrationTransferComplete(
  156. std::unique_ptr<UniqueProtoDatabase> unique_db,
  157. std::unique_ptr<SharedProtoDatabaseClient> client,
  158. bool use_shared_db,
  159. Callbacks::InitStatusCallback callback,
  160. bool success);
  161. void OnMigrationCleanupComplete(
  162. std::unique_ptr<UniqueProtoDatabase> unique_db,
  163. std::unique_ptr<SharedProtoDatabaseClient> client,
  164. bool use_shared_db,
  165. Callbacks::InitStatusCallback callback,
  166. bool success);
  167. void OnInitDone(ProtoDatabaseInitState state);
  168. void InvokeInitUniqueDbMissingSharedCleared(
  169. std::unique_ptr<SharedProtoDatabaseClient> client,
  170. Callbacks::InitStatusCallback,
  171. bool shared_cleared);
  172. ProtoDbType db_type_;
  173. const scoped_refptr<base::SequencedTaskRunner> task_runner_;
  174. const std::unique_ptr<SharedProtoDatabaseProvider> db_provider_;
  175. const std::unique_ptr<MigrationDelegate> migration_delegate_;
  176. InitStatus init_status_ = InitStatus::NOT_STARTED;
  177. base::queue<base::OnceClosure> pending_tasks_;
  178. std::unique_ptr<UniqueProtoDatabase> db_;
  179. base::FilePath unique_database_dir_;
  180. std::string client_name_;
  181. SEQUENCE_CHECKER(sequence_checker_);
  182. };
  183. } // namespace leveldb_proto
  184. #endif // COMPONENTS_LEVELDB_PROTO_INTERNAL_PROTO_DATABASE_SELECTOR_H_