@nxtedition/rocksdb 7.1.30 → 7.1.32

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 (381) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -2
  2. package/deps/rocksdb/rocksdb/cache/cache_test.cc +15 -23
  3. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -1
  4. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +4 -5
  5. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -1
  6. package/deps/rocksdb/rocksdb/crash_test.mk +1 -1
  7. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +15 -0
  8. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +1 -1
  9. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -1
  10. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +78 -6
  11. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +32 -6
  12. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -8
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +47 -8
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -3
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +105 -166
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +3 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +46 -15
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +47 -26
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +17 -10
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +11 -5
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +12 -6
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -2
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +337 -103
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -5
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -2
  27. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +524 -1
  28. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +164 -0
  29. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +6 -6
  30. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5 -7
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -1
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +4 -4
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +1 -0
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +2 -3
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  38. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -23
  39. package/deps/rocksdb/rocksdb/db/merge_helper.cc +30 -0
  40. package/deps/rocksdb/rocksdb/db/merge_helper.h +9 -0
  41. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +29 -9
  42. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +10 -7
  43. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +12 -8
  44. package/deps/rocksdb/rocksdb/db/version_set.cc +11 -6
  45. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +142 -0
  46. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +59 -53
  47. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -2
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -3
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +0 -2
  52. package/deps/rocksdb/rocksdb/env/env.cc +16 -19
  53. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -1
  54. package/deps/rocksdb/rocksdb/env/env_chroot.cc +20 -20
  55. package/deps/rocksdb/rocksdb/env/env_encryption.cc +62 -60
  56. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  57. package/deps/rocksdb/rocksdb/env/env_test.cc +179 -176
  58. package/deps/rocksdb/rocksdb/env/file_system.cc +3 -4
  59. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -2
  60. package/deps/rocksdb/rocksdb/env/io_posix.h +1 -2
  61. package/deps/rocksdb/rocksdb/env/mock_env.h +1 -0
  62. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +4 -4
  63. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +6 -5
  64. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +2 -5
  65. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +6 -7
  66. package/deps/rocksdb/rocksdb/file/file_util.cc +1 -1
  67. package/deps/rocksdb/rocksdb/file/filename.cc +16 -17
  68. package/deps/rocksdb/rocksdb/file/filename.h +4 -5
  69. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +492 -496
  70. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +1 -1
  71. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +1 -3
  72. package/deps/rocksdb/rocksdb/file/read_write_util.cc +1 -0
  73. package/deps/rocksdb/rocksdb/file/read_write_util.h +1 -0
  74. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +6 -8
  75. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +1 -2
  76. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -4
  77. package/deps/rocksdb/rocksdb/include/rocksdb/block_cache_trace_writer.h +4 -4
  78. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +166 -167
  79. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +1 -0
  80. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +0 -1
  81. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +12 -12
  82. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +2 -0
  83. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +1 -0
  84. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +1 -0
  85. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -1
  86. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +1 -0
  87. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +1 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +0 -4
  89. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -3
  90. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +1 -1
  91. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -0
  92. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +1 -0
  94. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +1 -0
  95. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +1 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +4 -4
  97. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -0
  98. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -4
  99. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +1 -1
  100. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +2 -2
  101. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  102. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +3 -3
  103. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +3 -7
  104. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +20 -23
  105. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  106. package/deps/rocksdb/rocksdb/logging/event_logger.cc +1 -3
  107. package/deps/rocksdb/rocksdb/logging/event_logger.h +4 -5
  108. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +2 -1
  109. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -3
  110. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -2
  111. package/deps/rocksdb/rocksdb/logging/logging.h +3 -3
  112. package/deps/rocksdb/rocksdb/memory/allocator.h +1 -0
  113. package/deps/rocksdb/rocksdb/memory/arena_test.cc +1 -1
  114. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +2 -0
  115. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -0
  116. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -0
  117. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +17 -20
  118. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +13 -15
  119. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +11 -10
  120. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +3 -3
  121. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +2 -2
  122. package/deps/rocksdb/rocksdb/memtable/skiplist.h +30 -28
  123. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +4 -6
  124. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +73 -70
  125. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +1 -1
  126. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +21 -23
  127. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +24 -38
  129. package/deps/rocksdb/rocksdb/monitoring/histogram.h +10 -17
  130. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +19 -19
  131. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +22 -30
  132. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +4 -6
  133. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -0
  134. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +4 -12
  135. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -3
  136. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  137. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +12 -14
  138. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +2 -3
  139. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -1
  140. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -3
  141. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +1 -0
  142. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  143. package/deps/rocksdb/rocksdb/monitoring/statistics.h +7 -7
  144. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +12 -22
  145. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +7 -10
  146. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  147. package/deps/rocksdb/rocksdb/port/lang.h +3 -1
  148. package/deps/rocksdb/rocksdb/port/likely.h +2 -2
  149. package/deps/rocksdb/rocksdb/port/mmap.h +2 -2
  150. package/deps/rocksdb/rocksdb/port/port_dirent.h +2 -2
  151. package/deps/rocksdb/rocksdb/port/port_posix.cc +32 -27
  152. package/deps/rocksdb/rocksdb/port/port_posix.h +31 -30
  153. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -1
  154. package/deps/rocksdb/rocksdb/port/sys_time.h +1 -1
  155. package/deps/rocksdb/rocksdb/port/win/io_win.h +6 -7
  156. package/deps/rocksdb/rocksdb/port/win/port_win.h +12 -20
  157. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +5 -4
  158. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -5
  159. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -4
  160. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +30 -49
  161. package/deps/rocksdb/rocksdb/port/win/win_thread.h +5 -5
  162. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -62
  163. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +2 -2
  164. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +4 -3
  165. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -0
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -1
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -1
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -4
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +0 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -1
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -30
  175. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +2 -1
  176. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  177. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +3 -3
  178. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -0
  179. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +4 -5
  180. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -3
  181. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -2
  182. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +1 -0
  183. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +0 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +0 -1
  186. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -6
  187. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -1
  188. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +1 -0
  189. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -6
  190. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -2
  191. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +90 -80
  192. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +5 -4
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +63 -69
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +2 -1
  195. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +58 -57
  196. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +3 -3
  197. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +35 -30
  198. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -10
  199. package/deps/rocksdb/rocksdb/table/iter_heap.h +2 -0
  200. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -1
  201. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -3
  202. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +31 -16
  203. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -6
  204. package/deps/rocksdb/rocksdb/table/multiget_context.h +5 -6
  205. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +1 -0
  206. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +1 -1
  207. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +7 -10
  208. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -1
  209. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +2 -2
  210. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +4 -3
  211. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +2 -2
  212. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -0
  213. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +10 -21
  214. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +14 -12
  215. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +2 -5
  216. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -3
  217. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +0 -6
  218. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +0 -33
  219. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -6
  220. package/deps/rocksdb/rocksdb/table/table_properties.cc +24 -37
  221. package/deps/rocksdb/rocksdb/table/table_reader.h +3 -2
  222. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +9 -8
  223. package/deps/rocksdb/rocksdb/table/table_test.cc +77 -82
  224. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +1 -0
  225. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  226. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +8 -18
  227. package/deps/rocksdb/rocksdb/test_util/sync_point.h +2 -2
  228. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +4 -3
  229. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +13 -18
  230. package/deps/rocksdb/rocksdb/test_util/testharness.cc +1 -2
  231. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -7
  232. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +3 -4
  233. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +1 -1
  234. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +1 -0
  235. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -7
  236. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +3 -2
  237. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +296 -314
  238. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +6 -6
  239. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +2 -1
  240. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +57 -64
  241. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +6 -5
  242. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +2 -2
  243. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  244. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  245. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +1 -2
  246. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +10 -10
  247. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -1
  248. package/deps/rocksdb/rocksdb/tools/write_stress.cc +6 -3
  249. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +12 -31
  250. package/deps/rocksdb/rocksdb/util/autovector.h +3 -6
  251. package/deps/rocksdb/rocksdb/util/autovector_test.cc +12 -12
  252. package/deps/rocksdb/rocksdb/util/bloom_test.cc +8 -12
  253. package/deps/rocksdb/rocksdb/util/coding.cc +1 -0
  254. package/deps/rocksdb/rocksdb/util/coding.h +17 -15
  255. package/deps/rocksdb/rocksdb/util/coding_test.cc +14 -15
  256. package/deps/rocksdb/rocksdb/util/comparator.cc +4 -4
  257. package/deps/rocksdb/rocksdb/util/compression.h +6 -3
  258. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +2 -2
  259. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +5 -8
  260. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +1 -1
  261. package/deps/rocksdb/rocksdb/util/crc32c.cc +202 -297
  262. package/deps/rocksdb/rocksdb/util/crc32c.h +2 -3
  263. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +2 -0
  264. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +39 -54
  265. package/deps/rocksdb/rocksdb/util/defer.h +2 -1
  266. package/deps/rocksdb/rocksdb/util/defer_test.cc +2 -1
  267. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +2 -1
  268. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +1 -1
  269. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  270. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -1
  271. package/deps/rocksdb/rocksdb/util/filelock_test.cc +24 -29
  272. package/deps/rocksdb/rocksdb/util/filter_bench.cc +4 -4
  273. package/deps/rocksdb/rocksdb/util/hash_test.cc +2 -2
  274. package/deps/rocksdb/rocksdb/util/heap.h +5 -4
  275. package/deps/rocksdb/rocksdb/util/heap_test.cc +15 -25
  276. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  277. package/deps/rocksdb/rocksdb/util/murmurhash.cc +7 -2
  278. package/deps/rocksdb/rocksdb/util/murmurhash.h +4 -3
  279. package/deps/rocksdb/rocksdb/util/mutexlock.h +5 -11
  280. package/deps/rocksdb/rocksdb/util/random.cc +1 -0
  281. package/deps/rocksdb/rocksdb/util/random.h +2 -4
  282. package/deps/rocksdb/rocksdb/util/random_test.cc +2 -1
  283. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +4 -3
  284. package/deps/rocksdb/rocksdb/util/slice.cc +1 -1
  285. package/deps/rocksdb/rocksdb/util/slice_test.cc +1 -2
  286. package/deps/rocksdb/rocksdb/util/status.cc +2 -0
  287. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -0
  288. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +64 -76
  289. package/deps/rocksdb/rocksdb/util/thread_local.cc +18 -32
  290. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -3
  291. package/deps/rocksdb/rocksdb/util/thread_operation.h +34 -43
  292. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +54 -73
  293. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +18 -18
  294. package/deps/rocksdb/rocksdb/util/timer.h +4 -9
  295. package/deps/rocksdb/rocksdb/util/timer_queue.h +1 -0
  296. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +1 -0
  297. package/deps/rocksdb/rocksdb/util/xxhash.cc +1 -2
  298. package/deps/rocksdb/rocksdb/util/xxhash.h +7 -4
  299. package/deps/rocksdb/rocksdb/util/xxph3.h +3 -1
  300. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +16 -24
  301. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +1 -1
  302. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +106 -104
  303. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +3 -4
  304. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +6 -6
  305. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +1 -2
  306. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +3 -4
  307. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -1
  308. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +11 -15
  309. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -2
  310. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +3 -3
  311. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +12 -12
  312. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +56 -55
  313. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +91 -74
  314. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +17 -34
  315. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +21 -45
  316. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +74 -97
  317. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +17 -18
  318. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -4
  319. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +19 -19
  320. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +19 -18
  321. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +7 -10
  322. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +3 -4
  323. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +2 -2
  324. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +10 -15
  325. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +2 -1
  326. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +1 -0
  327. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +5 -3
  328. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -2
  329. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +4 -5
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -7
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -13
  332. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +1 -0
  333. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +7 -9
  334. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +4 -5
  335. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +4 -3
  336. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +1 -1
  337. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +3 -3
  338. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +2 -4
  339. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +2 -2
  340. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +39 -50
  341. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +2 -2
  342. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +4 -3
  343. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +2 -2
  344. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +5 -7
  345. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +5 -4
  346. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  347. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +3 -6
  348. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +1 -1
  349. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +2 -2
  350. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -1
  351. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +1 -0
  352. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -1
  353. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +1 -1
  354. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +18 -13
  355. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +1 -3
  356. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +15 -14
  357. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +14 -12
  358. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -2
  359. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +4 -7
  360. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1 -2
  361. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  362. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +1 -1
  363. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -1
  364. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +3 -2
  365. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +1 -2
  366. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +3 -2
  367. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +5 -5
  368. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -4
  369. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -2
  370. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +5 -4
  371. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -1
  372. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +1 -0
  373. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +3 -4
  374. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +2 -6
  375. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +80 -79
  376. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -3
  377. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +9 -17
  378. package/package.json +1 -1
  379. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  380. package/prebuilds/darwin-x64/node.napi.node +0 -0
  381. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -84,7 +84,9 @@ struct FragmentedRangeTombstoneList {
84
84
 
85
85
  // Returns true if the stored tombstones contain with one with a sequence
86
86
  // number in [lower, upper].
87
- bool ContainsRange(SequenceNumber lower, SequenceNumber upper) const;
87
+ // This method is not const as it internally lazy initialize a set of
88
+ // sequence numbers (`seq_set_`).
89
+ bool ContainsRange(SequenceNumber lower, SequenceNumber upper);
88
90
 
89
91
  uint64_t num_unfragmented_tombstones() const {
90
92
  return num_unfragmented_tombstones_;
@@ -113,6 +115,7 @@ struct FragmentedRangeTombstoneList {
113
115
  std::vector<RangeTombstoneStack> tombstones_;
114
116
  std::vector<SequenceNumber> tombstone_seqs_;
115
117
  std::vector<Slice> tombstone_timestamps_;
118
+ std::once_flag seq_set_init_once_flag_;
116
119
  std::set<SequenceNumber> seq_set_;
117
120
  std::list<std::string> pinned_slices_;
118
121
  PinnedIteratorsManager pinned_iters_mgr_;
@@ -131,12 +134,13 @@ struct FragmentedRangeTombstoneList {
131
134
  // tombstone collapsing is always O(n log n).
132
135
  class FragmentedRangeTombstoneIterator : public InternalIterator {
133
136
  public:
137
+ FragmentedRangeTombstoneIterator(FragmentedRangeTombstoneList* tombstones,
138
+ const InternalKeyComparator& icmp,
139
+ SequenceNumber upper_bound,
140
+ const Slice* ts_upper_bound = nullptr,
141
+ SequenceNumber lower_bound = 0);
134
142
  FragmentedRangeTombstoneIterator(
135
- const FragmentedRangeTombstoneList* tombstones,
136
- const InternalKeyComparator& icmp, SequenceNumber upper_bound,
137
- const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
138
- FragmentedRangeTombstoneIterator(
139
- const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
143
+ const std::shared_ptr<FragmentedRangeTombstoneList>& tombstones,
140
144
  const InternalKeyComparator& icmp, SequenceNumber upper_bound,
141
145
  const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
142
146
  FragmentedRangeTombstoneIterator(
@@ -311,9 +315,9 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
311
315
  const RangeTombstoneStackEndComparator tombstone_end_cmp_;
312
316
  const InternalKeyComparator* icmp_;
313
317
  const Comparator* ucmp_;
314
- std::shared_ptr<const FragmentedRangeTombstoneList> tombstones_ref_;
318
+ std::shared_ptr<FragmentedRangeTombstoneList> tombstones_ref_;
315
319
  std::shared_ptr<FragmentedRangeTombstoneListCache> tombstones_cache_ref_;
316
- const FragmentedRangeTombstoneList* tombstones_;
320
+ FragmentedRangeTombstoneList* tombstones_;
317
321
  SequenceNumber upper_bound_;
318
322
  SequenceNumber lower_bound_;
319
323
  // Only consider timestamps <= ts_upper_bound_.
@@ -2403,12 +2403,16 @@ void Version::Get(const ReadOptions& read_options, const LookupKey& k,
2403
2403
  // merge_operands are in saver and we hit the beginning of the key history
2404
2404
  // do a final merge of nullptr and operands;
2405
2405
  std::string* str_value = value != nullptr ? value->GetSelf() : nullptr;
2406
- *status = MergeHelper::TimedFullMerge(
2407
- merge_operator_, user_key, nullptr, merge_context->GetOperands(),
2408
- str_value, info_log_, db_statistics_, clock_,
2409
- nullptr /* result_operand */, true);
2410
- if (LIKELY(value != nullptr)) {
2411
- value->PinSelf();
2406
+ if (str_value || columns) {
2407
+ *status = MergeHelper::TimedFullMerge(
2408
+ merge_operator_, user_key, nullptr, merge_context->GetOperands(),
2409
+ str_value, columns, info_log_, db_statistics_, clock_,
2410
+ nullptr /* result_operand */, true);
2411
+ if (status->ok()) {
2412
+ if (LIKELY(value != nullptr)) {
2413
+ value->PinSelf();
2414
+ }
2415
+ }
2412
2416
  }
2413
2417
  } else {
2414
2418
  if (key_exists != nullptr) {
@@ -2833,6 +2837,7 @@ Status Version::MultiGetAsync(
2833
2837
  std::vector<Status> statuses = folly::coro::blockingWait(
2834
2838
  folly::coro::collectAllRange(std::move(mget_tasks))
2835
2839
  .scheduleOn(&range->context()->executor()));
2840
+ mget_tasks.clear();
2836
2841
  for (Status stat : statuses) {
2837
2842
  if (!stat.ok()) {
2838
2843
  s = stat;
@@ -209,6 +209,148 @@ TEST_F(DBWideBasicTest, PutEntityColumnFamily) {
209
209
  ASSERT_OK(db_->Write(WriteOptions(), &batch));
210
210
  }
211
211
 
212
+ TEST_F(DBWideBasicTest, MergePlainKeyValue) {
213
+ Options options = GetDefaultOptions();
214
+ options.create_if_missing = true;
215
+ options.merge_operator = MergeOperators::CreateStringAppendOperator();
216
+ Reopen(options);
217
+
218
+ // Put + Merge
219
+ constexpr char first_key[] = "first";
220
+ constexpr char first_base_value[] = "hello";
221
+ constexpr char first_merge_op[] = "world";
222
+
223
+ // Delete + Merge
224
+ constexpr char second_key[] = "second";
225
+ constexpr char second_merge_op[] = "foo";
226
+
227
+ // Merge without any preceding KV
228
+ constexpr char third_key[] = "third";
229
+ constexpr char third_merge_op[] = "bar";
230
+
231
+ auto write_base = [&]() {
232
+ // Write "base" KVs: a Put for the 1st key and a Delete for the 2nd one;
233
+ // note there is no "base" KV for the 3rd
234
+ ASSERT_OK(db_->Put(WriteOptions(), db_->DefaultColumnFamily(), first_key,
235
+ first_base_value));
236
+ ASSERT_OK(
237
+ db_->Delete(WriteOptions(), db_->DefaultColumnFamily(), second_key));
238
+ };
239
+
240
+ auto write_merge = [&]() {
241
+ // Write Merge operands
242
+ ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), first_key,
243
+ first_merge_op));
244
+ ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), second_key,
245
+ second_merge_op));
246
+ ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), third_key,
247
+ third_merge_op));
248
+ };
249
+
250
+ const std::string expected_first_column(std::string(first_base_value) + "," +
251
+ first_merge_op);
252
+ const WideColumns expected_first_columns{
253
+ {kDefaultWideColumnName, expected_first_column}};
254
+ const WideColumns expected_second_columns{
255
+ {kDefaultWideColumnName, second_merge_op}};
256
+ const WideColumns expected_third_columns{
257
+ {kDefaultWideColumnName, third_merge_op}};
258
+
259
+ auto verify = [&]() {
260
+ {
261
+ PinnableWideColumns result;
262
+ ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
263
+ first_key, &result));
264
+ ASSERT_EQ(result.columns(), expected_first_columns);
265
+ }
266
+
267
+ {
268
+ PinnableWideColumns result;
269
+ ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
270
+ second_key, &result));
271
+ ASSERT_EQ(result.columns(), expected_second_columns);
272
+ }
273
+
274
+ {
275
+ PinnableWideColumns result;
276
+ ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
277
+ third_key, &result));
278
+
279
+ ASSERT_EQ(result.columns(), expected_third_columns);
280
+ }
281
+
282
+ {
283
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
284
+
285
+ iter->SeekToFirst();
286
+ ASSERT_TRUE(iter->Valid());
287
+ ASSERT_OK(iter->status());
288
+ ASSERT_EQ(iter->key(), first_key);
289
+ ASSERT_EQ(iter->value(), expected_first_columns[0].value());
290
+ ASSERT_EQ(iter->columns(), expected_first_columns);
291
+
292
+ iter->Next();
293
+ ASSERT_TRUE(iter->Valid());
294
+ ASSERT_OK(iter->status());
295
+ ASSERT_EQ(iter->key(), second_key);
296
+ ASSERT_EQ(iter->value(), expected_second_columns[0].value());
297
+ ASSERT_EQ(iter->columns(), expected_second_columns);
298
+
299
+ iter->Next();
300
+ ASSERT_TRUE(iter->Valid());
301
+ ASSERT_OK(iter->status());
302
+ ASSERT_EQ(iter->key(), third_key);
303
+ ASSERT_EQ(iter->value(), expected_third_columns[0].value());
304
+ ASSERT_EQ(iter->columns(), expected_third_columns);
305
+
306
+ iter->Next();
307
+ ASSERT_FALSE(iter->Valid());
308
+ ASSERT_OK(iter->status());
309
+
310
+ iter->SeekToLast();
311
+ ASSERT_TRUE(iter->Valid());
312
+ ASSERT_OK(iter->status());
313
+ ASSERT_EQ(iter->key(), third_key);
314
+ ASSERT_EQ(iter->value(), expected_third_columns[0].value());
315
+ ASSERT_EQ(iter->columns(), expected_third_columns);
316
+
317
+ iter->Prev();
318
+ ASSERT_TRUE(iter->Valid());
319
+ ASSERT_OK(iter->status());
320
+ ASSERT_EQ(iter->key(), second_key);
321
+ ASSERT_EQ(iter->value(), expected_second_columns[0].value());
322
+ ASSERT_EQ(iter->columns(), expected_second_columns);
323
+
324
+ iter->Prev();
325
+ ASSERT_TRUE(iter->Valid());
326
+ ASSERT_OK(iter->status());
327
+ ASSERT_EQ(iter->key(), first_key);
328
+ ASSERT_EQ(iter->value(), expected_first_columns[0].value());
329
+ ASSERT_EQ(iter->columns(), expected_first_columns);
330
+
331
+ iter->Prev();
332
+ ASSERT_FALSE(iter->Valid());
333
+ ASSERT_OK(iter->status());
334
+ }
335
+ };
336
+
337
+ // Base KVs (if any) and Merge operands both in memtable
338
+ write_base();
339
+ write_merge();
340
+ verify();
341
+
342
+ // Base KVs (if any) and Merge operands both in storage
343
+ ASSERT_OK(Flush());
344
+ verify();
345
+
346
+ // Base KVs (if any) in storage, Merge operands in memtable
347
+ DestroyAndReopen(options);
348
+ write_base();
349
+ ASSERT_OK(Flush());
350
+ write_merge();
351
+ verify();
352
+ }
353
+
212
354
  TEST_F(DBWideBasicTest, PutEntityMergeNotSupported) {
213
355
  Options options = GetDefaultOptions();
214
356
  options.merge_operator = MergeOperators::CreateStringAppendOperator();
@@ -18,8 +18,8 @@ class BatchedOpsStressTest : public StressTest {
18
18
 
19
19
  bool IsStateTracked() const override { return false; }
20
20
 
21
- // Given a key K and value V, this puts ("0"+K, "0"+V), ("1"+K, "1"+V), ...
22
- // ("9"+K, "9"+V) in DB atomically i.e in a single batch.
21
+ // Given a key K and value V, this puts ("0"+K, V+"0"), ("1"+K, V+"1"), ...,
22
+ // ("9"+K, V+"9") in DB atomically i.e in a single batch.
23
23
  // Also refer BatchedOpsStressTest::TestGet
24
24
  Status TestPut(ThreadState* thread, WriteOptions& write_opts,
25
25
  const ReadOptions& /* read_opts */,
@@ -29,12 +29,12 @@ class BatchedOpsStressTest : public StressTest {
29
29
  assert(!rand_column_families.empty());
30
30
  assert(!rand_keys.empty());
31
31
 
32
- const std::string key_suffix = Key(rand_keys[0]);
32
+ const std::string key_body = Key(rand_keys[0]);
33
33
 
34
34
  const uint32_t value_base =
35
35
  thread->rand.Next() % thread->shared->UNKNOWN_SENTINEL;
36
36
  const size_t sz = GenerateValue(value_base, value, sizeof(value));
37
- const std::string value_suffix = Slice(value, sz).ToString();
37
+ const std::string value_body = Slice(value, sz).ToString();
38
38
 
39
39
  WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
40
40
  FLAGS_batch_protection_bytes_per_key,
@@ -44,10 +44,14 @@ class BatchedOpsStressTest : public StressTest {
44
44
  assert(cfh);
45
45
 
46
46
  for (int i = 9; i >= 0; --i) {
47
- const std::string prefix = std::to_string(i);
47
+ const std::string num = std::to_string(i);
48
48
 
49
- const std::string k = prefix + key_suffix;
50
- const std::string v = prefix + value_suffix;
49
+ // Note: the digit in num is prepended to the key; however, it is appended
50
+ // to the value because we want the "value base" to be encoded uniformly
51
+ // at the beginning of the value for all types of stress tests (e.g.
52
+ // batched, non-batched, CF consistency).
53
+ const std::string k = num + key_body;
54
+ const std::string v = value_body + num;
51
55
 
52
56
  if (FLAGS_use_merge) {
53
57
  batch.Merge(cfh, k, v);
@@ -72,7 +76,7 @@ class BatchedOpsStressTest : public StressTest {
72
76
  return s;
73
77
  }
74
78
 
75
- // Given a key K, this deletes ("0"+K), ("1"+K),... ("9"+K)
79
+ // Given a key K, this deletes ("0"+K), ("1"+K), ..., ("9"+K)
76
80
  // in DB atomically i.e in a single batch. Also refer MultiGet.
77
81
  Status TestDelete(ThreadState* thread, WriteOptions& writeoptions,
78
82
  const std::vector<int>& rand_column_families,
@@ -122,9 +126,9 @@ class BatchedOpsStressTest : public StressTest {
122
126
  std::terminate();
123
127
  }
124
128
 
125
- // Given a key K, this gets values for "0"+K, "1"+K,..."9"+K
129
+ // Given a key K, this gets values for "0"+K, "1"+K, ..., "9"+K
126
130
  // in the same snapshot, and verifies that all the values are of the form
127
- // "0"+V, "1"+V,..."9"+V.
131
+ // V+"0", V+"1", ..., V+"9".
128
132
  // ASSUMES that BatchedOpsStressTest::TestPut was used to put (K, V) into
129
133
  // the DB.
130
134
  Status TestGet(ThreadState* thread, const ReadOptions& readoptions,
@@ -156,13 +160,19 @@ class BatchedOpsStressTest : public StressTest {
156
160
  } else {
157
161
  values[i] = from_db;
158
162
 
159
- char expected_prefix = (keys[i])[0];
160
- char actual_prefix = (values[i])[0];
161
- if (actual_prefix != expected_prefix) {
162
- fprintf(stderr, "error expected prefix = %c actual = %c\n",
163
- expected_prefix, actual_prefix);
163
+ assert(!keys[i].empty());
164
+ assert(!values[i].empty());
165
+
166
+ const char expected = keys[i].front();
167
+ const char actual = values[i].back();
168
+
169
+ if (expected != actual) {
170
+ fprintf(stderr, "get error expected = %c actual = %c\n", expected,
171
+ actual);
164
172
  }
165
- (values[i])[0] = ' '; // blank out the differing character
173
+
174
+ values[i].pop_back(); // get rid of the differing character
175
+
166
176
  thread->stats.AddGets(1, 1);
167
177
  }
168
178
  }
@@ -171,7 +181,7 @@ class BatchedOpsStressTest : public StressTest {
171
181
  // Now that we retrieved all values, check that they all match
172
182
  for (int i = 1; i < 10; i++) {
173
183
  if (values[i] != values[0]) {
174
- fprintf(stderr, "error : inconsistent values for key %s: %s, %s\n",
184
+ fprintf(stderr, "get error: inconsistent values for key %s: %s, %s\n",
175
185
  key.ToString(true).c_str(), StringToHex(values[0]).c_str(),
176
186
  StringToHex(values[i]).c_str());
177
187
  // we continue after error rather than exiting so that we can
@@ -188,8 +198,8 @@ class BatchedOpsStressTest : public StressTest {
188
198
  const std::vector<int64_t>& rand_keys) override {
189
199
  size_t num_keys = rand_keys.size();
190
200
  std::vector<Status> ret_status(num_keys);
191
- std::array<std::string, 10> keys = {{"0", "1", "2", "3", "4",
192
- "5", "6", "7", "8", "9"}};
201
+ std::array<std::string, 10> keys = {
202
+ {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}};
193
203
  size_t num_prefixes = keys.size();
194
204
  for (size_t rand_key = 0; rand_key < num_keys; ++rand_key) {
195
205
  std::vector<Slice> key_slices;
@@ -214,7 +224,7 @@ class BatchedOpsStressTest : public StressTest {
214
224
  for (size_t i = 0; i < num_prefixes; i++) {
215
225
  Status s = statuses[i];
216
226
  if (!s.ok() && !s.IsNotFound()) {
217
- fprintf(stderr, "get error: %s\n", s.ToString().c_str());
227
+ fprintf(stderr, "multiget error: %s\n", s.ToString().c_str());
218
228
  thread->stats.AddErrors(1);
219
229
  ret_status[rand_key] = s;
220
230
  // we continue after error rather than exiting so that we can
@@ -223,17 +233,19 @@ class BatchedOpsStressTest : public StressTest {
223
233
  thread->stats.AddGets(1, 0);
224
234
  ret_status[rand_key] = s;
225
235
  } else {
226
- char expected_prefix = (keys[i])[0];
227
- char actual_prefix = (values[i])[0];
228
- if (actual_prefix != expected_prefix) {
229
- fprintf(stderr, "error expected prefix = %c actual = %c\n",
230
- expected_prefix, actual_prefix);
236
+ assert(!keys[i].empty());
237
+ assert(!values[i].empty());
238
+
239
+ const char expected = keys[i][0];
240
+ const char actual = values[i][values[i].size() - 1];
241
+
242
+ if (expected != actual) {
243
+ fprintf(stderr, "multiget error expected = %c actual = %c\n",
244
+ expected, actual);
231
245
  }
232
- std::string str;
233
- str.assign(values[i].data(), values[i].size());
234
- values[i].Reset();
235
- str[0] = ' '; // blank out the differing character
236
- values[i].PinSelf(str);
246
+
247
+ values[i].remove_suffix(1); // get rid of the differing character
248
+
237
249
  thread->stats.AddGets(1, 1);
238
250
  }
239
251
  }
@@ -242,7 +254,8 @@ class BatchedOpsStressTest : public StressTest {
242
254
  // Now that we retrieved all values, check that they all match
243
255
  for (size_t i = 1; i < num_prefixes; i++) {
244
256
  if (values[i] != values[0]) {
245
- fprintf(stderr, "error : inconsistent values for key %s: %s, %s\n",
257
+ fprintf(stderr,
258
+ "multiget error: inconsistent values for key %s: %s, %s\n",
246
259
  StringToHex(key_str[i]).c_str(),
247
260
  StringToHex(values[0].ToString()).c_str(),
248
261
  StringToHex(values[i].ToString()).c_str());
@@ -255,11 +268,11 @@ class BatchedOpsStressTest : public StressTest {
255
268
  return ret_status;
256
269
  }
257
270
 
258
- // Given a key, this does prefix scans for "0"+P, "1"+P,..."9"+P
271
+ // Given a key, this does prefix scans for "0"+P, "1"+P, ..., "9"+P
259
272
  // in the same snapshot where P is the first FLAGS_prefix_size - 1 bytes
260
273
  // of the key. Each of these 10 scans returns a series of values;
261
274
  // each series should be the same length, and it is verified for each
262
- // index i that all the i'th values are of the form "0"+V, "1"+V,..."9"+V.
275
+ // index i that all the i'th values are of the form V+"0", V+"1", ..., V+"9".
263
276
  // ASSUMES that MultiPut was used to put (K, V)
264
277
  Status TestPrefixScan(ThreadState* thread, const ReadOptions& readoptions,
265
278
  const std::vector<int>& rand_column_families,
@@ -317,21 +330,24 @@ class BatchedOpsStressTest : public StressTest {
317
330
  iters[i]->key().starts_with(prefix_slices[i]));
318
331
  values[i] = iters[i]->value().ToString();
319
332
 
320
- // make sure the first character of the value is the expected digit
321
- const char expected_first = prefixes[i][0];
322
- const char actual_first = values[i][0];
333
+ // make sure the last character of the value is the expected digit
334
+ assert(!prefixes[i].empty());
335
+ assert(!values[i].empty());
336
+
337
+ const char expected = prefixes[i].front();
338
+ const char actual = values[i].back();
323
339
 
324
- if (actual_first != expected_first) {
325
- fprintf(stderr, "error expected first = %c actual = %c\n",
326
- expected_first, actual_first);
340
+ if (expected != actual) {
341
+ fprintf(stderr, "prefix scan error expected = %c actual = %c\n",
342
+ expected, actual);
327
343
  }
328
344
 
329
- values[i][0] = ' '; // blank out the differing character
345
+ values[i].pop_back(); // get rid of the differing character
330
346
 
331
347
  // make sure all values are equivalent
332
348
  if (values[i] != values[0]) {
333
349
  fprintf(stderr,
334
- "error : %" ROCKSDB_PRIszt
350
+ "prefix scan error : %" ROCKSDB_PRIszt
335
351
  ", inconsistent values for prefix %s: %s, %s\n",
336
352
  i, prefix_slices[i].ToString(/* hex */ true).c_str(),
337
353
  StringToHex(values[0]).c_str(),
@@ -341,16 +357,11 @@ class BatchedOpsStressTest : public StressTest {
341
357
  }
342
358
 
343
359
  // make sure value() and columns() are consistent
344
- // note: in these tests, value base is stored after a single-digit
345
- // prefix
346
- Slice value_base_slice = iters[i]->value();
347
- value_base_slice.remove_prefix(1);
348
-
349
360
  const WideColumns expected_columns = GenerateExpectedWideColumns(
350
- GetValueBase(value_base_slice), iters[i]->value());
361
+ GetValueBase(iters[i]->value()), iters[i]->value());
351
362
  if (iters[i]->columns() != expected_columns) {
352
363
  fprintf(stderr,
353
- "error : %" ROCKSDB_PRIszt
364
+ "prefix scan error : %" ROCKSDB_PRIszt
354
365
  ", value and columns inconsistent for prefix %s: %s\n",
355
366
  i, prefix_slices[i].ToString(/* hex */ true).c_str(),
356
367
  DebugString(iters[i]->value(), iters[i]->columns(),
@@ -377,11 +388,6 @@ class BatchedOpsStressTest : public StressTest {
377
388
  return Status::OK();
378
389
  }
379
390
 
380
- Slice GetValueBaseSlice(Slice slice) override {
381
- slice.remove_prefix(1);
382
- return slice;
383
- }
384
-
385
391
  void VerifyDb(ThreadState* /* thread */) const override {}
386
392
 
387
393
  void ContinuouslyVerifyDb(ThreadState* /* thread */) const override {}
@@ -150,6 +150,7 @@ DECLARE_string(cache_type);
150
150
  DECLARE_uint64(subcompactions);
151
151
  DECLARE_uint64(periodic_compaction_seconds);
152
152
  DECLARE_uint64(compaction_ttl);
153
+ DECLARE_bool(fifo_allow_compaction);
153
154
  DECLARE_bool(allow_concurrent_memtable_write);
154
155
  DECLARE_double(experimental_mempurge_threshold);
155
156
  DECLARE_bool(enable_write_thread_adaptive_yield);
@@ -508,8 +509,8 @@ extern inline std::string Key(int64_t val) {
508
509
  if (offset < weight) {
509
510
  // Use the bottom 3 bits of offset as the number of trailing 'x's in the
510
511
  // key. If the next key is going to be of the next level, then skip the
511
- // trailer as it would break ordering. If the key length is already at max,
512
- // skip the trailer.
512
+ // trailer as it would break ordering. If the key length is already at
513
+ // max, skip the trailer.
513
514
  if (offset < weight - 1 && level < levels - 1) {
514
515
  size_t trailer_len = offset & 0x7;
515
516
  key.append(trailer_len, 'x');
@@ -379,6 +379,10 @@ DEFINE_uint64(compaction_ttl, 1000,
379
379
  DEFINE_bool(allow_concurrent_memtable_write, false,
380
380
  "Allow multi-writers to update mem tables in parallel.");
381
381
 
382
+ DEFINE_bool(fifo_allow_compaction, false,
383
+ "If true, set `Options::compaction_options_fifo.allow_compaction = "
384
+ "true`. It only take effect when FIFO compaction is used.");
385
+
382
386
  DEFINE_double(experimental_mempurge_threshold, 0.0,
383
387
  "Maximum estimated useful payload that triggers a "
384
388
  "mempurge process to collect memtable garbage bytes.");
@@ -333,9 +333,7 @@ class SharedState {
333
333
  uint64_t GetStartTimestamp() const { return start_timestamp_; }
334
334
 
335
335
  private:
336
- static void IgnoreReadErrorCallback(void*) {
337
- ignore_read_error = true;
338
- }
336
+ static void IgnoreReadErrorCallback(void*) { ignore_read_error = true; }
339
337
 
340
338
  // Pick random keys in each column family that will not experience overwrite.
341
339
  std::unordered_set<int64_t> GenerateNoOverwriteIds() const {
@@ -1487,10 +1487,8 @@ void StressTest::VerifyIterator(ThreadState* thread,
1487
1487
  }
1488
1488
 
1489
1489
  if (!*diverged && iter->Valid()) {
1490
- const Slice value_base_slice = GetValueBaseSlice(iter->value());
1491
-
1492
- const WideColumns expected_columns = GenerateExpectedWideColumns(
1493
- GetValueBase(value_base_slice), iter->value());
1490
+ const WideColumns expected_columns =
1491
+ GenerateExpectedWideColumns(GetValueBase(iter->value()), iter->value());
1494
1492
  if (iter->columns() != expected_columns) {
1495
1493
  fprintf(stderr, "Value and columns inconsistent for iterator: %s\n",
1496
1494
  DebugString(iter->value(), iter->columns(), expected_columns)
@@ -3123,6 +3121,11 @@ void InitializeOptionsFromFlags(
3123
3121
  options.max_background_flushes = FLAGS_max_background_flushes;
3124
3122
  options.compaction_style =
3125
3123
  static_cast<ROCKSDB_NAMESPACE::CompactionStyle>(FLAGS_compaction_style);
3124
+ if (options.compaction_style ==
3125
+ ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleFIFO) {
3126
+ options.compaction_options_fifo.allow_compaction =
3127
+ FLAGS_fifo_allow_compaction;
3128
+ }
3126
3129
  options.compaction_pri =
3127
3130
  static_cast<ROCKSDB_NAMESPACE::CompactionPri>(FLAGS_compaction_pri);
3128
3131
  options.num_levels = FLAGS_num_levels;
@@ -139,8 +139,6 @@ class StressTest {
139
139
  return column_families_[column_family_id];
140
140
  }
141
141
 
142
- virtual Slice GetValueBaseSlice(Slice slice) { return slice; }
143
-
144
142
  #ifndef ROCKSDB_LITE
145
143
  // Generated a list of keys that close to boundaries of SST keys.
146
144
  // If there isn't any SST file in the DB, return empty list.
@@ -633,8 +633,7 @@ Env::Env(const std::shared_ptr<FileSystem>& fs,
633
633
  const std::shared_ptr<SystemClock>& clock)
634
634
  : thread_status_updater_(nullptr), file_system_(fs), system_clock_(clock) {}
635
635
 
636
- Env::~Env() {
637
- }
636
+ Env::~Env() {}
638
637
 
639
638
  Status Env::NewLogger(const std::string& fname,
640
639
  std::shared_ptr<Logger>* result) {
@@ -841,14 +840,11 @@ std::string Env::GenerateUniqueId() {
841
840
  return result;
842
841
  }
843
842
 
844
- SequentialFile::~SequentialFile() {
845
- }
843
+ SequentialFile::~SequentialFile() {}
846
844
 
847
- RandomAccessFile::~RandomAccessFile() {
848
- }
845
+ RandomAccessFile::~RandomAccessFile() {}
849
846
 
850
- WritableFile::~WritableFile() {
851
- }
847
+ WritableFile::~WritableFile() {}
852
848
 
853
849
  MemoryMappedFileBuffer::~MemoryMappedFileBuffer() {}
854
850
 
@@ -865,16 +861,15 @@ Status Logger::Close() {
865
861
 
866
862
  Status Logger::CloseImpl() { return Status::NotSupported(); }
867
863
 
868
- FileLock::~FileLock() {
869
- }
864
+ FileLock::~FileLock() {}
870
865
 
871
- void LogFlush(Logger *info_log) {
866
+ void LogFlush(Logger* info_log) {
872
867
  if (info_log) {
873
868
  info_log->Flush();
874
869
  }
875
870
  }
876
871
 
877
- static void Logv(Logger *info_log, const char* format, va_list ap) {
872
+ static void Logv(Logger* info_log, const char* format, va_list ap) {
878
873
  if (info_log && info_log->GetInfoLogLevel() <= InfoLogLevel::INFO_LEVEL) {
879
874
  info_log->Logv(InfoLogLevel::INFO_LEVEL, format, ap);
880
875
  }
@@ -887,9 +882,10 @@ void Log(Logger* info_log, const char* format, ...) {
887
882
  va_end(ap);
888
883
  }
889
884
 
890
- void Logger::Logv(const InfoLogLevel log_level, const char* format, va_list ap) {
891
- static const char* kInfoLogLevelNames[5] = { "DEBUG", "INFO", "WARN",
892
- "ERROR", "FATAL" };
885
+ void Logger::Logv(const InfoLogLevel log_level, const char* format,
886
+ va_list ap) {
887
+ static const char* kInfoLogLevelNames[5] = {"DEBUG", "INFO", "WARN", "ERROR",
888
+ "FATAL"};
893
889
  if (log_level < log_level_) {
894
890
  return;
895
891
  }
@@ -906,7 +902,7 @@ void Logger::Logv(const InfoLogLevel log_level, const char* format, va_list ap)
906
902
  } else {
907
903
  char new_format[500];
908
904
  snprintf(new_format, sizeof(new_format) - 1, "[%s] %s",
909
- kInfoLogLevelNames[log_level], format);
905
+ kInfoLogLevelNames[log_level], format);
910
906
  Logv(new_format, ap);
911
907
  }
912
908
 
@@ -919,7 +915,8 @@ void Logger::Logv(const InfoLogLevel log_level, const char* format, va_list ap)
919
915
  }
920
916
  }
921
917
 
922
- static void Logv(const InfoLogLevel log_level, Logger *info_log, const char *format, va_list ap) {
918
+ static void Logv(const InfoLogLevel log_level, Logger* info_log,
919
+ const char* format, va_list ap) {
923
920
  if (info_log && info_log->GetInfoLogLevel() <= log_level) {
924
921
  if (log_level == InfoLogLevel::HEADER_LEVEL) {
925
922
  info_log->LogHeader(format, ap);
@@ -937,7 +934,7 @@ void Log(const InfoLogLevel log_level, Logger* info_log, const char* format,
937
934
  va_end(ap);
938
935
  }
939
936
 
940
- static void Headerv(Logger *info_log, const char *format, va_list ap) {
937
+ static void Headerv(Logger* info_log, const char* format, va_list ap) {
941
938
  if (info_log) {
942
939
  info_log->LogHeader(format, ap);
943
940
  }
@@ -1106,7 +1103,7 @@ void AssignEnvOptions(EnvOptions* env_options, const DBOptions& options) {
1106
1103
  options.env->SanitizeEnvOptions(env_options);
1107
1104
  }
1108
1105
 
1109
- }
1106
+ } // namespace
1110
1107
 
1111
1108
  EnvOptions Env::OptimizeForLogWrite(const EnvOptions& env_options,
1112
1109
  const DBOptions& db_options) const {
@@ -305,7 +305,7 @@ TEST_P(EnvBasicTestWithParam, LargeWrite) {
305
305
  read += result.size();
306
306
  }
307
307
  ASSERT_TRUE(write_data == read_data);
308
- delete [] scratch;
308
+ delete[] scratch;
309
309
  }
310
310
 
311
311
  TEST_P(EnvMoreTestWithParam, GetModTime) {