@nxtedition/rocksdb 7.1.20 → 7.1.21

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 (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -84,6 +84,7 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
84
84
  // for use in flush_current_tombstones.
85
85
  std::set<ParsedInternalKey, ParsedInternalKeyComparator> cur_end_keys(cmp);
86
86
 
87
+ size_t ts_sz = icmp.user_comparator()->timestamp_size();
87
88
  // Given the next start key in unfragmented_tombstones,
88
89
  // flush_current_tombstones writes every tombstone fragment that starts
89
90
  // and ends with a key before next_start_key, and starts with a key greater
@@ -93,12 +94,14 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
93
94
  bool reached_next_start_key = false;
94
95
  for (; it != cur_end_keys.end() && !reached_next_start_key; ++it) {
95
96
  Slice cur_end_key = it->user_key;
96
- if (icmp.user_comparator()->Compare(cur_start_key, cur_end_key) == 0) {
97
+ if (icmp.user_comparator()->CompareWithoutTimestamp(cur_start_key,
98
+ cur_end_key) == 0) {
97
99
  // Empty tombstone.
98
100
  continue;
99
101
  }
100
- if (icmp.user_comparator()->Compare(next_start_key, cur_end_key) <= 0) {
101
- // All of the end keys in [it, cur_end_keys.end()) are after
102
+ if (icmp.user_comparator()->CompareWithoutTimestamp(next_start_key,
103
+ cur_end_key) <= 0) {
104
+ // All the end keys in [it, cur_end_keys.end()) are after
102
105
  // next_start_key, so the tombstones they represent can be used in
103
106
  // fragments that start with keys greater than or equal to
104
107
  // next_start_key. However, the end keys we already passed will not be
@@ -115,22 +118,38 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
115
118
  // Flush a range tombstone fragment [cur_start_key, cur_end_key), which
116
119
  // should not overlap with the last-flushed tombstone fragment.
117
120
  assert(tombstones_.empty() ||
118
- icmp.user_comparator()->Compare(tombstones_.back().end_key,
119
- cur_start_key) <= 0);
121
+ icmp.user_comparator()->CompareWithoutTimestamp(
122
+ tombstones_.back().end_key, cur_start_key) <= 0);
120
123
 
121
124
  // Sort the sequence numbers of the tombstones being fragmented in
122
125
  // descending order, and then flush them in that order.
123
126
  autovector<SequenceNumber> seqnums_to_flush;
127
+ autovector<Slice> timestamps_to_flush;
124
128
  for (auto flush_it = it; flush_it != cur_end_keys.end(); ++flush_it) {
125
129
  seqnums_to_flush.push_back(flush_it->sequence);
130
+ if (ts_sz) {
131
+ timestamps_to_flush.push_back(
132
+ ExtractTimestampFromUserKey(flush_it->user_key, ts_sz));
133
+ }
126
134
  }
135
+ // TODO: bind the two sorting together to be more efficient
127
136
  std::sort(seqnums_to_flush.begin(), seqnums_to_flush.end(),
128
137
  std::greater<SequenceNumber>());
138
+ if (ts_sz) {
139
+ std::sort(timestamps_to_flush.begin(), timestamps_to_flush.end(),
140
+ [icmp](const Slice& ts1, const Slice& ts2) {
141
+ return icmp.user_comparator()->CompareTimestamp(ts1, ts2) >
142
+ 0;
143
+ });
144
+ }
129
145
 
130
146
  size_t start_idx = tombstone_seqs_.size();
131
147
  size_t end_idx = start_idx + seqnums_to_flush.size();
132
148
 
133
- if (for_compaction) {
149
+ // If user-defined timestamp is enabled, we should not drop tombstones
150
+ // from any snapshot stripe. Garbage collection of range tombstones
151
+ // happens in CompactionOutputs::AddRangeDels().
152
+ if (for_compaction && ts_sz == 0) {
134
153
  // Drop all tombstone seqnums that are not preserved by a snapshot.
135
154
  SequenceNumber next_snapshot = kMaxSequenceNumber;
136
155
  for (auto seq : seqnums_to_flush) {
@@ -155,10 +174,33 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
155
174
  tombstone_seqs_.insert(tombstone_seqs_.end(), seqnums_to_flush.begin(),
156
175
  seqnums_to_flush.end());
157
176
  seq_set_.insert(seqnums_to_flush.begin(), seqnums_to_flush.end());
177
+ if (ts_sz) {
178
+ tombstone_timestamps_.insert(tombstone_timestamps_.end(),
179
+ timestamps_to_flush.begin(),
180
+ timestamps_to_flush.end());
181
+ }
158
182
  }
159
183
 
160
184
  assert(start_idx < end_idx);
161
- tombstones_.emplace_back(cur_start_key, cur_end_key, start_idx, end_idx);
185
+ if (ts_sz) {
186
+ std::string start_key_with_max_ts;
187
+ AppendUserKeyWithMaxTimestamp(&start_key_with_max_ts, cur_start_key,
188
+ ts_sz);
189
+ pinned_slices_.emplace_back(std::move(start_key_with_max_ts));
190
+ Slice start_key = pinned_slices_.back();
191
+
192
+ std::string end_key_with_max_ts;
193
+ AppendUserKeyWithMaxTimestamp(&end_key_with_max_ts, cur_end_key, ts_sz);
194
+ pinned_slices_.emplace_back(std::move(end_key_with_max_ts));
195
+ Slice end_key = pinned_slices_.back();
196
+
197
+ // RangeTombstoneStack expects start_key and end_key to have max
198
+ // timestamp.
199
+ tombstones_.emplace_back(start_key, end_key, start_idx, end_idx);
200
+ } else {
201
+ tombstones_.emplace_back(cur_start_key, cur_end_key, start_idx,
202
+ end_idx);
203
+ }
162
204
 
163
205
  cur_start_key = cur_end_key;
164
206
  }
@@ -193,8 +235,9 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
193
235
  tombstone_end_key.size());
194
236
  tombstone_end_key = pinned_slices_.back();
195
237
  }
196
- if (!cur_end_keys.empty() && icmp.user_comparator()->Compare(
197
- cur_start_key, tombstone_start_key) != 0) {
238
+ if (!cur_end_keys.empty() &&
239
+ icmp.user_comparator()->CompareWithoutTimestamp(
240
+ cur_start_key, tombstone_start_key) != 0) {
198
241
  // The start key has changed. Flush all tombstones that start before
199
242
  // this new start key.
200
243
  flush_current_tombstones(tombstone_start_key);
@@ -223,14 +266,15 @@ bool FragmentedRangeTombstoneList::ContainsRange(SequenceNumber lower,
223
266
  FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
224
267
  const FragmentedRangeTombstoneList* tombstones,
225
268
  const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
226
- SequenceNumber _lower_bound)
269
+ const Slice* ts_upper_bound, SequenceNumber _lower_bound)
227
270
  : tombstone_start_cmp_(icmp.user_comparator()),
228
271
  tombstone_end_cmp_(icmp.user_comparator()),
229
272
  icmp_(&icmp),
230
273
  ucmp_(icmp.user_comparator()),
231
274
  tombstones_(tombstones),
232
275
  upper_bound_(_upper_bound),
233
- lower_bound_(_lower_bound) {
276
+ lower_bound_(_lower_bound),
277
+ ts_upper_bound_(ts_upper_bound) {
234
278
  assert(tombstones_ != nullptr);
235
279
  Invalidate();
236
280
  }
@@ -238,7 +282,7 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
238
282
  FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
239
283
  const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
240
284
  const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
241
- SequenceNumber _lower_bound)
285
+ const Slice* ts_upper_bound, SequenceNumber _lower_bound)
242
286
  : tombstone_start_cmp_(icmp.user_comparator()),
243
287
  tombstone_end_cmp_(icmp.user_comparator()),
244
288
  icmp_(&icmp),
@@ -246,7 +290,8 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
246
290
  tombstones_ref_(tombstones),
247
291
  tombstones_(tombstones_ref_.get()),
248
292
  upper_bound_(_upper_bound),
249
- lower_bound_(_lower_bound) {
293
+ lower_bound_(_lower_bound),
294
+ ts_upper_bound_(ts_upper_bound) {
250
295
  assert(tombstones_ != nullptr);
251
296
  Invalidate();
252
297
  }
@@ -254,7 +299,7 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
254
299
  FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
255
300
  const std::shared_ptr<FragmentedRangeTombstoneListCache>& tombstones_cache,
256
301
  const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
257
- SequenceNumber _lower_bound)
302
+ const Slice* ts_upper_bound, SequenceNumber _lower_bound)
258
303
  : tombstone_start_cmp_(icmp.user_comparator()),
259
304
  tombstone_end_cmp_(icmp.user_comparator()),
260
305
  icmp_(&icmp),
@@ -264,6 +309,11 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
264
309
  upper_bound_(_upper_bound),
265
310
  lower_bound_(_lower_bound) {
266
311
  assert(tombstones_ != nullptr);
312
+ if (!ts_upper_bound || ts_upper_bound->empty()) {
313
+ ts_upper_bound_ = nullptr;
314
+ } else {
315
+ ts_upper_bound_ = ts_upper_bound;
316
+ }
267
317
  Invalidate();
268
318
  }
269
319
 
@@ -278,9 +328,7 @@ void FragmentedRangeTombstoneIterator::SeekToTopFirst() {
278
328
  return;
279
329
  }
280
330
  pos_ = tombstones_->begin();
281
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
282
- tombstones_->seq_iter(pos_->seq_end_idx),
283
- upper_bound_, std::greater<SequenceNumber>());
331
+ SetMaxVisibleSeqAndTimestamp();
284
332
  ScanForwardToVisibleTombstone();
285
333
  }
286
334
 
@@ -295,12 +343,12 @@ void FragmentedRangeTombstoneIterator::SeekToTopLast() {
295
343
  return;
296
344
  }
297
345
  pos_ = std::prev(tombstones_->end());
298
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
299
- tombstones_->seq_iter(pos_->seq_end_idx),
300
- upper_bound_, std::greater<SequenceNumber>());
346
+ SetMaxVisibleSeqAndTimestamp();
301
347
  ScanBackwardToVisibleTombstone();
302
348
  }
303
349
 
350
+ // @param `target` is a user key, with timestamp if user-defined timestamp is
351
+ // enabled.
304
352
  void FragmentedRangeTombstoneIterator::Seek(const Slice& target) {
305
353
  if (tombstones_->empty()) {
306
354
  Invalidate();
@@ -328,9 +376,7 @@ void FragmentedRangeTombstoneIterator::SeekToCoveringTombstone(
328
376
  seq_pos_ = tombstones_->seq_end();
329
377
  return;
330
378
  }
331
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
332
- tombstones_->seq_iter(pos_->seq_end_idx),
333
- upper_bound_, std::greater<SequenceNumber>());
379
+ SetMaxVisibleSeqAndTimestamp();
334
380
  }
335
381
 
336
382
  void FragmentedRangeTombstoneIterator::SeekForPrevToCoveringTombstone(
@@ -347,9 +393,7 @@ void FragmentedRangeTombstoneIterator::SeekForPrevToCoveringTombstone(
347
393
  return;
348
394
  }
349
395
  --pos_;
350
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
351
- tombstones_->seq_iter(pos_->seq_end_idx),
352
- upper_bound_, std::greater<SequenceNumber>());
396
+ SetMaxVisibleSeqAndTimestamp();
353
397
  }
354
398
 
355
399
  void FragmentedRangeTombstoneIterator::ScanForwardToVisibleTombstone() {
@@ -361,9 +405,7 @@ void FragmentedRangeTombstoneIterator::ScanForwardToVisibleTombstone() {
361
405
  Invalidate();
362
406
  return;
363
407
  }
364
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
365
- tombstones_->seq_iter(pos_->seq_end_idx),
366
- upper_bound_, std::greater<SequenceNumber>());
408
+ SetMaxVisibleSeqAndTimestamp();
367
409
  }
368
410
  }
369
411
 
@@ -376,9 +418,7 @@ void FragmentedRangeTombstoneIterator::ScanBackwardToVisibleTombstone() {
376
418
  return;
377
419
  }
378
420
  --pos_;
379
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
380
- tombstones_->seq_iter(pos_->seq_end_idx),
381
- upper_bound_, std::greater<SequenceNumber>());
421
+ SetMaxVisibleSeqAndTimestamp();
382
422
  }
383
423
  }
384
424
 
@@ -394,9 +434,7 @@ void FragmentedRangeTombstoneIterator::TopNext() {
394
434
  if (pos_ == tombstones_->end()) {
395
435
  return;
396
436
  }
397
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
398
- tombstones_->seq_iter(pos_->seq_end_idx),
399
- upper_bound_, std::greater<SequenceNumber>());
437
+ SetMaxVisibleSeqAndTimestamp();
400
438
  ScanForwardToVisibleTombstone();
401
439
  }
402
440
 
@@ -418,9 +456,7 @@ void FragmentedRangeTombstoneIterator::TopPrev() {
418
456
  return;
419
457
  }
420
458
  --pos_;
421
- seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
422
- tombstones_->seq_iter(pos_->seq_end_idx),
423
- upper_bound_, std::greater<SequenceNumber>());
459
+ SetMaxVisibleSeqAndTimestamp();
424
460
  ScanBackwardToVisibleTombstone();
425
461
  }
426
462
 
@@ -431,8 +467,10 @@ bool FragmentedRangeTombstoneIterator::Valid() const {
431
467
  SequenceNumber FragmentedRangeTombstoneIterator::MaxCoveringTombstoneSeqnum(
432
468
  const Slice& target_user_key) {
433
469
  SeekToCoveringTombstone(target_user_key);
434
- return ValidPos() && ucmp_->Compare(start_key(), target_user_key) <= 0 ? seq()
435
- : 0;
470
+ return ValidPos() && ucmp_->CompareWithoutTimestamp(start_key(),
471
+ target_user_key) <= 0
472
+ ? seq()
473
+ : 0;
436
474
  }
437
475
 
438
476
  std::map<SequenceNumber, std::unique_ptr<FragmentedRangeTombstoneIterator>>
@@ -449,8 +487,9 @@ FragmentedRangeTombstoneIterator::SplitBySnapshot(
449
487
  upper = snapshots[i];
450
488
  }
451
489
  if (tombstones_->ContainsRange(lower, upper)) {
452
- splits.emplace(upper, std::make_unique<FragmentedRangeTombstoneIterator>(
453
- tombstones_, *icmp_, upper, lower));
490
+ splits.emplace(upper,
491
+ std::make_unique<FragmentedRangeTombstoneIterator>(
492
+ tombstones_, *icmp_, upper, ts_upper_bound_, lower));
454
493
  }
455
494
  lower = upper + 1;
456
495
  }
@@ -33,6 +33,10 @@ struct FragmentedRangeTombstoneList {
33
33
  // start and end at the same user keys but have different sequence numbers.
34
34
  // The members seq_start_idx and seq_end_idx are intended to be parameters to
35
35
  // seq_iter().
36
+ // If user-defined timestamp is enabled, `start` and `end` should be user keys
37
+ // with timestamp, and the timestamps are set to max timestamp to be returned
38
+ // by parsed_start_key()/parsed_end_key(). seq_start_idx and seq_end_idx will
39
+ // also be used as parameters to ts_iter().
36
40
  struct RangeTombstoneStack {
37
41
  RangeTombstoneStack(const Slice& start, const Slice& end, size_t start_idx,
38
42
  size_t end_idx)
@@ -40,12 +44,13 @@ struct FragmentedRangeTombstoneList {
40
44
  end_key(end),
41
45
  seq_start_idx(start_idx),
42
46
  seq_end_idx(end_idx) {}
43
-
44
47
  Slice start_key;
45
48
  Slice end_key;
46
49
  size_t seq_start_idx;
47
50
  size_t seq_end_idx;
48
51
  };
52
+ // Assumes unfragmented_tombstones->key() and unfragmented_tombstones->value()
53
+ // both contain timestamp if enabled.
49
54
  FragmentedRangeTombstoneList(
50
55
  std::unique_ptr<InternalIterator> unfragmented_tombstones,
51
56
  const InternalKeyComparator& icmp, bool for_compaction = false,
@@ -63,6 +68,10 @@ struct FragmentedRangeTombstoneList {
63
68
  return std::next(tombstone_seqs_.begin(), idx);
64
69
  }
65
70
 
71
+ std::vector<Slice>::const_iterator ts_iter(size_t idx) const {
72
+ return std::next(tombstone_timestamps_.begin(), idx);
73
+ }
74
+
66
75
  std::vector<SequenceNumber>::const_iterator seq_begin() const {
67
76
  return tombstone_seqs_.begin();
68
77
  }
@@ -87,8 +96,15 @@ struct FragmentedRangeTombstoneList {
87
96
 
88
97
  private:
89
98
  // Given an ordered range tombstone iterator unfragmented_tombstones,
90
- // "fragment" the tombstones into non-overlapping pieces, and store them in
91
- // tombstones_ and tombstone_seqs_.
99
+ // "fragment" the tombstones into non-overlapping pieces. Each
100
+ // "non-overlapping piece" is a RangeTombstoneStack in tombstones_, which
101
+ // contains start_key, end_key, and indices that points to sequence numbers
102
+ // (in tombstone_seqs_) and timestamps (in tombstone_timestamps_). If
103
+ // for_compaction is true, then `snapshots` should be provided. Range
104
+ // tombstone fragments are dropped if they are not visible in any snapshot and
105
+ // user-defined timestamp is not enabled. That is, for each snapshot stripe
106
+ // [lower, upper], the range tombstone fragment with largest seqno in [lower,
107
+ // upper] is preserved, and all the other range tombstones are dropped.
92
108
  void FragmentTombstones(
93
109
  std::unique_ptr<InternalIterator> unfragmented_tombstones,
94
110
  const InternalKeyComparator& icmp, bool for_compaction,
@@ -96,6 +112,7 @@ struct FragmentedRangeTombstoneList {
96
112
 
97
113
  std::vector<RangeTombstoneStack> tombstones_;
98
114
  std::vector<SequenceNumber> tombstone_seqs_;
115
+ std::vector<Slice> tombstone_timestamps_;
99
116
  std::set<SequenceNumber> seq_set_;
100
117
  std::list<std::string> pinned_slices_;
101
118
  PinnedIteratorsManager pinned_iters_mgr_;
@@ -117,15 +134,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
117
134
  FragmentedRangeTombstoneIterator(
118
135
  const FragmentedRangeTombstoneList* tombstones,
119
136
  const InternalKeyComparator& icmp, SequenceNumber upper_bound,
120
- SequenceNumber lower_bound = 0);
137
+ const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
121
138
  FragmentedRangeTombstoneIterator(
122
139
  const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
123
140
  const InternalKeyComparator& icmp, SequenceNumber upper_bound,
124
- SequenceNumber lower_bound = 0);
141
+ const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
125
142
  FragmentedRangeTombstoneIterator(
126
143
  const std::shared_ptr<FragmentedRangeTombstoneListCache>& tombstones,
127
144
  const InternalKeyComparator& icmp, SequenceNumber upper_bound,
128
- SequenceNumber lower_bound = 0);
145
+ const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
129
146
 
130
147
  void SeekToFirst() override;
131
148
  void SeekToLast() override;
@@ -154,6 +171,8 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
154
171
  void TopPrev();
155
172
 
156
173
  bool Valid() const override;
174
+ // Note that key() and value() do not return correct timestamp.
175
+ // Caller should call timestamp() to get the current timestamp.
157
176
  Slice key() const override {
158
177
  MaybePinKey();
159
178
  return current_start_key_.Encode();
@@ -172,11 +191,28 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
172
191
  }
173
192
 
174
193
  RangeTombstone Tombstone() const {
194
+ assert(Valid());
195
+ if (icmp_->user_comparator()->timestamp_size()) {
196
+ return RangeTombstone(start_key(), end_key(), seq(), timestamp());
197
+ }
175
198
  return RangeTombstone(start_key(), end_key(), seq());
176
199
  }
200
+ // Note that start_key() and end_key() are not guaranteed to have the
201
+ // correct timestamp. User can call timestamp() to get the correct
202
+ // timestamp().
177
203
  Slice start_key() const { return pos_->start_key; }
178
204
  Slice end_key() const { return pos_->end_key; }
179
205
  SequenceNumber seq() const { return *seq_pos_; }
206
+ Slice timestamp() const {
207
+ // seqno and timestamp are stored in the same order.
208
+ return *tombstones_->ts_iter(seq_pos_ - tombstones_->seq_begin());
209
+ }
210
+ // Current use case is by CompactionRangeDelAggregator to set
211
+ // full_history_ts_low_.
212
+ void SetTimestampUpperBound(const Slice* ts_upper_bound) {
213
+ ts_upper_bound_ = ts_upper_bound;
214
+ }
215
+
180
216
  ParsedInternalKey parsed_start_key() const {
181
217
  return ParsedInternalKey(pos_->start_key, kMaxSequenceNumber,
182
218
  kTypeRangeDeletion);
@@ -186,6 +222,9 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
186
222
  kTypeRangeDeletion);
187
223
  }
188
224
 
225
+ // Return the max sequence number of a range tombstone that covers
226
+ // the given user key.
227
+ // If there is no covering tombstone, then 0 is returned.
189
228
  SequenceNumber MaxCoveringTombstoneSeqnum(const Slice& user_key);
190
229
 
191
230
  // Splits the iterator into n+1 iterators (where n is the number of
@@ -218,15 +257,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
218
257
 
219
258
  bool operator()(const RangeTombstoneStack& a,
220
259
  const RangeTombstoneStack& b) const {
221
- return cmp->Compare(a.start_key, b.start_key) < 0;
260
+ return cmp->CompareWithoutTimestamp(a.start_key, b.start_key) < 0;
222
261
  }
223
262
 
224
263
  bool operator()(const RangeTombstoneStack& a, const Slice& b) const {
225
- return cmp->Compare(a.start_key, b) < 0;
264
+ return cmp->CompareWithoutTimestamp(a.start_key, b) < 0;
226
265
  }
227
266
 
228
267
  bool operator()(const Slice& a, const RangeTombstoneStack& b) const {
229
- return cmp->Compare(a, b.start_key) < 0;
268
+ return cmp->CompareWithoutTimestamp(a, b.start_key) < 0;
230
269
  }
231
270
 
232
271
  const Comparator* cmp;
@@ -237,15 +276,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
237
276
 
238
277
  bool operator()(const RangeTombstoneStack& a,
239
278
  const RangeTombstoneStack& b) const {
240
- return cmp->Compare(a.end_key, b.end_key) < 0;
279
+ return cmp->CompareWithoutTimestamp(a.end_key, b.end_key) < 0;
241
280
  }
242
281
 
243
282
  bool operator()(const RangeTombstoneStack& a, const Slice& b) const {
244
- return cmp->Compare(a.end_key, b) < 0;
283
+ return cmp->CompareWithoutTimestamp(a.end_key, b) < 0;
245
284
  }
246
285
 
247
286
  bool operator()(const Slice& a, const RangeTombstoneStack& b) const {
248
- return cmp->Compare(a, b.end_key) < 0;
287
+ return cmp->CompareWithoutTimestamp(a, b.end_key) < 0;
249
288
  }
250
289
 
251
290
  const Comparator* cmp;
@@ -277,11 +316,38 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
277
316
  const FragmentedRangeTombstoneList* tombstones_;
278
317
  SequenceNumber upper_bound_;
279
318
  SequenceNumber lower_bound_;
319
+ // Only consider timestamps <= ts_upper_bound_.
320
+ const Slice* ts_upper_bound_;
280
321
  std::vector<RangeTombstoneStack>::const_iterator pos_;
281
322
  std::vector<SequenceNumber>::const_iterator seq_pos_;
282
323
  mutable std::vector<RangeTombstoneStack>::const_iterator pinned_pos_;
283
324
  mutable std::vector<SequenceNumber>::const_iterator pinned_seq_pos_;
284
325
  mutable InternalKey current_start_key_;
326
+
327
+ // Check the current RangeTombstoneStack `pos_` against timestamp
328
+ // upper bound `ts_upper_bound_` and sequence number upper bound
329
+ // `upper_bound_`. Update the sequence number (and timestamp) pointer
330
+ // `seq_pos_` to the first valid position satisfying both bounds.
331
+ void SetMaxVisibleSeqAndTimestamp() {
332
+ seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
333
+ tombstones_->seq_iter(pos_->seq_end_idx),
334
+ upper_bound_, std::greater<SequenceNumber>());
335
+ if (ts_upper_bound_ && !ts_upper_bound_->empty()) {
336
+ auto ts_pos = std::lower_bound(
337
+ tombstones_->ts_iter(pos_->seq_start_idx),
338
+ tombstones_->ts_iter(pos_->seq_end_idx), *ts_upper_bound_,
339
+ [this](const Slice& s1, const Slice& s2) {
340
+ return ucmp_->CompareTimestamp(s1, s2) > 0;
341
+ });
342
+ auto ts_idx = ts_pos - tombstones_->ts_iter(pos_->seq_start_idx);
343
+ auto seq_idx = seq_pos_ - tombstones_->seq_iter(pos_->seq_start_idx);
344
+ if (seq_idx < ts_idx) {
345
+ // seq and ts are ordered in non-increasing order. Only updates seq_pos_
346
+ // to a larger index for smaller sequence number and timestamp.
347
+ seq_pos_ = tombstones_->seq_iter(pos_->seq_start_idx + ts_idx);
348
+ }
349
+ }
350
+ }
285
351
  };
286
352
 
287
353
  } // namespace ROCKSDB_NAMESPACE
@@ -549,6 +549,7 @@ TEST_F(RangeTombstoneFragmenterTest, SeekOutOfBounds) {
549
549
  } // namespace ROCKSDB_NAMESPACE
550
550
 
551
551
  int main(int argc, char** argv) {
552
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
552
553
  ::testing::InitGoogleTest(&argc, argv);
553
554
  return RUN_ALL_TESTS();
554
555
  }
@@ -427,6 +427,7 @@ TEST_F(RepairTest, DbNameContainsTrailingSlash) {
427
427
  } // namespace ROCKSDB_NAMESPACE
428
428
 
429
429
  int main(int argc, char** argv) {
430
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
430
431
  ::testing::InitGoogleTest(&argc, argv);
431
432
  return RUN_ALL_TESTS();
432
433
  }