@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
@@ -1055,10 +1055,10 @@ Status DBImpl::CompactRangeInternal(const CompactRangeOptions& options,
1055
1055
  SelectColumnFamiliesForAtomicFlush(&cfds);
1056
1056
  mutex_.Unlock();
1057
1057
  s = AtomicFlushMemTables(cfds, fo, FlushReason::kManualCompaction,
1058
- false /* writes_stopped */);
1058
+ false /* entered_write_thread */);
1059
1059
  } else {
1060
1060
  s = FlushMemTable(cfd, fo, FlushReason::kManualCompaction,
1061
- false /* writes_stopped*/);
1061
+ false /* entered_write_thread */);
1062
1062
  }
1063
1063
  if (!s.ok()) {
1064
1064
  LogFlush(immutable_db_options_.info_log);
@@ -2016,9 +2016,16 @@ void DBImpl::GenerateFlushRequest(const autovector<ColumnFamilyData*>& cfds,
2016
2016
 
2017
2017
  Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2018
2018
  const FlushOptions& flush_options,
2019
- FlushReason flush_reason, bool writes_stopped) {
2019
+ FlushReason flush_reason,
2020
+ bool entered_write_thread) {
2020
2021
  // This method should not be called if atomic_flush is true.
2021
2022
  assert(!immutable_db_options_.atomic_flush);
2023
+ if (!flush_options.wait && write_controller_.IsStopped()) {
2024
+ std::ostringstream oss;
2025
+ oss << "Writes have been stopped, thus unable to perform manual flush. "
2026
+ "Please try again later after writes are resumed";
2027
+ return Status::TryAgain(oss.str());
2028
+ }
2022
2029
  Status s;
2023
2030
  if (!flush_options.allow_write_stall) {
2024
2031
  bool flush_needed = true;
@@ -2029,6 +2036,7 @@ Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2029
2036
  }
2030
2037
  }
2031
2038
 
2039
+ const bool needs_to_join_write_thread = !entered_write_thread;
2032
2040
  autovector<FlushRequest> flush_reqs;
2033
2041
  autovector<uint64_t> memtable_ids_to_wait;
2034
2042
  {
@@ -2037,7 +2045,7 @@ Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2037
2045
 
2038
2046
  WriteThread::Writer w;
2039
2047
  WriteThread::Writer nonmem_w;
2040
- if (!writes_stopped) {
2048
+ if (needs_to_join_write_thread) {
2041
2049
  write_thread_.EnterUnbatched(&w, &mutex_);
2042
2050
  if (two_write_queues_) {
2043
2051
  nonmem_write_thread_.EnterUnbatched(&nonmem_w, &mutex_);
@@ -2120,7 +2128,7 @@ Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2120
2128
  MaybeScheduleFlushOrCompaction();
2121
2129
  }
2122
2130
 
2123
- if (!writes_stopped) {
2131
+ if (needs_to_join_write_thread) {
2124
2132
  write_thread_.ExitUnbatched(&w);
2125
2133
  if (two_write_queues_) {
2126
2134
  nonmem_write_thread_.ExitUnbatched(&nonmem_w);
@@ -2156,7 +2164,14 @@ Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2156
2164
  Status DBImpl::AtomicFlushMemTables(
2157
2165
  const autovector<ColumnFamilyData*>& column_family_datas,
2158
2166
  const FlushOptions& flush_options, FlushReason flush_reason,
2159
- bool writes_stopped) {
2167
+ bool entered_write_thread) {
2168
+ assert(immutable_db_options_.atomic_flush);
2169
+ if (!flush_options.wait && write_controller_.IsStopped()) {
2170
+ std::ostringstream oss;
2171
+ oss << "Writes have been stopped, thus unable to perform manual flush. "
2172
+ "Please try again later after writes are resumed";
2173
+ return Status::TryAgain(oss.str());
2174
+ }
2160
2175
  Status s;
2161
2176
  if (!flush_options.allow_write_stall) {
2162
2177
  int num_cfs_to_flush = 0;
@@ -2173,6 +2188,7 @@ Status DBImpl::AtomicFlushMemTables(
2173
2188
  return s;
2174
2189
  }
2175
2190
  }
2191
+ const bool needs_to_join_write_thread = !entered_write_thread;
2176
2192
  FlushRequest flush_req;
2177
2193
  autovector<ColumnFamilyData*> cfds;
2178
2194
  {
@@ -2181,7 +2197,7 @@ Status DBImpl::AtomicFlushMemTables(
2181
2197
 
2182
2198
  WriteThread::Writer w;
2183
2199
  WriteThread::Writer nonmem_w;
2184
- if (!writes_stopped) {
2200
+ if (needs_to_join_write_thread) {
2185
2201
  write_thread_.EnterUnbatched(&w, &mutex_);
2186
2202
  if (two_write_queues_) {
2187
2203
  nonmem_write_thread_.EnterUnbatched(&nonmem_w, &mutex_);
@@ -2229,7 +2245,7 @@ Status DBImpl::AtomicFlushMemTables(
2229
2245
  MaybeScheduleFlushOrCompaction();
2230
2246
  }
2231
2247
 
2232
- if (!writes_stopped) {
2248
+ if (needs_to_join_write_thread) {
2233
2249
  write_thread_.ExitUnbatched(&w);
2234
2250
  if (two_write_queues_) {
2235
2251
  nonmem_write_thread_.ExitUnbatched(&nonmem_w);
@@ -3263,7 +3279,6 @@ Status DBImpl::BackgroundCompaction(bool* made_progress,
3263
3279
  TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:BeforeCompaction",
3264
3280
  c->column_family_data());
3265
3281
  assert(c->num_input_files(1) == 0);
3266
- assert(c->level() == 0);
3267
3282
  assert(c->column_family_data()->ioptions()->compaction_style ==
3268
3283
  kCompactionStyleFIFO);
3269
3284
 
@@ -3756,9 +3771,11 @@ void DBImpl::InstallSuperVersionAndScheduleWork(
3756
3771
  // triggered soon anyway.
3757
3772
  bottommost_files_mark_threshold_ = kMaxSequenceNumber;
3758
3773
  for (auto* my_cfd : *versions_->GetColumnFamilySet()) {
3759
- bottommost_files_mark_threshold_ = std::min(
3760
- bottommost_files_mark_threshold_,
3761
- my_cfd->current()->storage_info()->bottommost_files_mark_threshold());
3774
+ if (!my_cfd->ioptions()->allow_ingest_behind) {
3775
+ bottommost_files_mark_threshold_ = std::min(
3776
+ bottommost_files_mark_threshold_,
3777
+ my_cfd->current()->storage_info()->bottommost_files_mark_threshold());
3778
+ }
3762
3779
  }
3763
3780
 
3764
3781
  // Whenever we install new SuperVersion, we might need to issue new flushes or
@@ -31,18 +31,6 @@ Status DBImpl::TEST_SwitchWAL() {
31
31
  return s;
32
32
  }
33
33
 
34
- bool DBImpl::TEST_WALBufferIsEmpty(bool lock) {
35
- if (lock) {
36
- log_write_mutex_.Lock();
37
- }
38
- log::Writer* cur_log_writer = logs_.back().writer;
39
- auto res = cur_log_writer->TEST_BufferIsEmpty();
40
- if (lock) {
41
- log_write_mutex_.Unlock();
42
- }
43
- return res;
44
- }
45
-
46
34
  uint64_t DBImpl::TEST_MaxNextLevelOverlappingBytes(
47
35
  ColumnFamilyHandle* column_family) {
48
36
  ColumnFamilyData* cfd;
@@ -193,11 +193,14 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force,
193
193
  }
194
194
  }
195
195
 
196
+ IOOptions io_opts;
197
+ io_opts.do_not_recurse = true;
196
198
  for (auto& path : paths) {
197
199
  // set of all files in the directory. We'll exclude files that are still
198
200
  // alive in the subsequent processings.
199
201
  std::vector<std::string> files;
200
- Status s = env_->GetChildren(path, &files);
202
+ Status s = immutable_db_options_.fs->GetChildren(
203
+ path, io_opts, &files, /*IODebugContext*=*/nullptr);
201
204
  s.PermitUncheckedError(); // TODO: What should we do on error?
202
205
  for (const std::string& file : files) {
203
206
  uint64_t number;
@@ -223,7 +226,9 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force,
223
226
  // Add log files in wal_dir
224
227
  if (!immutable_db_options_.IsWalDirSameAsDBPath(dbname_)) {
225
228
  std::vector<std::string> log_files;
226
- Status s = env_->GetChildren(immutable_db_options_.wal_dir, &log_files);
229
+ Status s = immutable_db_options_.fs->GetChildren(
230
+ immutable_db_options_.wal_dir, io_opts, &log_files,
231
+ /*IODebugContext*=*/nullptr);
227
232
  s.PermitUncheckedError(); // TODO: What should we do on error?
228
233
  for (const std::string& log_file : log_files) {
229
234
  job_context->full_scan_candidate_files.emplace_back(
@@ -235,8 +240,9 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force,
235
240
  if (!immutable_db_options_.db_log_dir.empty() &&
236
241
  immutable_db_options_.db_log_dir != dbname_) {
237
242
  std::vector<std::string> info_log_files;
238
- Status s =
239
- env_->GetChildren(immutable_db_options_.db_log_dir, &info_log_files);
243
+ Status s = immutable_db_options_.fs->GetChildren(
244
+ immutable_db_options_.db_log_dir, io_opts, &info_log_files,
245
+ /*IODebugContext*=*/nullptr);
240
246
  s.PermitUncheckedError(); // TODO: What should we do on error?
241
247
  for (std::string& log_file : info_log_files) {
242
248
  job_context->full_scan_candidate_files.emplace_back(
@@ -163,8 +163,11 @@ DBOptions SanitizeOptions(const std::string& dbname, const DBOptions& src,
163
163
  // DeleteScheduler::CleanupDirectory on the same dir later, it will be
164
164
  // safe
165
165
  std::vector<std::string> filenames;
166
+ IOOptions io_opts;
167
+ io_opts.do_not_recurse = true;
166
168
  auto wal_dir = immutable_db_options.GetWalDir();
167
- Status s = result.env->GetChildren(wal_dir, &filenames);
169
+ Status s = immutable_db_options.fs->GetChildren(
170
+ wal_dir, io_opts, &filenames, /*IODebugContext*=*/nullptr);
168
171
  s.PermitUncheckedError(); //**TODO: What to do on error?
169
172
  for (std::string& filename : filenames) {
170
173
  if (filename.find(".log.trash", filename.length() -
@@ -432,7 +435,10 @@ Status DBImpl::Recover(
432
435
  s = env_->FileExists(current_fname);
433
436
  } else {
434
437
  s = Status::NotFound();
435
- Status io_s = env_->GetChildren(dbname_, &files_in_dbname);
438
+ IOOptions io_opts;
439
+ io_opts.do_not_recurse = true;
440
+ Status io_s = immutable_db_options_.fs->GetChildren(
441
+ dbname_, io_opts, &files_in_dbname, /*IODebugContext*=*/nullptr);
436
442
  if (!io_s.ok()) {
437
443
  s = io_s;
438
444
  files_in_dbname.clear();
@@ -498,7 +504,10 @@ Status DBImpl::Recover(
498
504
  }
499
505
  } else if (immutable_db_options_.best_efforts_recovery) {
500
506
  assert(files_in_dbname.empty());
501
- Status s = env_->GetChildren(dbname_, &files_in_dbname);
507
+ IOOptions io_opts;
508
+ io_opts.do_not_recurse = true;
509
+ Status s = immutable_db_options_.fs->GetChildren(
510
+ dbname_, io_opts, &files_in_dbname, /*IODebugContext*=*/nullptr);
502
511
  if (s.IsNotFound()) {
503
512
  return Status::InvalidArgument(dbname_,
504
513
  "does not exist (open for read only)");
@@ -570,7 +579,10 @@ Status DBImpl::Recover(
570
579
  // produced by an older version of rocksdb.
571
580
  auto wal_dir = immutable_db_options_.GetWalDir();
572
581
  if (!immutable_db_options_.best_efforts_recovery) {
573
- s = env_->GetChildren(wal_dir, &files_in_wal_dir);
582
+ IOOptions io_opts;
583
+ io_opts.do_not_recurse = true;
584
+ s = immutable_db_options_.fs->GetChildren(
585
+ wal_dir, io_opts, &files_in_wal_dir, /*IODebugContext*=*/nullptr);
574
586
  }
575
587
  if (s.IsNotFound()) {
576
588
  return Status::InvalidArgument("wal_dir not found", wal_dir);
@@ -678,7 +690,10 @@ Status DBImpl::Recover(
678
690
  } else if (normalized_dbname == normalized_wal_dir) {
679
691
  filenames = std::move(files_in_wal_dir);
680
692
  } else {
681
- s = env_->GetChildren(GetName(), &filenames);
693
+ IOOptions io_opts;
694
+ io_opts.do_not_recurse = true;
695
+ s = immutable_db_options_.fs->GetChildren(
696
+ GetName(), io_opts, &filenames, /*IODebugContext*=*/nullptr);
682
697
  }
683
698
  }
684
699
  if (s.ok()) {
@@ -1929,18 +1944,6 @@ Status DBImpl::Open(const DBOptions& db_options, const std::string& dbname,
1929
1944
 
1930
1945
  if (s.ok()) {
1931
1946
  for (auto cfd : *impl->versions_->GetColumnFamilySet()) {
1932
- if (cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
1933
- auto* vstorage = cfd->current()->storage_info();
1934
- for (int i = 1; i < vstorage->num_levels(); ++i) {
1935
- int num_files = vstorage->NumLevelFiles(i);
1936
- if (num_files > 0) {
1937
- s = Status::InvalidArgument(
1938
- "Not all files are at level 0. Cannot "
1939
- "open with FIFO compaction style.");
1940
- break;
1941
- }
1942
- }
1943
- }
1944
1947
  if (!cfd->mem()->IsSnapshotSupported()) {
1945
1948
  impl->is_snapshot_supported_ = false;
1946
1949
  }
@@ -2022,9 +2025,13 @@ Status DBImpl::Open(const DBOptions& db_options, const std::string& dbname,
2022
2025
  // Remove duplicate paths.
2023
2026
  std::sort(paths.begin(), paths.end());
2024
2027
  paths.erase(std::unique(paths.begin(), paths.end()), paths.end());
2028
+ IOOptions io_opts;
2029
+ io_opts.do_not_recurse = true;
2025
2030
  for (auto& path : paths) {
2026
2031
  std::vector<std::string> existing_files;
2027
- impl->immutable_db_options_.env->GetChildren(path, &existing_files)
2032
+ impl->immutable_db_options_.fs
2033
+ ->GetChildren(path, io_opts, &existing_files,
2034
+ /*IODebugContext*=*/nullptr)
2028
2035
  .PermitUncheckedError(); //**TODO: What do to on error?
2029
2036
  for (auto& file_name : existing_files) {
2030
2037
  uint64_t file_number;
@@ -2060,10 +2067,16 @@ Status DBImpl::Open(const DBOptions& db_options, const std::string& dbname,
2060
2067
  ROCKS_LOG_HEADER(impl->immutable_db_options_.info_log, "DB pointer %p",
2061
2068
  impl);
2062
2069
  LogFlush(impl->immutable_db_options_.info_log);
2063
- assert(impl->TEST_WALBufferIsEmpty());
2064
- // If the assert above fails then we need to FlushWAL before returning
2065
- // control back to the user.
2066
- if (!persist_options_status.ok()) {
2070
+ if (!impl->WALBufferIsEmpty()) {
2071
+ s = impl->FlushWAL(false);
2072
+ if (s.ok()) {
2073
+ // Sync is needed otherwise WAL buffered data might get lost after a
2074
+ // power reset.
2075
+ log::Writer* log_writer = impl->logs_.back().writer;
2076
+ s = log_writer->file()->Sync(impl->immutable_db_options_.use_fsync);
2077
+ }
2078
+ }
2079
+ if (s.ok() && !persist_options_status.ok()) {
2067
2080
  s = Status::IOError(
2068
2081
  "DB::Open() failed --- Unable to persist Options file",
2069
2082
  persist_options_status.ToString());
@@ -100,7 +100,11 @@ Status DBImplSecondary::FindNewLogNumbers(std::vector<uint64_t>* logs) {
100
100
  assert(logs != nullptr);
101
101
  std::vector<std::string> filenames;
102
102
  Status s;
103
- s = env_->GetChildren(immutable_db_options_.GetWalDir(), &filenames);
103
+ IOOptions io_opts;
104
+ io_opts.do_not_recurse = true;
105
+ s = immutable_db_options_.fs->GetChildren(immutable_db_options_.GetWalDir(),
106
+ io_opts, &filenames,
107
+ /*IODebugContext*=*/nullptr);
104
108
  if (s.IsNotFound()) {
105
109
  return Status::InvalidArgument("Failed to open wal_dir",
106
110
  immutable_db_options_.GetWalDir());
@@ -111,6 +111,17 @@ Status DBImpl::DeleteRange(const WriteOptions& write_options,
111
111
  return DB::DeleteRange(write_options, column_family, begin_key, end_key);
112
112
  }
113
113
 
114
+ Status DBImpl::DeleteRange(const WriteOptions& write_options,
115
+ ColumnFamilyHandle* column_family,
116
+ const Slice& begin_key, const Slice& end_key,
117
+ const Slice& ts) {
118
+ const Status s = FailIfTsMismatchCf(column_family, ts, /*ts_for_read=*/false);
119
+ if (!s.ok()) {
120
+ return s;
121
+ }
122
+ return DB::DeleteRange(write_options, column_family, begin_key, end_key, ts);
123
+ }
124
+
114
125
  void DBImpl::SetRecoverableStatePreReleaseCallback(
115
126
  PreReleaseCallback* callback) {
116
127
  recoverable_state_pre_release_callback_.reset(callback);
@@ -1749,6 +1760,7 @@ Status DBImpl::DelayWrite(uint64_t num_bytes,
1749
1760
  &time_delayed);
1750
1761
  uint64_t delay =
1751
1762
  write_controller_.GetDelay(immutable_db_options_.clock, num_bytes);
1763
+ TEST_SYNC_POINT("DBImpl::DelayWrite:Start");
1752
1764
  if (delay > 0) {
1753
1765
  if (write_options.no_slowdown) {
1754
1766
  return Status::Incomplete("Write stall");
@@ -1758,8 +1770,8 @@ Status DBImpl::DelayWrite(uint64_t num_bytes,
1758
1770
  // Notify write_thread_ about the stall so it can setup a barrier and
1759
1771
  // fail any pending writers with no_slowdown
1760
1772
  write_thread_.BeginWriteStall();
1761
- TEST_SYNC_POINT("DBImpl::DelayWrite:BeginWriteStallDone");
1762
1773
  mutex_.Unlock();
1774
+ TEST_SYNC_POINT("DBImpl::DelayWrite:BeginWriteStallDone");
1763
1775
  // We will delay the write until we have slept for `delay` microseconds
1764
1776
  // or we don't need a delay anymore. We check for cancellation every 1ms
1765
1777
  // (slightly longer because WriteController minimum delay is 1ms, in
@@ -1784,7 +1796,8 @@ Status DBImpl::DelayWrite(uint64_t num_bytes,
1784
1796
  // might wait here indefinitely as the background compaction may never
1785
1797
  // finish successfully, resulting in the stall condition lasting
1786
1798
  // indefinitely
1787
- while (error_handler_.GetBGError().ok() && write_controller_.IsStopped()) {
1799
+ while (error_handler_.GetBGError().ok() && write_controller_.IsStopped() &&
1800
+ !shutting_down_.load(std::memory_order_relaxed)) {
1788
1801
  if (write_options.no_slowdown) {
1789
1802
  return Status::Incomplete("Write stall");
1790
1803
  }
@@ -1810,9 +1823,13 @@ Status DBImpl::DelayWrite(uint64_t num_bytes,
1810
1823
  // proceed
1811
1824
  Status s;
1812
1825
  if (write_controller_.IsStopped()) {
1813
- // If writes are still stopped, it means we bailed due to a background
1814
- // error
1815
- s = Status::Incomplete(error_handler_.GetBGError().ToString());
1826
+ if (!shutting_down_.load(std::memory_order_relaxed)) {
1827
+ // If writes are still stopped and db not shutdown, it means we bailed
1828
+ // due to a background error
1829
+ s = Status::Incomplete(error_handler_.GetBGError().ToString());
1830
+ } else {
1831
+ s = Status::ShutdownInProgress("stalled writes");
1832
+ }
1816
1833
  }
1817
1834
  if (error_handler_.IsDBStopped()) {
1818
1835
  s = error_handler_.GetBGError();
@@ -2361,6 +2378,24 @@ Status DB::DeleteRange(const WriteOptions& opt,
2361
2378
  return Write(opt, &batch);
2362
2379
  }
2363
2380
 
2381
+ Status DB::DeleteRange(const WriteOptions& opt,
2382
+ ColumnFamilyHandle* column_family,
2383
+ const Slice& begin_key, const Slice& end_key,
2384
+ const Slice& ts) {
2385
+ ColumnFamilyHandle* default_cf = DefaultColumnFamily();
2386
+ assert(default_cf);
2387
+ const Comparator* const default_cf_ucmp = default_cf->GetComparator();
2388
+ assert(default_cf_ucmp);
2389
+ WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
2390
+ opt.protection_bytes_per_key,
2391
+ default_cf_ucmp->timestamp_size());
2392
+ Status s = batch.DeleteRange(column_family, begin_key, end_key, ts);
2393
+ if (!s.ok()) {
2394
+ return s;
2395
+ }
2396
+ return Write(opt, &batch);
2397
+ }
2398
+
2364
2399
  Status DB::Merge(const WriteOptions& opt, ColumnFamilyHandle* column_family,
2365
2400
  const Slice& key, const Slice& value) {
2366
2401
  WriteBatch batch(0 /* reserved_bytes */, 0 /* max_bytes */,
@@ -89,6 +89,7 @@ DBIter::DBIter(Env* _env, const ReadOptions& read_options,
89
89
  if (iter_.iter()) {
90
90
  iter_.iter()->SetPinnedItersMgr(&pinned_iters_mgr_);
91
91
  }
92
+ status_.PermitUncheckedError();
92
93
  assert(timestamp_size_ == user_comparator_.timestamp_size());
93
94
  }
94
95
 
@@ -652,6 +652,7 @@ TEST_F(DBIteratorStressTest, StressTest) {
652
652
  } // namespace ROCKSDB_NAMESPACE
653
653
 
654
654
  int main(int argc, char** argv) {
655
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
655
656
  ::testing::InitGoogleTest(&argc, argv);
656
657
  ParseCommandLineFlags(&argc, &argv, true);
657
658
  return RUN_ALL_TESTS();
@@ -3187,6 +3187,7 @@ TEST_F(DBIteratorTest, ReverseToForwardWithDisappearingKeys) {
3187
3187
  } // namespace ROCKSDB_NAMESPACE
3188
3188
 
3189
3189
  int main(int argc, char** argv) {
3190
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3190
3191
  ::testing::InitGoogleTest(&argc, argv);
3191
3192
  return RUN_ALL_TESTS();
3192
3193
  }
@@ -3232,6 +3232,28 @@ TEST_F(DBIteratorTest, BackwardIterationOnInplaceUpdateMemtable) {
3232
3232
  }
3233
3233
  }
3234
3234
 
3235
+ TEST_F(DBIteratorTest, IteratorRefreshReturnSV) {
3236
+ Options options = CurrentOptions();
3237
+ options.disable_auto_compactions = true;
3238
+ DestroyAndReopen(options);
3239
+ ASSERT_OK(
3240
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
3241
+ std::unique_ptr<Iterator> iter{db_->NewIterator(ReadOptions())};
3242
+ SyncPoint::GetInstance()->SetCallBack(
3243
+ "ArenaWrappedDBIter::Refresh:SV", [&](void*) {
3244
+ ASSERT_OK(db_->Put(WriteOptions(), "dummy", "new SV"));
3245
+ // This makes the local SV obselete.
3246
+ ASSERT_OK(Flush());
3247
+ SyncPoint::GetInstance()->DisableProcessing();
3248
+ });
3249
+ SyncPoint::GetInstance()->EnableProcessing();
3250
+ ASSERT_OK(iter->Refresh());
3251
+ iter.reset();
3252
+ // iter used to not cleanup SV, so the Close() below would hit an assertion
3253
+ // error.
3254
+ Close();
3255
+ }
3256
+
3235
3257
  } // namespace ROCKSDB_NAMESPACE
3236
3258
 
3237
3259
  int main(int argc, char** argv) {
@@ -879,6 +879,7 @@ TEST_P(DbMemtableKVChecksumTest, FlushWithCorruptAfterMemtableInsert) {
879
879
  } // namespace ROCKSDB_NAMESPACE
880
880
 
881
881
  int main(int argc, char** argv) {
882
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
882
883
  ::testing::InitGoogleTest(&argc, argv);
883
884
  return RUN_ALL_TESTS();
884
885
  }
@@ -515,6 +515,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithSamePaths) {
515
515
  #endif // OS_LINUX
516
516
 
517
517
  int main(int argc, char** argv) {
518
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
518
519
  ::testing::InitGoogleTest(&argc, argv);
519
520
  return RUN_ALL_TESTS();
520
521
  }
@@ -13,6 +13,7 @@
13
13
 
14
14
  namespace ROCKSDB_NAMESPACE {
15
15
 
16
+ // TODO(cbi): parameterize the test to cover user-defined timestamp cases
16
17
  class DBRangeDelTest : public DBTestBase {
17
18
  public:
18
19
  DBRangeDelTest() : DBTestBase("db_range_del_test", /*env_do_fsync=*/false) {}
@@ -1029,7 +1030,11 @@ TEST_F(DBRangeDelTest, CompactionTreatsSplitInputLevelDeletionAtomically) {
1029
1030
  options.level0_file_num_compaction_trigger = kNumFilesPerLevel;
1030
1031
  options.memtable_factory.reset(
1031
1032
  test::NewSpecialSkipListFactory(2 /* num_entries_flush */));
1032
- options.target_file_size_base = kValueBytes;
1033
+ // max file size could be 2x of target file size, so set it to half of that
1034
+ options.target_file_size_base = kValueBytes / 2;
1035
+ // disable dynamic_file_size, as it will cut L1 files into more files (than
1036
+ // kNumFilesPerLevel).
1037
+ options.level_compaction_dynamic_file_size = false;
1033
1038
  options.max_compaction_bytes = 1500;
1034
1039
  // i == 0: CompactFiles
1035
1040
  // i == 1: CompactRange
@@ -1100,6 +1105,12 @@ TEST_F(DBRangeDelTest, RangeTombstoneEndKeyAsSstableUpperBound) {
1100
1105
  test::NewSpecialSkipListFactory(2 /* num_entries_flush */));
1101
1106
  options.target_file_size_base = kValueBytes;
1102
1107
  options.disable_auto_compactions = true;
1108
+ // disable it for now, otherwise the L1 files are going be cut before data 1:
1109
+ // L1: [0] [1,4]
1110
+ // L2: [0,0]
1111
+ // because the grandparent file is between [0]->[1] and it's size is more than
1112
+ // 1/8 of target size (4k).
1113
+ options.level_compaction_dynamic_file_size = false;
1103
1114
 
1104
1115
  DestroyAndReopen(options);
1105
1116
 
@@ -1723,9 +1734,8 @@ TEST_F(DBRangeDelTest, OverlappedKeys) {
1723
1734
 
1724
1735
  ASSERT_OK(dbfull()->TEST_CompactRange(1, nullptr, nullptr, nullptr,
1725
1736
  true /* disallow_trivial_move */));
1726
- ASSERT_EQ(
1727
- 3, NumTableFilesAtLevel(
1728
- 2)); // L1->L2 compaction size is limited to max_compaction_bytes
1737
+ // L1->L2 compaction size is limited to max_compaction_bytes
1738
+ ASSERT_EQ(3, NumTableFilesAtLevel(2));
1729
1739
  ASSERT_EQ(0, NumTableFilesAtLevel(1));
1730
1740
  }
1731
1741
 
@@ -1974,6 +1984,40 @@ TEST_F(DBRangeDelTest, TombstoneFromCurrentLevel) {
1974
1984
  delete iter;
1975
1985
  }
1976
1986
 
1987
+ class TombstoneTestSstPartitioner : public SstPartitioner {
1988
+ public:
1989
+ const char* Name() const override { return "SingleKeySstPartitioner"; }
1990
+
1991
+ PartitionerResult ShouldPartition(
1992
+ const PartitionerRequest& request) override {
1993
+ if (cmp->Compare(*request.current_user_key, DBTestBase::Key(5)) == 0) {
1994
+ return kRequired;
1995
+ } else {
1996
+ return kNotRequired;
1997
+ }
1998
+ }
1999
+
2000
+ bool CanDoTrivialMove(const Slice& /*smallest_user_key*/,
2001
+ const Slice& /*largest_user_key*/) override {
2002
+ return false;
2003
+ }
2004
+
2005
+ const Comparator* cmp = BytewiseComparator();
2006
+ };
2007
+
2008
+ class TombstoneTestSstPartitionerFactory : public SstPartitionerFactory {
2009
+ public:
2010
+ static const char* kClassName() {
2011
+ return "TombstoneTestSstPartitionerFactory";
2012
+ }
2013
+ const char* Name() const override { return kClassName(); }
2014
+
2015
+ std::unique_ptr<SstPartitioner> CreatePartitioner(
2016
+ const SstPartitioner::Context& /* context */) const override {
2017
+ return std::unique_ptr<SstPartitioner>(new TombstoneTestSstPartitioner());
2018
+ }
2019
+ };
2020
+
1977
2021
  TEST_F(DBRangeDelTest, TombstoneAcrossFileBoundary) {
1978
2022
  // Verify that a range tombstone across file boundary covers keys from older
1979
2023
  // levels. Test set up:
@@ -1987,11 +2031,17 @@ TEST_F(DBRangeDelTest, TombstoneAcrossFileBoundary) {
1987
2031
  options.target_file_size_base = 2 * 1024;
1988
2032
  options.max_compaction_bytes = 2 * 1024;
1989
2033
 
2034
+ // Make sure L1 files are split before "5"
2035
+ auto factory = std::make_shared<TombstoneTestSstPartitionerFactory>();
2036
+ options.sst_partitioner_factory = factory;
2037
+
1990
2038
  DestroyAndReopen(options);
1991
2039
 
1992
2040
  Random rnd(301);
1993
2041
  // L2
1994
- ASSERT_OK(db_->Put(WriteOptions(), Key(5), rnd.RandomString(1 << 10)));
2042
+ // the file should be smaller than max_compaction_bytes, otherwise the file
2043
+ // will be cut before 7.
2044
+ ASSERT_OK(db_->Put(WriteOptions(), Key(5), rnd.RandomString(1 << 9)));
1995
2045
  ASSERT_OK(db_->Flush(FlushOptions()));
1996
2046
  MoveFilesToLevel(2);
1997
2047
  ASSERT_EQ(1, NumTableFilesAtLevel(2));
@@ -2687,6 +2737,23 @@ TEST_F(DBRangeDelTest, PrefixSentinelKey) {
2687
2737
  delete iter;
2688
2738
  }
2689
2739
 
2740
+ TEST_F(DBRangeDelTest, RefreshMemtableIter) {
2741
+ Options options = CurrentOptions();
2742
+ options.disable_auto_compactions = true;
2743
+ DestroyAndReopen(options);
2744
+ ASSERT_OK(
2745
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
2746
+ ReadOptions ro;
2747
+ ro.read_tier = kMemtableTier;
2748
+ std::unique_ptr<Iterator> iter{db_->NewIterator(ro)};
2749
+ ASSERT_OK(Flush());
2750
+ // First refresh reinits iter, which had a bug where
2751
+ // iter.memtable_range_tombstone_iter_ was not set to nullptr, and caused
2752
+ // subsequent refresh to double free.
2753
+ ASSERT_OK(iter->Refresh());
2754
+ ASSERT_OK(iter->Refresh());
2755
+ }
2756
+
2690
2757
  #endif // ROCKSDB_LITE
2691
2758
 
2692
2759
  } // namespace ROCKSDB_NAMESPACE