@nxtedition/rocksdb 13.5.13 → 15.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/binding.cc +55 -180
  2. package/binding.gyp +2 -2
  3. package/chained-batch.js +9 -16
  4. package/deps/rocksdb/rocksdb/BUCK +18 -1
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
  6. package/deps/rocksdb/rocksdb/Makefile +20 -9
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +90 -13
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -75
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.h +44 -36
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +184 -148
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +5 -11
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +116 -47
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +3 -6
  15. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -1
  16. package/deps/rocksdb/rocksdb/db/builder.cc +4 -2
  17. package/deps/rocksdb/rocksdb/db/c.cc +207 -0
  18. package/deps/rocksdb/rocksdb/db/c_test.c +72 -0
  19. package/deps/rocksdb/rocksdb/db/column_family.cc +3 -2
  20. package/deps/rocksdb/rocksdb/db/column_family.h +5 -0
  21. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +51 -38
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +29 -12
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +5 -10
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +566 -366
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +131 -4
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +1 -0
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +4 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +13 -14
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +12 -7
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -10
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +97 -76
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +11 -14
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +16 -3
  39. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +1 -0
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +448 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +22 -20
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +4 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -5
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +7 -3
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_iter.cc +104 -0
  47. package/deps/rocksdb/rocksdb/db/db_iter.h +4 -11
  48. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +331 -58
  49. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +129 -0
  50. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -0
  51. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +40 -0
  52. package/deps/rocksdb/rocksdb/db/db_test2.cc +25 -15
  53. package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -24
  54. package/deps/rocksdb/rocksdb/db/db_test_util.h +29 -14
  55. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +69 -36
  56. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +0 -1
  57. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  58. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -4
  59. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +8 -1
  60. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +275 -79
  61. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +23 -5
  62. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +591 -175
  63. package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -4
  64. package/deps/rocksdb/rocksdb/db/log_reader.cc +5 -2
  65. package/deps/rocksdb/rocksdb/db/memtable.cc +84 -35
  66. package/deps/rocksdb/rocksdb/db/memtable.h +39 -34
  67. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -0
  68. package/deps/rocksdb/rocksdb/db/merge_operator.cc +1 -1
  69. package/deps/rocksdb/rocksdb/db/multi_scan.cc +11 -5
  70. package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -1
  71. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
  72. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +34 -14
  73. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +28 -5
  74. package/deps/rocksdb/rocksdb/db/version_set.cc +159 -14
  75. package/deps/rocksdb/rocksdb/db/version_set.h +2 -0
  76. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -1
  77. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +60 -0
  78. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +16 -1
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +75 -10
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.cc +28 -0
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +2 -0
  82. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -1
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +50 -2
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +57 -0
  85. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +0 -4
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +266 -35
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -6
  89. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +18 -2
  90. package/deps/rocksdb/rocksdb/env/env.cc +12 -0
  91. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -0
  92. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +2 -0
  93. package/deps/rocksdb/rocksdb/env/fs_posix.cc +9 -5
  94. package/deps/rocksdb/rocksdb/env/io_posix.cc +4 -2
  95. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +19 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +33 -31
  97. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +42 -9
  98. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +93 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +43 -49
  100. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +4 -3
  101. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +8 -6
  102. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +487 -0
  103. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +11 -12
  104. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +135 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -0
  106. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +12 -0
  107. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -1
  108. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +8 -0
  109. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +12 -8
  110. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +3 -0
  111. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +19 -9
  112. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +219 -24
  113. package/deps/rocksdb/rocksdb/include/rocksdb/point_lock_bench_tool.h +14 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +2 -2
  115. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +1 -1
  116. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +7 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +16 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +16 -4
  119. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +13 -0
  120. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +0 -2
  122. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +45 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +1 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +1 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +6 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  128. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +3 -3
  129. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +77 -51
  130. package/deps/rocksdb/rocksdb/memtable/skiplist.h +10 -13
  131. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +16 -7
  132. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +9 -4
  133. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -0
  134. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -1
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  137. package/deps/rocksdb/rocksdb/options/options.cc +2 -0
  138. package/deps/rocksdb/rocksdb/options/options_helper.cc +9 -8
  139. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -5
  140. package/deps/rocksdb/rocksdb/port/mmap.cc +1 -1
  141. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -0
  142. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +4 -0
  143. package/deps/rocksdb/rocksdb/src.mk +8 -2
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1125 -765
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +35 -24
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +29 -4
  147. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +732 -256
  148. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +225 -16
  149. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -26
  150. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  151. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -75
  152. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +433 -141
  153. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -0
  154. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +17 -10
  155. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy_impl.h +20 -0
  156. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +112 -85
  157. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +191 -36
  158. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +2 -2
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  160. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +108 -31
  161. package/deps/rocksdb/rocksdb/table/external_table.cc +7 -3
  162. package/deps/rocksdb/rocksdb/table/format.cc +6 -12
  163. package/deps/rocksdb/rocksdb/table/format.h +10 -0
  164. package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
  165. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -1
  166. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -1
  167. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +5 -0
  168. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -1
  169. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +118 -46
  170. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +9 -8
  171. package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
  172. package/deps/rocksdb/rocksdb/table/table_properties.cc +16 -0
  173. package/deps/rocksdb/rocksdb/table/table_test.cc +1540 -155
  174. package/deps/rocksdb/rocksdb/test_util/testutil.h +21 -5
  175. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -5
  176. package/deps/rocksdb/rocksdb/tools/ldb.cc +1 -2
  177. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +2 -0
  178. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -3
  179. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +133 -165
  180. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +173 -64
  181. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +69 -0
  182. package/deps/rocksdb/rocksdb/util/atomic.h +6 -0
  183. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +29 -20
  184. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +10 -6
  185. package/deps/rocksdb/rocksdb/util/bit_fields.h +338 -0
  186. package/deps/rocksdb/rocksdb/util/coding.h +3 -3
  187. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -2
  188. package/deps/rocksdb/rocksdb/util/compression.cc +777 -82
  189. package/deps/rocksdb/rocksdb/util/compression.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/compression_test.cc +5 -3
  191. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +2 -2
  192. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +15 -14
  193. package/deps/rocksdb/rocksdb/util/interval_test.cc +102 -0
  194. package/deps/rocksdb/rocksdb/util/semaphore.h +164 -0
  195. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +10 -6
  196. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -2
  197. package/deps/rocksdb/rocksdb/util/slice_test.cc +136 -0
  198. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  199. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -16
  200. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -1
  201. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
  202. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +7 -4
  203. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +35 -14
  204. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +2 -0
  205. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +5 -2
  206. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/any_lock_manager_test.h +244 -0
  207. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench.cc +18 -0
  208. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench_tool.cc +159 -0
  209. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +1244 -161
  210. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +66 -12
  211. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_stress_test.cc +103 -0
  212. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +1275 -8
  213. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +40 -262
  214. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test_common.h +78 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_validation_test_runner.h +469 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -6
  217. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +4 -0
  218. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +9 -1
  219. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +18 -9
  220. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +2 -0
  221. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +2 -1
  222. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +72 -44
  223. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +92 -15
  224. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +6 -20
  225. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +143 -112
  226. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +23 -16
  227. package/index.js +18 -42
  228. package/package.json +1 -1
  229. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  230. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  231. package/util.h +38 -12
  232. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.cc +0 -17
@@ -132,8 +132,12 @@ class PointLockManager : public LockManager {
132
132
  // this column family is no longer in use.
133
133
  void RemoveColumnFamily(const ColumnFamilyHandle* cf) override;
134
134
 
135
+ // Caller makes sure that a lock on the key is not requested again, unless it
136
+ // is an upgrade or downgrade.
135
137
  Status TryLock(PessimisticTransaction* txn, ColumnFamilyId column_family_id,
136
138
  const std::string& key, Env* env, bool exclusive) override;
139
+ // Caller makes sure that a lock on the key is not requested again, unless it
140
+ // is an upgrade or downgrade.
137
141
  Status TryLock(PessimisticTransaction* txn, ColumnFamilyId column_family_id,
138
142
  const Endpoint& start, const Endpoint& end, Env* env,
139
143
  bool exclusive) override;
@@ -153,7 +157,7 @@ class PointLockManager : public LockManager {
153
157
 
154
158
  void Resize(uint32_t new_size) override;
155
159
 
156
- private:
160
+ protected:
157
161
  PessimisticTransactionDB* txn_db_impl_;
158
162
 
159
163
  // Default number of lock map stripes per column family
@@ -179,6 +183,11 @@ class PointLockManager : public LockManager {
179
183
  // to avoid acquiring a mutex in order to look up a LockMap
180
184
  std::unique_ptr<ThreadLocalPtr> lock_maps_cache_;
181
185
 
186
+ // Thread local variable for KeyLockWaiter. As one thread could only need one
187
+ // KeyLockWaiter.
188
+ // Lazy init on first time usage
189
+ ThreadLocalPtr key_lock_waiter_;
190
+
182
191
  // Must be held when modifying wait_txn_map_ and rev_wait_txn_map_.
183
192
  std::mutex wait_txn_map_mutex_;
184
193
 
@@ -196,18 +205,13 @@ class PointLockManager : public LockManager {
196
205
 
197
206
  std::shared_ptr<LockMap> GetLockMap(uint32_t column_family_id);
198
207
 
199
- Status AcquireWithTimeout(PessimisticTransaction* txn, LockMap* lock_map,
200
- LockMapStripe* stripe, uint32_t column_family_id,
201
- const std::string& key, Env* env, int64_t timeout,
202
- const LockInfo& lock_info);
208
+ virtual Status AcquireWithTimeout(
209
+ PessimisticTransaction* txn, LockMap* lock_map, LockMapStripe* stripe,
210
+ uint32_t column_family_id, const std::string& key, Env* env,
211
+ int64_t timeout, int64_t deadlock_timeout_us, const LockInfo& lock_info);
203
212
 
204
- Status AcquireLocked(LockMap* lock_map, LockMapStripe* stripe,
205
- const std::string& key, Env* env,
206
- const LockInfo& lock_info, uint64_t* wait_time,
207
- autovector<TransactionID>* txn_ids);
208
-
209
- void UnLockKey(PessimisticTransaction* txn, const std::string& key,
210
- LockMapStripe* stripe, LockMap* lock_map, Env* env);
213
+ virtual void UnLockKey(PessimisticTransaction* txn, const std::string& key,
214
+ LockMapStripe* stripe, LockMap* lock_map, Env* env);
211
215
 
212
216
  // Returns true if a deadlock is detected.
213
217
  // Will DecrementWaiters() if a deadlock is detected.
@@ -219,6 +223,56 @@ class PointLockManager : public LockManager {
219
223
  const autovector<TransactionID>& wait_ids);
220
224
  void DecrementWaitersImpl(const PessimisticTransaction* txn,
221
225
  const autovector<TransactionID>& wait_ids);
226
+
227
+ private:
228
+ Status AcquireLocked(LockMap* lock_map, LockMapStripe* stripe,
229
+ const std::string& key, Env* env,
230
+ const LockInfo& lock_info, uint64_t* wait_time,
231
+ autovector<TransactionID>* txn_ids);
232
+ };
233
+
234
+ class PerKeyPointLockManager : public PointLockManager {
235
+ public:
236
+ PerKeyPointLockManager(PessimisticTransactionDB* db,
237
+ const TransactionDBOptions& opt);
238
+ // No copying allowed
239
+ PerKeyPointLockManager(const PerKeyPointLockManager&) = delete;
240
+ PerKeyPointLockManager& operator=(const PerKeyPointLockManager&) = delete;
241
+ // No move allowed
242
+ PerKeyPointLockManager(PerKeyPointLockManager&&) = delete;
243
+ PerKeyPointLockManager& operator=(PerKeyPointLockManager&&) = delete;
244
+
245
+ ~PerKeyPointLockManager() override {}
246
+
247
+ void UnLock(PessimisticTransaction* txn, const LockTracker& tracker,
248
+ Env* env) override;
249
+ void UnLock(PessimisticTransaction* txn, ColumnFamilyId column_family_id,
250
+ const std::string& key, Env* env) override;
251
+ void UnLock(PessimisticTransaction* txn, ColumnFamilyId column_family_id,
252
+ const Endpoint& start, const Endpoint& end, Env* env) override;
253
+
254
+ void UnLockKey(PessimisticTransaction* txn, const std::string& key,
255
+ LockMapStripe* stripe, LockMap* lock_map, Env* env) override;
256
+
257
+ protected:
258
+ Status AcquireWithTimeout(PessimisticTransaction* txn, LockMap* lock_map,
259
+ LockMapStripe* stripe, uint32_t column_family_id,
260
+ const std::string& key, Env* env, int64_t timeout,
261
+ int64_t deadlock_timeout_us,
262
+ const LockInfo& lock_info) override;
263
+
264
+ private:
265
+ Status AcquireLocked(LockMap* lock_map, LockMapStripe* stripe,
266
+ const std::string& key, Env* env,
267
+ const LockInfo& txn_lock_info, uint64_t* wait_time,
268
+ autovector<TransactionID>* txn_ids,
269
+ LockInfo** lock_info_ptr, bool* isUpgrade, bool fifo);
270
+
271
+ int64_t CalculateWaitEndTime(int64_t expire_time_hint, int64_t end_time);
272
+
273
+ Status FillWaitIds(LockInfo& lock_info, const LockInfo& txn_lock_info,
274
+ autovector<TransactionID>* wait_ids, bool& isUpgrade,
275
+ TransactionID& my_txn_id, const std::string& key);
222
276
  };
223
277
 
224
278
  } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,103 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #include "utilities/transactions/lock/point/point_lock_manager_test.h"
8
+ #include "utilities/transactions/lock/point/point_lock_validation_test_runner.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+
12
+ struct PointLockCorrectnessCheckTestParam {
13
+ bool is_per_key_point_lock_manager;
14
+ uint32_t thread_count;
15
+ uint32_t key_count;
16
+ uint32_t max_num_keys_to_lock_per_txn;
17
+ uint32_t execution_time_sec;
18
+ LockTypeToTest lock_type;
19
+ int64_t lock_timeout_us;
20
+ int64_t lock_expiration_us;
21
+ bool allow_non_deadlock_error;
22
+ // to simulate some useful work
23
+ uint32_t max_sleep_after_lock_acquisition_ms;
24
+ };
25
+
26
+ class PointLockCorrectnessCheckTest
27
+ : public PointLockManagerTest,
28
+ public testing::WithParamInterface<PointLockCorrectnessCheckTestParam> {
29
+ public:
30
+ void SetUp() override {
31
+ init();
32
+ auto const& param = GetParam();
33
+ auto per_key_lock_manager = param.is_per_key_point_lock_manager;
34
+ if (per_key_lock_manager) {
35
+ locker_ = std::make_shared<PerKeyPointLockManager>(
36
+ static_cast<PessimisticTransactionDB*>(db_), txndb_opt_);
37
+ } else {
38
+ locker_ = std::make_shared<PointLockManager>(
39
+ static_cast<PessimisticTransactionDB*>(db_), txndb_opt_);
40
+ }
41
+
42
+ txn_opt_.deadlock_detect = true;
43
+ txn_opt_.lock_timeout = param.lock_timeout_us;
44
+ txn_opt_.expiration = param.lock_expiration_us;
45
+ }
46
+
47
+ protected:
48
+ TransactionOptions txn_opt_;
49
+ };
50
+
51
+ TEST_P(PointLockCorrectnessCheckTest, LockCorrectnessValidation) {
52
+ auto const& param = GetParam();
53
+ PointLockValidationTestRunner test_runner(
54
+ env_, txndb_opt_, locker_, db_, txn_opt_, param.thread_count,
55
+ param.key_count, param.max_num_keys_to_lock_per_txn,
56
+ param.execution_time_sec, static_cast<LockTypeToTest>(param.lock_type),
57
+ param.allow_non_deadlock_error,
58
+ param.max_sleep_after_lock_acquisition_ms);
59
+ test_runner.run();
60
+ }
61
+
62
+ constexpr auto X_S_LOCK = LockTypeToTest::EXCLUSIVE_AND_SHARED;
63
+ constexpr auto X_LOCK = LockTypeToTest::EXCLUSIVE_ONLY;
64
+ constexpr auto S_LOCK = LockTypeToTest::SHARED_ONLY;
65
+
66
+ INSTANTIATE_TEST_CASE_P(
67
+ PointLockCorrectnessCheckTestSuite, PointLockCorrectnessCheckTest,
68
+ ::testing::ValuesIn(std::vector<PointLockCorrectnessCheckTestParam>{
69
+ // 2 second timeout and no expiration simulates myrocks default
70
+ // configuration
71
+ {true, 16, 16, 8, 10, X_S_LOCK, 2000, -1, true, 0},
72
+ {false, 16, 16, 8, 10, X_S_LOCK, 2000, -1, true, 0},
73
+ {true, 16, 16, 8, 10, X_LOCK, 2000, -1, true, 0},
74
+ {false, 16, 16, 8, 10, X_LOCK, 2000, -1, true, 0},
75
+ {true, 16, 16, 8, 10, S_LOCK, 2000, -1, true, 0},
76
+ {false, 16, 16, 8, 10, S_LOCK, 2000, -1, true, 0},
77
+ // short timeout and expiration to test lock stealing
78
+ {true, 16, 16, 8, 10, X_S_LOCK, 10, 10, true, 10},
79
+ {false, 16, 16, 8, 10, X_S_LOCK, 10, 10, true, 10},
80
+ {true, 16, 16, 8, 10, X_LOCK, 10, 10, true, 10},
81
+ {false, 16, 16, 8, 10, X_LOCK, 10, 10, true, 10},
82
+ {true, 16, 16, 8, 10, S_LOCK, 10, 10, true, 10},
83
+ {false, 16, 16, 8, 10, S_LOCK, 10, 10, true, 10},
84
+ // long timeout and expiration to test deadlock detection without
85
+ // timeout
86
+ {true, 16, 16, 8, 10, X_S_LOCK, 100000, 100000, false, 0},
87
+ {false, 16, 16, 8, 10, X_S_LOCK, 100000, 100000, false, 0},
88
+ {true, 16, 16, 8, 10, X_LOCK, 100000, 100000, false, 0},
89
+ {false, 16, 16, 8, 10, X_LOCK, 100000, 100000, false, 0},
90
+ {true, 16, 16, 8, 10, S_LOCK, 100000, 100000, false, 0},
91
+ {false, 16, 16, 8, 10, S_LOCK, 100000, 100000, false, 0},
92
+ // Low lock contention
93
+ {true, 4, 1024 * 1024, 2, 10, S_LOCK, 100000, 100000, false, 0},
94
+ {false, 4, 1024 * 1024, 2, 10, S_LOCK, 100000, 100000, false, 0},
95
+ }));
96
+
97
+ } // namespace ROCKSDB_NAMESPACE
98
+
99
+ int main(int argc, char** argv) {
100
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
101
+ ::testing::InitGoogleTest(&argc, argv);
102
+ return RUN_ALL_TESTS();
103
+ }