@nxtedition/rocksdb 8.2.8 → 9.0.0

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 (359) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -1
  2. package/deps/rocksdb/rocksdb/Makefile +22 -19
  3. package/deps/rocksdb/rocksdb/TARGETS +8 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +157 -61
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +43 -92
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +632 -455
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +244 -149
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +41 -13
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +11 -1
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +216 -17
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +279 -199
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +2 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +159 -8
  15. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +28 -2
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +1 -1
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -0
  18. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  19. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +3 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -21
  25. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  27. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  28. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  29. package/deps/rocksdb/rocksdb/db/builder.cc +32 -7
  30. package/deps/rocksdb/rocksdb/db/c.cc +169 -6
  31. package/deps/rocksdb/rocksdb/db/c_test.c +104 -6
  32. package/deps/rocksdb/rocksdb/db/column_family.cc +98 -47
  33. package/deps/rocksdb/rocksdb/db/column_family.h +25 -2
  34. package/deps/rocksdb/rocksdb/db/column_family_test.cc +213 -2
  35. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +93 -23
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +33 -9
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +107 -43
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -4
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +25 -17
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +13 -4
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +24 -31
  50. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +19 -19
  52. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -1
  53. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  54. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  55. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  56. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  57. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -3
  58. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -0
  59. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +15 -15
  60. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +666 -44
  61. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  62. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +274 -1
  63. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -19
  64. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +250 -116
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +51 -23
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +354 -96
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -3
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -21
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +26 -13
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -5
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +61 -21
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -87
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +7 -1
  77. package/deps/rocksdb/rocksdb/db/db_iter.cc +2 -2
  78. package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
  79. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  80. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +6 -6
  81. package/deps/rocksdb/rocksdb/db/db_options_test.cc +39 -29
  82. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  83. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +106 -0
  84. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +12 -3
  85. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  86. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  87. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +279 -166
  88. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -21
  89. package/deps/rocksdb/rocksdb/db/db_test2.cc +81 -12
  90. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  91. package/deps/rocksdb/rocksdb/db/db_test_util.h +40 -0
  92. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +13 -1
  93. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +233 -0
  94. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +143 -0
  95. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  96. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  97. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  98. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  99. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  100. package/deps/rocksdb/rocksdb/db/error_handler.cc +16 -0
  101. package/deps/rocksdb/rocksdb/db/error_handler.h +6 -3
  102. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  103. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  104. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  105. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -4
  108. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +101 -11
  111. package/deps/rocksdb/rocksdb/db/flush_job.h +24 -1
  112. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +88 -11
  113. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  114. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  115. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  116. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  117. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  118. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  119. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  120. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  121. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  122. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  123. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  124. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -3
  125. package/deps/rocksdb/rocksdb/db/memtable.cc +52 -13
  126. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  127. package/deps/rocksdb/rocksdb/db/memtable_list.cc +44 -10
  128. package/deps/rocksdb/rocksdb/db/memtable_list.h +32 -1
  129. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +90 -4
  130. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -2
  131. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  132. package/deps/rocksdb/rocksdb/db/repair.cc +21 -4
  133. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  134. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -4
  135. package/deps/rocksdb/rocksdb/db/table_cache.cc +44 -35
  136. package/deps/rocksdb/rocksdb/db/table_cache.h +6 -6
  137. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  138. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  139. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  140. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  141. package/deps/rocksdb/rocksdb/db/version_edit.h +48 -6
  142. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  143. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  144. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  145. package/deps/rocksdb/rocksdb/db/version_set.cc +136 -41
  146. package/deps/rocksdb/rocksdb/db/version_set.h +28 -7
  147. package/deps/rocksdb/rocksdb/db/version_set_test.cc +25 -15
  148. package/deps/rocksdb/rocksdb/db/write_batch.cc +11 -0
  149. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  150. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  151. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +22 -3
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +2 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +32 -3
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -0
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -120
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +9 -4
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +13 -6
  159. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  160. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +15 -27
  161. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +264 -69
  162. package/deps/rocksdb/rocksdb/env/env.cc +1 -2
  163. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  164. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  165. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  166. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  167. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  168. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +78 -0
  169. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  170. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  171. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  172. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +52 -43
  173. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +34 -18
  174. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  175. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  176. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +724 -79
  177. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +64 -33
  178. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  179. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  180. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +2 -1
  182. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +153 -88
  183. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +70 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +50 -11
  185. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  186. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +16 -2
  187. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  188. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +55 -8
  189. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +32 -4
  190. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  191. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +90 -13
  192. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +85 -17
  194. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +13 -1
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +21 -2
  198. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +6 -0
  200. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +5 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  202. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  203. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +33 -2
  204. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  205. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  206. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -0
  207. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  208. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -1
  209. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  210. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +16 -1
  211. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +10 -0
  212. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  213. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  214. package/deps/rocksdb/rocksdb/options/customizable_test.cc +2 -1
  215. package/deps/rocksdb/rocksdb/options/db_options.cc +7 -0
  216. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  217. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  218. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  219. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -3
  220. package/deps/rocksdb/rocksdb/options/options_test.cc +8 -0
  221. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  222. package/deps/rocksdb/rocksdb/port/stack_trace.cc +27 -12
  223. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  224. package/deps/rocksdb/rocksdb/src.mk +3 -0
  225. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  226. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  227. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  228. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +115 -42
  229. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -5
  230. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +60 -2
  231. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +2 -0
  232. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +62 -44
  233. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +36 -14
  234. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -15
  235. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  236. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  237. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  238. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -21
  239. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +11 -4
  240. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +195 -55
  241. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  242. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  243. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  244. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  245. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  246. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +27 -12
  247. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  248. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  249. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -2
  250. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +9 -6
  251. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  252. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  253. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +11 -11
  254. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -0
  255. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  256. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  257. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  258. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  259. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  260. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  261. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -2
  262. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  263. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  264. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  265. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  266. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  267. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  268. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  269. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +12 -3
  270. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +26 -1
  271. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  272. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  273. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  274. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  275. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  276. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  277. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  278. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +65 -26
  279. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
  280. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  281. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  282. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +0 -1
  283. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  284. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  285. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  286. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  287. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  288. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  289. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  290. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  291. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  292. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  293. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  294. package/deps/rocksdb/rocksdb/util/cast_util.h +14 -0
  295. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  296. package/deps/rocksdb/rocksdb/util/comparator.cc +29 -7
  297. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  298. package/deps/rocksdb/rocksdb/util/compression.h +110 -32
  299. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  300. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  301. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  302. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  303. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  304. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  305. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  306. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  307. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  308. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  309. package/deps/rocksdb/rocksdb/util/thread_operation.h +8 -1
  310. package/deps/rocksdb/rocksdb/util/udt_util.cc +343 -0
  311. package/deps/rocksdb/rocksdb/util/udt_util.h +173 -1
  312. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +447 -0
  313. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  314. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  315. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  316. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +69 -25
  317. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  318. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  319. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  320. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  321. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  322. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  323. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +1 -1
  324. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  325. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -1
  326. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +3 -3
  327. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  328. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  329. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  330. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  331. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  332. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  333. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  334. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +231 -33
  335. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +0 -1
  336. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  337. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  338. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +40 -23
  339. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +13 -12
  340. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +7 -0
  341. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  342. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +41 -11
  343. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  344. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +71 -24
  345. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  346. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  347. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +39 -11
  348. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  349. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +14 -8
  350. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  351. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  352. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  353. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  354. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +2 -1
  355. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  356. package/deps/rocksdb/rocksdb.gyp +2 -0
  357. package/package.json +1 -1
  358. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  359. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -3,8 +3,9 @@
3
3
  // COPYING file in the root directory) and Apache 2.0 License
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
 
6
-
6
+ #include <cstdint>
7
7
  #include <functional>
8
+ #include <memory>
8
9
  #include <string>
9
10
  #include <thread>
10
11
 
@@ -27,49 +28,54 @@ class OptimisticTransactionTest
27
28
  : public testing::Test,
28
29
  public testing::WithParamInterface<OccValidationPolicy> {
29
30
  public:
30
- OptimisticTransactionDB* txn_db;
31
+ std::unique_ptr<OptimisticTransactionDB> txn_db;
31
32
  std::string dbname;
32
33
  Options options;
34
+ OptimisticTransactionDBOptions occ_opts;
33
35
 
34
36
  OptimisticTransactionTest() {
35
37
  options.create_if_missing = true;
36
38
  options.max_write_buffer_number = 2;
37
39
  options.max_write_buffer_size_to_maintain = 2 * Arena::kInlineSize;
38
40
  options.merge_operator.reset(new TestPutOperator());
41
+ occ_opts.validate_policy = GetParam();
39
42
  dbname = test::PerThreadDBPath("optimistic_transaction_testdb");
40
43
 
41
44
  EXPECT_OK(DestroyDB(dbname, options));
42
45
  Open();
43
46
  }
44
47
  ~OptimisticTransactionTest() override {
45
- delete txn_db;
48
+ EXPECT_OK(txn_db->Close());
49
+ txn_db.reset();
46
50
  EXPECT_OK(DestroyDB(dbname, options));
47
51
  }
48
52
 
49
53
  void Reopen() {
50
- delete txn_db;
51
- txn_db = nullptr;
54
+ txn_db.reset();
52
55
  Open();
53
56
  }
54
57
 
55
- private:
56
- void Open() {
58
+ static void OpenImpl(const Options& options,
59
+ const OptimisticTransactionDBOptions& occ_opts,
60
+ const std::string& dbname,
61
+ std::unique_ptr<OptimisticTransactionDB>* txn_db) {
57
62
  ColumnFamilyOptions cf_options(options);
58
- OptimisticTransactionDBOptions occ_opts;
59
- occ_opts.validate_policy = GetParam();
60
63
  std::vector<ColumnFamilyDescriptor> column_families;
61
64
  std::vector<ColumnFamilyHandle*> handles;
62
65
  column_families.push_back(
63
66
  ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
64
- Status s =
65
- OptimisticTransactionDB::Open(DBOptions(options), occ_opts, dbname,
66
- column_families, &handles, &txn_db);
67
-
67
+ OptimisticTransactionDB* raw_txn_db = nullptr;
68
+ Status s = OptimisticTransactionDB::Open(
69
+ options, occ_opts, dbname, column_families, &handles, &raw_txn_db);
68
70
  ASSERT_OK(s);
69
- ASSERT_NE(txn_db, nullptr);
71
+ ASSERT_NE(raw_txn_db, nullptr);
72
+ txn_db->reset(raw_txn_db);
70
73
  ASSERT_EQ(handles.size(), 1);
71
74
  delete handles[0];
72
75
  }
76
+
77
+ private:
78
+ void Open() { OpenImpl(options, occ_opts, dbname, &txn_db); }
73
79
  };
74
80
 
75
81
  TEST_P(OptimisticTransactionTest, SuccessTest) {
@@ -316,17 +322,11 @@ TEST_P(OptimisticTransactionTest, FlushTest) {
316
322
  delete txn;
317
323
  }
318
324
 
319
- TEST_P(OptimisticTransactionTest, FlushTest2) {
320
- WriteOptions write_options;
321
- ReadOptions read_options, snapshot_read_options;
325
+ namespace {
326
+ void FlushTest2PopulateTxn(Transaction* txn) {
327
+ ReadOptions snapshot_read_options;
322
328
  std::string value;
323
329
 
324
- ASSERT_OK(txn_db->Put(write_options, Slice("foo"), Slice("bar")));
325
- ASSERT_OK(txn_db->Put(write_options, Slice("foo2"), Slice("bar")));
326
-
327
- Transaction* txn = txn_db->BeginTransaction(write_options);
328
- ASSERT_NE(txn, nullptr);
329
-
330
330
  snapshot_read_options.snapshot = txn->GetSnapshot();
331
331
 
332
332
  ASSERT_OK(txn->GetForUpdate(snapshot_read_options, "foo", &value));
@@ -336,6 +336,21 @@ TEST_P(OptimisticTransactionTest, FlushTest2) {
336
336
 
337
337
  ASSERT_OK(txn->GetForUpdate(snapshot_read_options, "foo", &value));
338
338
  ASSERT_EQ(value, "bar2");
339
+ }
340
+ } // namespace
341
+
342
+ TEST_P(OptimisticTransactionTest, FlushTest2) {
343
+ WriteOptions write_options;
344
+ ReadOptions read_options;
345
+ std::string value;
346
+
347
+ ASSERT_OK(txn_db->Put(write_options, Slice("foo"), Slice("bar")));
348
+ ASSERT_OK(txn_db->Put(write_options, Slice("foo2"), Slice("bar")));
349
+
350
+ Transaction* txn = txn_db->BeginTransaction(write_options);
351
+ ASSERT_NE(txn, nullptr);
352
+
353
+ FlushTest2PopulateTxn(txn);
339
354
 
340
355
  // Put a random key so we have a MemTable to flush
341
356
  ASSERT_OK(txn_db->Put(write_options, "dummy", "dummy"));
@@ -361,9 +376,23 @@ TEST_P(OptimisticTransactionTest, FlushTest2) {
361
376
  // txn should not commit since MemTableList History is not large enough
362
377
  ASSERT_TRUE(s.IsTryAgain());
363
378
 
379
+ // simply trying Commit again doesn't help
380
+ s = txn->Commit();
381
+ ASSERT_TRUE(s.IsTryAgain());
382
+
364
383
  ASSERT_OK(txn_db->Get(read_options, "foo", &value));
365
384
  ASSERT_EQ(value, "bar");
366
385
 
386
+ // But rolling back and redoing does
387
+ ASSERT_OK(txn->Rollback());
388
+
389
+ FlushTest2PopulateTxn(txn);
390
+
391
+ ASSERT_OK(txn->Commit());
392
+
393
+ ASSERT_OK(txn_db->Get(read_options, "foo", &value));
394
+ ASSERT_EQ(value, "bar2");
395
+
367
396
  delete txn;
368
397
  }
369
398
 
@@ -616,8 +645,11 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
616
645
 
617
646
  delete cfa;
618
647
  delete cfb;
619
- delete txn_db;
620
- txn_db = nullptr;
648
+ txn_db.reset();
649
+
650
+ OptimisticTransactionDBOptions my_occ_opts = occ_opts;
651
+ const size_t bucket_count = 500;
652
+ my_occ_opts.shared_lock_buckets = MakeSharedOccLockBuckets(bucket_count);
621
653
 
622
654
  // open DB with three column families
623
655
  std::vector<ColumnFamilyDescriptor> column_families;
@@ -630,10 +662,11 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
630
662
  column_families.push_back(
631
663
  ColumnFamilyDescriptor("CFB", ColumnFamilyOptions()));
632
664
  std::vector<ColumnFamilyHandle*> handles;
633
- ASSERT_OK(OptimisticTransactionDB::Open(options, dbname, column_families,
634
- &handles, &txn_db));
635
- assert(txn_db != nullptr);
636
- ASSERT_NE(txn_db, nullptr);
665
+ OptimisticTransactionDB* raw_txn_db = nullptr;
666
+ ASSERT_OK(OptimisticTransactionDB::Open(
667
+ options, my_occ_opts, dbname, column_families, &handles, &raw_txn_db));
668
+ ASSERT_NE(raw_txn_db, nullptr);
669
+ txn_db.reset(raw_txn_db);
637
670
 
638
671
  Transaction* txn = txn_db->BeginTransaction(write_options);
639
672
  ASSERT_NE(txn, nullptr);
@@ -671,6 +704,7 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
671
704
  s = txn_db->Get(read_options, "AAA", &value);
672
705
  ASSERT_TRUE(s.IsNotFound());
673
706
  s = txn_db->Get(read_options, handles[2], "AAAZZZ", &value);
707
+ ASSERT_OK(s);
674
708
  ASSERT_EQ(value, "barbar");
675
709
 
676
710
  Slice key_slices[3] = {Slice("AAA"), Slice("ZZ"), Slice("Z")};
@@ -694,6 +728,7 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
694
728
  delete txn;
695
729
  delete txn2;
696
730
 
731
+ // ** MultiGet **
697
732
  txn = txn_db->BeginTransaction(write_options, txn_options);
698
733
  snapshot_read_options.snapshot = txn->GetSnapshot();
699
734
 
@@ -745,11 +780,162 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
745
780
  s = txn2->Commit();
746
781
  ASSERT_TRUE(s.IsBusy());
747
782
 
783
+ delete txn;
784
+ delete txn2;
785
+
786
+ // ** Test independence and/or sharing of lock buckets across CFs and DBs **
787
+ if (my_occ_opts.validate_policy == OccValidationPolicy::kValidateParallel) {
788
+ struct SeenStat {
789
+ uint64_t rolling_hash = 0;
790
+ uintptr_t min = 0;
791
+ uintptr_t max = 0;
792
+ };
793
+ SeenStat cur_seen;
794
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
795
+ "OptimisticTransaction::CommitWithParallelValidate::lock_bucket_ptr",
796
+ [&](void* arg) {
797
+ // Hash the pointer
798
+ cur_seen.rolling_hash = Hash64(reinterpret_cast<char*>(&arg),
799
+ sizeof(arg), cur_seen.rolling_hash);
800
+ uintptr_t val = reinterpret_cast<uintptr_t>(arg);
801
+ if (cur_seen.min == 0 || val < cur_seen.min) {
802
+ cur_seen.min = val;
803
+ }
804
+ if (cur_seen.max == 0 || val > cur_seen.max) {
805
+ cur_seen.max = val;
806
+ }
807
+ });
808
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
809
+
810
+ // Another db sharing lock buckets
811
+ auto shared_dbname =
812
+ test::PerThreadDBPath("optimistic_transaction_testdb_shared");
813
+ std::unique_ptr<OptimisticTransactionDB> shared_txn_db = nullptr;
814
+ OpenImpl(options, my_occ_opts, shared_dbname, &shared_txn_db);
815
+
816
+ // Another db not sharing lock buckets
817
+ auto nonshared_dbname =
818
+ test::PerThreadDBPath("optimistic_transaction_testdb_nonshared");
819
+ std::unique_ptr<OptimisticTransactionDB> nonshared_txn_db = nullptr;
820
+ my_occ_opts.occ_lock_buckets = bucket_count;
821
+ my_occ_opts.shared_lock_buckets = nullptr;
822
+ OpenImpl(options, my_occ_opts, nonshared_dbname, &nonshared_txn_db);
823
+
824
+ // Plenty of keys to avoid randomly hitting the same hash sequence
825
+ std::array<std::string, 30> keys;
826
+ for (size_t i = 0; i < keys.size(); ++i) {
827
+ keys[i] = std::to_string(i);
828
+ }
829
+
830
+ // Get a baseline pattern of bucket accesses
831
+ cur_seen = {};
832
+ txn = txn_db->BeginTransaction(write_options, txn_options);
833
+ for (const auto& key : keys) {
834
+ ASSERT_OK(txn->Put(handles[0], key, "blah"));
835
+ }
836
+ ASSERT_OK(txn->Commit());
837
+ // Sufficiently large hash coverage of the space
838
+ const uintptr_t min_span_bytes = sizeof(port::Mutex) * bucket_count / 2;
839
+ ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
840
+ // Save
841
+ SeenStat base_seen = cur_seen;
842
+
843
+ // Verify it is repeatable
844
+ cur_seen = {};
845
+ txn = txn_db->BeginTransaction(write_options, txn_options, txn);
846
+ for (const auto& key : keys) {
847
+ ASSERT_OK(txn->Put(handles[0], key, "moo"));
848
+ }
849
+ ASSERT_OK(txn->Commit());
850
+ ASSERT_EQ(cur_seen.rolling_hash, base_seen.rolling_hash);
851
+ ASSERT_EQ(cur_seen.min, base_seen.min);
852
+ ASSERT_EQ(cur_seen.max, base_seen.max);
853
+
854
+ // Try another CF
855
+ cur_seen = {};
856
+ txn = txn_db->BeginTransaction(write_options, txn_options, txn);
857
+ for (const auto& key : keys) {
858
+ ASSERT_OK(txn->Put(handles[1], key, "blah"));
859
+ }
860
+ ASSERT_OK(txn->Commit());
861
+ // Different access pattern (different hash seed)
862
+ ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
863
+ // Same pointer space
864
+ ASSERT_LT(cur_seen.min, base_seen.max);
865
+ ASSERT_GT(cur_seen.max, base_seen.min);
866
+ // Sufficiently large hash coverage of the space
867
+ ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
868
+ // Save
869
+ SeenStat cf1_seen = cur_seen;
870
+
871
+ // And another CF
872
+ cur_seen = {};
873
+ txn = txn_db->BeginTransaction(write_options, txn_options, txn);
874
+ for (const auto& key : keys) {
875
+ ASSERT_OK(txn->Put(handles[2], key, "blah"));
876
+ }
877
+ ASSERT_OK(txn->Commit());
878
+ // Different access pattern (different hash seed)
879
+ ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
880
+ ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
881
+ // Same pointer space
882
+ ASSERT_LT(cur_seen.min, base_seen.max);
883
+ ASSERT_GT(cur_seen.max, base_seen.min);
884
+ // Sufficiently large hash coverage of the space
885
+ ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
886
+
887
+ // And DB with shared lock buckets
888
+ cur_seen = {};
889
+ delete txn;
890
+ txn = shared_txn_db->BeginTransaction(write_options, txn_options);
891
+ for (const auto& key : keys) {
892
+ ASSERT_OK(txn->Put(key, "blah"));
893
+ }
894
+ ASSERT_OK(txn->Commit());
895
+ // Different access pattern (different hash seed)
896
+ ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
897
+ ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
898
+ // Same pointer space
899
+ ASSERT_LT(cur_seen.min, base_seen.max);
900
+ ASSERT_GT(cur_seen.max, base_seen.min);
901
+ // Sufficiently large hash coverage of the space
902
+ ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
903
+
904
+ // And DB with distinct lock buckets
905
+ cur_seen = {};
906
+ delete txn;
907
+ txn = nonshared_txn_db->BeginTransaction(write_options, txn_options);
908
+ for (const auto& key : keys) {
909
+ ASSERT_OK(txn->Put(key, "blah"));
910
+ }
911
+ ASSERT_OK(txn->Commit());
912
+ // Different access pattern (different hash seed)
913
+ ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
914
+ ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
915
+ // Different pointer space
916
+ ASSERT_TRUE(cur_seen.min > base_seen.max || cur_seen.max < base_seen.min);
917
+ // Sufficiently large hash coverage of the space
918
+ ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
919
+
920
+ delete txn;
921
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
922
+ }
923
+
924
+ // ** Test dropping column family before committing, or even creating txn **
925
+ txn = txn_db->BeginTransaction(write_options, txn_options);
926
+ ASSERT_OK(txn->Delete(handles[1], "AAA"));
927
+
748
928
  s = txn_db->DropColumnFamily(handles[1]);
749
929
  ASSERT_OK(s);
750
930
  s = txn_db->DropColumnFamily(handles[2]);
751
931
  ASSERT_OK(s);
752
932
 
933
+ ASSERT_NOK(txn->Commit());
934
+
935
+ txn2 = txn_db->BeginTransaction(write_options, txn_options);
936
+ ASSERT_OK(txn2->Delete(handles[2], "AAA"));
937
+ ASSERT_NOK(txn2->Commit());
938
+
753
939
  delete txn;
754
940
  delete txn2;
755
941
 
@@ -1237,7 +1423,7 @@ TEST_P(OptimisticTransactionTest, UndoGetForUpdateTest) {
1237
1423
  txn1->UndoGetForUpdate("A");
1238
1424
 
1239
1425
  Transaction* txn2 = txn_db->BeginTransaction(write_options);
1240
- txn2->Put("A", "x");
1426
+ ASSERT_OK(txn2->Put("A", "x"));
1241
1427
  ASSERT_OK(txn2->Commit());
1242
1428
  delete txn2;
1243
1429
 
@@ -1402,7 +1588,7 @@ TEST_P(OptimisticTransactionTest, OptimisticTransactionStressTest) {
1402
1588
 
1403
1589
  std::function<void()> call_inserter = [&] {
1404
1590
  ASSERT_OK(OptimisticTransactionStressTestInserter(
1405
- txn_db, num_transactions_per_thread, num_sets, num_keys_per_set));
1591
+ txn_db.get(), num_transactions_per_thread, num_sets, num_keys_per_set));
1406
1592
  };
1407
1593
 
1408
1594
  // Create N threads that use RandomTransactionInserter to write
@@ -1417,7 +1603,7 @@ TEST_P(OptimisticTransactionTest, OptimisticTransactionStressTest) {
1417
1603
  }
1418
1604
 
1419
1605
  // Verify that data is consistent
1420
- Status s = RandomTransactionInserter::Verify(txn_db, num_sets);
1606
+ Status s = RandomTransactionInserter::Verify(txn_db.get(), num_sets);
1421
1607
  ASSERT_OK(s);
1422
1608
  }
1423
1609
 
@@ -1469,6 +1655,19 @@ INSTANTIATE_TEST_CASE_P(
1469
1655
  testing::Values(OccValidationPolicy::kValidateSerial,
1470
1656
  OccValidationPolicy::kValidateParallel));
1471
1657
 
1658
+ TEST(OccLockBucketsTest, CacheAligned) {
1659
+ // Typical x86_64 is 40 byte mutex, 64 byte cache line
1660
+ if (sizeof(port::Mutex) >= sizeof(CacheAlignedWrapper<port::Mutex>)) {
1661
+ ROCKSDB_GTEST_BYPASS("Test requires mutex smaller than cache line");
1662
+ return;
1663
+ }
1664
+ auto buckets_unaligned = MakeSharedOccLockBuckets(100, false);
1665
+ auto buckets_aligned = MakeSharedOccLockBuckets(100, true);
1666
+ // Save at least one byte per bucket
1667
+ ASSERT_LE(buckets_unaligned->ApproximateMemoryUsage() + 100,
1668
+ buckets_aligned->ApproximateMemoryUsage());
1669
+ }
1670
+
1472
1671
  } // namespace ROCKSDB_NAMESPACE
1473
1672
 
1474
1673
  int main(int argc, char** argv) {
@@ -1476,4 +1675,3 @@ int main(int argc, char** argv) {
1476
1675
  ::testing::InitGoogleTest(&argc, argv);
1477
1676
  return RUN_ALL_TESTS();
1478
1677
  }
1479
-
@@ -308,4 +308,3 @@ class WriteCommittedTxn : public PessimisticTransaction {
308
308
  };
309
309
 
310
310
  } // namespace ROCKSDB_NAMESPACE
311
-
@@ -110,6 +110,8 @@ void TransactionBaseImpl::Reinitialize(DB* db,
110
110
  start_time_ = dbimpl_->GetSystemClock()->NowMicros();
111
111
  indexing_enabled_ = true;
112
112
  cmp_ = GetColumnFamilyUserComparator(db_->DefaultColumnFamily());
113
+ WriteBatchInternal::SetDefaultColumnFamilyTimestampSize(
114
+ write_batch_.GetWriteBatch(), cmp_->timestamp_size());
113
115
  WriteBatchInternal::UpdateProtectionInfo(
114
116
  write_batch_.GetWriteBatch(), write_options_.protection_bytes_per_key)
115
117
  .PermitUncheckedError();
@@ -232,27 +234,56 @@ Status TransactionBaseImpl::PopSavePoint() {
232
234
  return write_batch_.PopSavePoint();
233
235
  }
234
236
 
235
- Status TransactionBaseImpl::Get(const ReadOptions& read_options,
237
+ Status TransactionBaseImpl::Get(const ReadOptions& _read_options,
236
238
  ColumnFamilyHandle* column_family,
237
239
  const Slice& key, std::string* value) {
238
- if (read_options.io_activity != Env::IOActivity::kUnknown) {
240
+ if (_read_options.io_activity != Env::IOActivity::kUnknown &&
241
+ _read_options.io_activity != Env::IOActivity::kGet) {
239
242
  return Status::InvalidArgument(
240
- "Cannot call Get with `ReadOptions::io_activity` != "
241
- "`Env::IOActivity::kUnknown`");
243
+ "Can only call Get with `ReadOptions::io_activity` is "
244
+ "`Env::IOActivity::kUnknown` or `Env::IOActivity::kGet`");
242
245
  }
246
+ ReadOptions read_options(_read_options);
247
+ if (read_options.io_activity == Env::IOActivity::kUnknown) {
248
+ read_options.io_activity = Env::IOActivity::kGet;
249
+ }
250
+ auto s = GetImpl(read_options, column_family, key, value);
251
+ return s;
252
+ }
253
+
254
+ Status TransactionBaseImpl::GetImpl(const ReadOptions& read_options,
255
+ ColumnFamilyHandle* column_family,
256
+ const Slice& key, std::string* value) {
243
257
  assert(value != nullptr);
244
258
  PinnableSlice pinnable_val(value);
245
259
  assert(!pinnable_val.IsPinned());
246
- auto s = Get(read_options, column_family, key, &pinnable_val);
260
+ auto s = GetImpl(read_options, column_family, key, &pinnable_val);
247
261
  if (s.ok() && pinnable_val.IsPinned()) {
248
262
  value->assign(pinnable_val.data(), pinnable_val.size());
249
263
  } // else value is already assigned
250
264
  return s;
251
265
  }
252
266
 
253
- Status TransactionBaseImpl::Get(const ReadOptions& read_options,
267
+ Status TransactionBaseImpl::Get(const ReadOptions& _read_options,
254
268
  ColumnFamilyHandle* column_family,
255
269
  const Slice& key, PinnableSlice* pinnable_val) {
270
+ if (_read_options.io_activity != Env::IOActivity::kUnknown &&
271
+ _read_options.io_activity != Env::IOActivity::kGet) {
272
+ return Status::InvalidArgument(
273
+ "Can only call Get with `ReadOptions::io_activity` is "
274
+ "`Env::IOActivity::kUnknown` or `Env::IOActivity::kGet`");
275
+ }
276
+ ReadOptions read_options(_read_options);
277
+ if (read_options.io_activity == Env::IOActivity::kUnknown) {
278
+ read_options.io_activity = Env::IOActivity::kGet;
279
+ }
280
+ return GetImpl(read_options, column_family, key, pinnable_val);
281
+ }
282
+
283
+ Status TransactionBaseImpl::GetImpl(const ReadOptions& read_options,
284
+ ColumnFamilyHandle* column_family,
285
+ const Slice& key,
286
+ PinnableSlice* pinnable_val) {
256
287
  return write_batch_.GetFromBatchAndDB(db_, read_options, column_family, key,
257
288
  pinnable_val);
258
289
  }
@@ -279,7 +310,7 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
279
310
  assert(value != nullptr);
280
311
  PinnableSlice pinnable_val(value);
281
312
  assert(!pinnable_val.IsPinned());
282
- s = Get(read_options, column_family, key, &pinnable_val);
313
+ s = GetImpl(read_options, column_family, key, &pinnable_val);
283
314
  if (s.ok() && pinnable_val.IsPinned()) {
284
315
  value->assign(pinnable_val.data(), pinnable_val.size());
285
316
  } // else value is already assigned
@@ -307,39 +338,63 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
307
338
  TryLock(column_family, key, true /* read_only */, exclusive, do_validate);
308
339
 
309
340
  if (s.ok() && pinnable_val != nullptr) {
310
- s = Get(read_options, column_family, key, pinnable_val);
341
+ s = GetImpl(read_options, column_family, key, pinnable_val);
311
342
  }
312
343
  return s;
313
344
  }
314
345
 
315
346
  std::vector<Status> TransactionBaseImpl::MultiGet(
316
- const ReadOptions& read_options,
347
+ const ReadOptions& _read_options,
317
348
  const std::vector<ColumnFamilyHandle*>& column_family,
318
349
  const std::vector<Slice>& keys, std::vector<std::string>* values) {
319
350
  size_t num_keys = keys.size();
320
- if (read_options.io_activity != Env::IOActivity::kUnknown) {
351
+ std::vector<Status> stat_list(num_keys);
352
+ if (_read_options.io_activity != Env::IOActivity::kUnknown &&
353
+ _read_options.io_activity != Env::IOActivity::kMultiGet) {
321
354
  Status s = Status::InvalidArgument(
322
- "Cannot call MultiGet with `ReadOptions::io_activity` != "
323
- "`Env::IOActivity::kUnknown`");
324
- return std::vector<Status>(num_keys, s);
355
+ "Can only call MultiGet with `ReadOptions::io_activity` is "
356
+ "`Env::IOActivity::kUnknown` or `Env::IOActivity::kMultiGet`");
357
+
358
+ for (size_t i = 0; i < num_keys; ++i) {
359
+ stat_list[i] = s;
360
+ }
361
+ return stat_list;
362
+ }
363
+ ReadOptions read_options(_read_options);
364
+ if (read_options.io_activity == Env::IOActivity::kUnknown) {
365
+ read_options.io_activity = Env::IOActivity::kMultiGet;
325
366
  }
326
367
 
327
368
  values->resize(num_keys);
328
-
329
- std::vector<Status> stat_list(num_keys);
330
369
  for (size_t i = 0; i < num_keys; ++i) {
331
- stat_list[i] = Get(read_options, column_family[i], keys[i], &(*values)[i]);
370
+ stat_list[i] =
371
+ GetImpl(read_options, column_family[i], keys[i], &(*values)[i]);
332
372
  }
333
373
 
334
374
  return stat_list;
335
375
  }
336
376
 
337
- void TransactionBaseImpl::MultiGet(const ReadOptions& read_options,
377
+ void TransactionBaseImpl::MultiGet(const ReadOptions& _read_options,
338
378
  ColumnFamilyHandle* column_family,
339
379
  const size_t num_keys, const Slice* keys,
340
380
  PinnableSlice* values, Status* statuses,
341
381
  const bool sorted_input) {
342
- assert(read_options.io_activity == Env::IOActivity::kUnknown);
382
+ if (_read_options.io_activity != Env::IOActivity::kUnknown &&
383
+ _read_options.io_activity != Env::IOActivity::kMultiGet) {
384
+ Status s = Status::InvalidArgument(
385
+ "Can only call MultiGet with `ReadOptions::io_activity` is "
386
+ "`Env::IOActivity::kUnknown` or `Env::IOActivity::kMultiGet`");
387
+ for (size_t i = 0; i < num_keys; ++i) {
388
+ if (statuses[i].ok()) {
389
+ statuses[i] = s;
390
+ }
391
+ }
392
+ return;
393
+ }
394
+ ReadOptions read_options(_read_options);
395
+ if (read_options.io_activity == Env::IOActivity::kUnknown) {
396
+ read_options.io_activity = Env::IOActivity::kMultiGet;
397
+ }
343
398
  write_batch_.MultiGetFromBatchAndDB(db_, read_options, column_family,
344
399
  num_keys, keys, values, statuses,
345
400
  sorted_input);
@@ -349,7 +404,6 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
349
404
  const ReadOptions& read_options,
350
405
  const std::vector<ColumnFamilyHandle*>& column_family,
351
406
  const std::vector<Slice>& keys, std::vector<std::string>* values) {
352
- // Regardless of whether the MultiGet succeeded, track these keys.
353
407
  size_t num_keys = keys.size();
354
408
  if (read_options.io_activity != Env::IOActivity::kUnknown) {
355
409
  Status s = Status::InvalidArgument(
@@ -357,6 +411,7 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
357
411
  "`Env::IOActivity::kUnknown`");
358
412
  return std::vector<Status>(num_keys, s);
359
413
  }
414
+ // Regardless of whether the MultiGet succeeded, track these keys.
360
415
  values->resize(num_keys);
361
416
 
362
417
  // Lock all keys
@@ -372,7 +427,8 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
372
427
  // TODO(agiardullo): optimize multiget?
373
428
  std::vector<Status> stat_list(num_keys);
374
429
  for (size_t i = 0; i < num_keys; ++i) {
375
- stat_list[i] = Get(read_options, column_family[i], keys[i], &(*values)[i]);
430
+ stat_list[i] =
431
+ GetImpl(read_options, column_family[i], keys[i], &(*values)[i]);
376
432
  }
377
433
 
378
434
  return stat_list;
@@ -53,11 +53,13 @@ class TransactionBaseImpl : public Transaction {
53
53
  Status PopSavePoint() override;
54
54
 
55
55
  using Transaction::Get;
56
- Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family,
57
- const Slice& key, std::string* value) override;
56
+ Status Get(const ReadOptions& _read_options,
57
+ ColumnFamilyHandle* column_family, const Slice& key,
58
+ std::string* value) override;
58
59
 
59
- Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family,
60
- const Slice& key, PinnableSlice* value) override;
60
+ Status Get(const ReadOptions& _read_options,
61
+ ColumnFamilyHandle* column_family, const Slice& key,
62
+ PinnableSlice* value) override;
61
63
 
62
64
  Status Get(const ReadOptions& options, const Slice& key,
63
65
  std::string* value) override {
@@ -84,7 +86,7 @@ class TransactionBaseImpl : public Transaction {
84
86
 
85
87
  using Transaction::MultiGet;
86
88
  std::vector<Status> MultiGet(
87
- const ReadOptions& options,
89
+ const ReadOptions& _read_options,
88
90
  const std::vector<ColumnFamilyHandle*>& column_family,
89
91
  const std::vector<Slice>& keys,
90
92
  std::vector<std::string>* values) override;
@@ -98,9 +100,10 @@ class TransactionBaseImpl : public Transaction {
98
100
  keys, values);
99
101
  }
100
102
 
101
- void MultiGet(const ReadOptions& options, ColumnFamilyHandle* column_family,
102
- const size_t num_keys, const Slice* keys, PinnableSlice* values,
103
- Status* statuses, const bool sorted_input = false) override;
103
+ void MultiGet(const ReadOptions& _read_options,
104
+ ColumnFamilyHandle* column_family, const size_t num_keys,
105
+ const Slice* keys, PinnableSlice* values, Status* statuses,
106
+ const bool sorted_input = false) override;
104
107
 
105
108
  using Transaction::MultiGetForUpdate;
106
109
  std::vector<Status> MultiGetForUpdate(
@@ -260,6 +263,13 @@ class TransactionBaseImpl : public Transaction {
260
263
  LockTracker& GetTrackedLocks() { return *tracked_locks_; }
261
264
 
262
265
  protected:
266
+ Status GetImpl(const ReadOptions& options, ColumnFamilyHandle* column_family,
267
+ const Slice& key, std::string* value) override;
268
+
269
+ virtual Status GetImpl(const ReadOptions& options,
270
+ ColumnFamilyHandle* column_family, const Slice& key,
271
+ PinnableSlice* value) override;
272
+
263
273
  // Add a key to the list of tracked keys.
264
274
  //
265
275
  // seqno is the earliest seqno this key was involved with this transaction.
@@ -379,4 +389,3 @@ class TransactionBaseImpl : public Transaction {
379
389
  };
380
390
 
381
391
  } // namespace ROCKSDB_NAMESPACE
382
-