@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
@@ -170,13 +170,16 @@ class DBBlockCacheTest : public DBTestBase {
170
170
  #ifndef ROCKSDB_LITE
171
171
  const std::array<size_t, kNumCacheEntryRoles> GetCacheEntryRoleCountsBg() {
172
172
  // Verify in cache entry role stats
173
- ColumnFamilyHandleImpl* cfh =
174
- static_cast<ColumnFamilyHandleImpl*>(dbfull()->DefaultColumnFamily());
175
- InternalStats* internal_stats_ptr = cfh->cfd()->internal_stats();
176
- InternalStats::CacheEntryRoleStats stats;
177
- internal_stats_ptr->TEST_GetCacheEntryRoleStats(&stats,
178
- /*foreground=*/false);
179
- return stats.entry_counts;
173
+ std::array<size_t, kNumCacheEntryRoles> cache_entry_role_counts;
174
+ std::map<std::string, std::string> values;
175
+ EXPECT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
176
+ &values));
177
+ for (size_t i = 0; i < kNumCacheEntryRoles; ++i) {
178
+ auto role = static_cast<CacheEntryRole>(i);
179
+ cache_entry_role_counts[i] =
180
+ ParseSizeT(values[BlockCacheEntryStatsMapKeys::EntryCount(role)]);
181
+ }
182
+ return cache_entry_role_counts;
180
183
  }
181
184
  #endif // ROCKSDB_LITE
182
185
  };
@@ -1500,23 +1503,38 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
1500
1503
  dbfull()->DumpStats();
1501
1504
  ASSERT_EQ(scan_count, 1);
1502
1505
 
1503
- env_->MockSleepForSeconds(10000);
1506
+ env_->MockSleepForSeconds(60);
1507
+ ASSERT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
1508
+ &values));
1509
+ ASSERT_EQ(scan_count, 1);
1504
1510
  ASSERT_TRUE(
1505
1511
  db_->GetMapProperty(DB::Properties::kBlockCacheEntryStats, &values));
1506
1512
  ASSERT_EQ(scan_count, 2);
1507
1513
 
1508
1514
  env_->MockSleepForSeconds(10000);
1515
+ ASSERT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
1516
+ &values));
1517
+ ASSERT_EQ(scan_count, 3);
1518
+
1519
+ env_->MockSleepForSeconds(60);
1509
1520
  std::string value_str;
1521
+ ASSERT_TRUE(db_->GetProperty(DB::Properties::kFastBlockCacheEntryStats,
1522
+ &value_str));
1523
+ ASSERT_EQ(scan_count, 3);
1510
1524
  ASSERT_TRUE(
1511
1525
  db_->GetProperty(DB::Properties::kBlockCacheEntryStats, &value_str));
1512
- ASSERT_EQ(scan_count, 3);
1526
+ ASSERT_EQ(scan_count, 4);
1513
1527
 
1514
1528
  env_->MockSleepForSeconds(10000);
1529
+ ASSERT_TRUE(db_->GetProperty(DB::Properties::kFastBlockCacheEntryStats,
1530
+ &value_str));
1531
+ ASSERT_EQ(scan_count, 5);
1532
+
1515
1533
  ASSERT_TRUE(db_->GetProperty(DB::Properties::kCFStats, &value_str));
1516
1534
  // To match historical speed, querying this property no longer triggers
1517
1535
  // a scan, even if results are old. But periodic dump stats should keep
1518
1536
  // things reasonably updated.
1519
- ASSERT_EQ(scan_count, /*unchanged*/ 3);
1537
+ ASSERT_EQ(scan_count, /*unchanged*/ 5);
1520
1538
 
1521
1539
  SyncPoint::GetInstance()->DisableProcessing();
1522
1540
  SyncPoint::GetInstance()->ClearAllCallBacks();
@@ -1706,7 +1706,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
1706
1706
  ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
1707
1707
  Flush(1);
1708
1708
  EXPECT_EQ(policy->DumpTestReport(),
1709
- fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
1709
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
1710
1710
  : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
1711
1711
 
1712
1712
  for (int i = maxKey / 2; i < maxKey; i++) {
@@ -1714,7 +1714,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
1714
1714
  }
1715
1715
  Flush(1);
1716
1716
  EXPECT_EQ(policy->DumpTestReport(),
1717
- fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
1717
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
1718
1718
  : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
1719
1719
 
1720
1720
  // Check that they can be found
@@ -1738,7 +1738,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
1738
1738
  EXPECT_LE(useful_count, maxKey * 2 * (fifo ? 0.9995 : 0.98));
1739
1739
  }
1740
1740
 
1741
- if (!fifo) { // FIFO only has L0
1741
+ if (!fifo) { // FIFO doesn't fully support CompactRange
1742
1742
  // Full compaction
1743
1743
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
1744
1744
  nullptr));
@@ -2496,7 +2496,7 @@ TEST_F(DBBloomFilterTest, OptimizeFiltersForHits) {
2496
2496
  for (int i = 0; i < numkeys; i += 2) {
2497
2497
  keys.push_back(i);
2498
2498
  }
2499
- RandomShuffle(std::begin(keys), std::end(keys));
2499
+ RandomShuffle(std::begin(keys), std::end(keys), /*seed*/ 42);
2500
2500
  int num_inserted = 0;
2501
2501
  for (int key : keys) {
2502
2502
  ASSERT_OK(Put(1, Key(key), "val"));
@@ -3824,6 +3824,242 @@ TEST_F(DBCompactionTest, NoCompactBottomLevelFilesWithDeletions) {
3824
3824
  }
3825
3825
  }
3826
3826
 
3827
+ TEST_F(DBCompactionTest, RoundRobinTtlCompactionNormal) {
3828
+ Options options = CurrentOptions();
3829
+ options.compression = kNoCompression;
3830
+ options.level0_file_num_compaction_trigger = 20;
3831
+ options.ttl = 24 * 60 * 60; // 24 hours
3832
+ options.compaction_pri = kRoundRobin;
3833
+ env_->now_cpu_count_.store(0);
3834
+ env_->SetMockSleep();
3835
+ options.env = env_;
3836
+
3837
+ // add a small second for each wait time, to make sure the file is expired
3838
+ int small_seconds = 1;
3839
+
3840
+ std::atomic_int ttl_compactions{0};
3841
+ std::atomic_int round_robin_ttl_compactions{0};
3842
+ std::atomic_int other_compactions{0};
3843
+
3844
+ SyncPoint::GetInstance()->SetCallBack(
3845
+ "LevelCompactionPicker::PickCompaction:Return", [&](void* arg) {
3846
+ Compaction* compaction = reinterpret_cast<Compaction*>(arg);
3847
+ auto compaction_reason = compaction->compaction_reason();
3848
+ if (compaction_reason == CompactionReason::kTtl) {
3849
+ ttl_compactions++;
3850
+ } else if (compaction_reason == CompactionReason::kRoundRobinTtl) {
3851
+ round_robin_ttl_compactions++;
3852
+ } else {
3853
+ other_compactions++;
3854
+ }
3855
+ });
3856
+ SyncPoint::GetInstance()->EnableProcessing();
3857
+
3858
+ DestroyAndReopen(options);
3859
+
3860
+ // Setup the files from lower level to up level, each file is 1 hour's older
3861
+ // than the next one.
3862
+ // create 10 files on the last level (L6)
3863
+ for (int i = 0; i < 10; i++) {
3864
+ for (int j = 0; j < 100; j++) {
3865
+ ASSERT_OK(Put(Key(i * 100 + j), "value" + std::to_string(i * 100 + j)));
3866
+ }
3867
+ ASSERT_OK(Flush());
3868
+ env_->MockSleepForSeconds(60 * 60); // generate 1 file per hour
3869
+ }
3870
+ MoveFilesToLevel(6);
3871
+
3872
+ // create 5 files on L5
3873
+ for (int i = 0; i < 5; i++) {
3874
+ for (int j = 0; j < 200; j++) {
3875
+ ASSERT_OK(Put(Key(i * 200 + j), "value" + std::to_string(i * 200 + j)));
3876
+ }
3877
+ ASSERT_OK(Flush());
3878
+ env_->MockSleepForSeconds(60 * 60);
3879
+ }
3880
+ MoveFilesToLevel(5);
3881
+
3882
+ // create 3 files on L4
3883
+ for (int i = 0; i < 3; i++) {
3884
+ for (int j = 0; j < 300; j++) {
3885
+ ASSERT_OK(Put(Key(i * 300 + j), "value" + std::to_string(i * 300 + j)));
3886
+ }
3887
+ ASSERT_OK(Flush());
3888
+ env_->MockSleepForSeconds(60 * 60);
3889
+ }
3890
+ MoveFilesToLevel(4);
3891
+
3892
+ // The LSM tree should be like:
3893
+ // L4: [0, 299], [300, 599], [600, 899]
3894
+ // L5: [0, 199] [200, 399]...............[800, 999]
3895
+ // L6: [0,99][100,199][200,299][300,399]...............[800,899][900,999]
3896
+ ASSERT_EQ("0,0,0,0,3,5,10", FilesPerLevel());
3897
+
3898
+ // make sure the first L5 file is expired
3899
+ env_->MockSleepForSeconds(16 * 60 * 60 + small_seconds++);
3900
+
3901
+ // trigger TTL compaction
3902
+ ASSERT_OK(Put(Key(4), "value" + std::to_string(1)));
3903
+ ASSERT_OK(Put(Key(5), "value" + std::to_string(1)));
3904
+ ASSERT_OK(Flush());
3905
+
3906
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3907
+
3908
+ // verify there's a RoundRobin TTL compaction
3909
+ ASSERT_EQ(1, round_robin_ttl_compactions);
3910
+ round_robin_ttl_compactions = 0;
3911
+
3912
+ // expire 2 more files
3913
+ env_->MockSleepForSeconds(2 * 60 * 60 + small_seconds++);
3914
+ // trigger TTL compaction
3915
+ ASSERT_OK(Put(Key(4), "value" + std::to_string(2)));
3916
+ ASSERT_OK(Put(Key(5), "value" + std::to_string(2)));
3917
+ ASSERT_OK(Flush());
3918
+
3919
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3920
+
3921
+ ASSERT_EQ(2, round_robin_ttl_compactions);
3922
+ round_robin_ttl_compactions = 0;
3923
+
3924
+ // expire 4 more files, 2 out of 3 files on L4 are expired
3925
+ env_->MockSleepForSeconds(4 * 60 * 60 + small_seconds++);
3926
+ // trigger TTL compaction
3927
+ ASSERT_OK(Put(Key(6), "value" + std::to_string(3)));
3928
+ ASSERT_OK(Put(Key(7), "value" + std::to_string(3)));
3929
+ ASSERT_OK(Flush());
3930
+
3931
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3932
+
3933
+ ASSERT_EQ(1, NumTableFilesAtLevel(4));
3934
+ ASSERT_EQ(0, NumTableFilesAtLevel(5));
3935
+
3936
+ ASSERT_GT(round_robin_ttl_compactions, 0);
3937
+ round_robin_ttl_compactions = 0;
3938
+
3939
+ // make the first L0 file expired, which triggers a normal TTL compaction
3940
+ // instead of roundrobin TTL compaction, it will also include an extra file
3941
+ // from L0 because of overlap
3942
+ ASSERT_EQ(0, ttl_compactions);
3943
+ env_->MockSleepForSeconds(19 * 60 * 60 + small_seconds++);
3944
+
3945
+ // trigger TTL compaction
3946
+ ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
3947
+ ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
3948
+ ASSERT_OK(Flush());
3949
+
3950
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3951
+
3952
+ // L0 -> L1 compaction is normal TTL compaction, L1 -> next levels compactions
3953
+ // are RoundRobin TTL compaction.
3954
+ ASSERT_GT(ttl_compactions, 0);
3955
+ ttl_compactions = 0;
3956
+ ASSERT_GT(round_robin_ttl_compactions, 0);
3957
+ round_robin_ttl_compactions = 0;
3958
+
3959
+ // All files are expired, so only the last level has data
3960
+ env_->MockSleepForSeconds(24 * 60 * 60);
3961
+ // trigger TTL compaction
3962
+ ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
3963
+ ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
3964
+ ASSERT_OK(Flush());
3965
+
3966
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3967
+ ASSERT_EQ("0,0,0,0,0,0,2", FilesPerLevel());
3968
+
3969
+ ASSERT_GT(ttl_compactions, 0);
3970
+ ttl_compactions = 0;
3971
+ ASSERT_GT(round_robin_ttl_compactions, 0);
3972
+ round_robin_ttl_compactions = 0;
3973
+
3974
+ ASSERT_EQ(0, other_compactions);
3975
+ }
3976
+
3977
+ TEST_F(DBCompactionTest, RoundRobinTtlCompactionUnsortedTime) {
3978
+ // This is to test the case that the RoundRobin compaction cursor not pointing
3979
+ // to the oldest file, RoundRobin compaction should still compact the file
3980
+ // after cursor until all expired files are compacted.
3981
+ Options options = CurrentOptions();
3982
+ options.compression = kNoCompression;
3983
+ options.level0_file_num_compaction_trigger = 20;
3984
+ options.ttl = 24 * 60 * 60; // 24 hours
3985
+ options.compaction_pri = kRoundRobin;
3986
+ env_->now_cpu_count_.store(0);
3987
+ env_->SetMockSleep();
3988
+ options.env = env_;
3989
+
3990
+ std::atomic_int ttl_compactions{0};
3991
+ std::atomic_int round_robin_ttl_compactions{0};
3992
+ std::atomic_int other_compactions{0};
3993
+
3994
+ SyncPoint::GetInstance()->SetCallBack(
3995
+ "LevelCompactionPicker::PickCompaction:Return", [&](void* arg) {
3996
+ Compaction* compaction = reinterpret_cast<Compaction*>(arg);
3997
+ auto compaction_reason = compaction->compaction_reason();
3998
+ if (compaction_reason == CompactionReason::kTtl) {
3999
+ ttl_compactions++;
4000
+ } else if (compaction_reason == CompactionReason::kRoundRobinTtl) {
4001
+ round_robin_ttl_compactions++;
4002
+ } else {
4003
+ other_compactions++;
4004
+ }
4005
+ });
4006
+ SyncPoint::GetInstance()->EnableProcessing();
4007
+
4008
+ DestroyAndReopen(options);
4009
+
4010
+ // create 10 files on the last level (L6)
4011
+ for (int i = 0; i < 10; i++) {
4012
+ for (int j = 0; j < 100; j++) {
4013
+ ASSERT_OK(Put(Key(i * 100 + j), "value" + std::to_string(i * 100 + j)));
4014
+ }
4015
+ ASSERT_OK(Flush());
4016
+ env_->MockSleepForSeconds(60 * 60); // generate 1 file per hour
4017
+ }
4018
+ MoveFilesToLevel(6);
4019
+
4020
+ // create 5 files on L5
4021
+ for (int i = 0; i < 5; i++) {
4022
+ for (int j = 0; j < 200; j++) {
4023
+ ASSERT_OK(Put(Key(i * 200 + j), "value" + std::to_string(i * 200 + j)));
4024
+ }
4025
+ ASSERT_OK(Flush());
4026
+ env_->MockSleepForSeconds(60 * 60); // 1 hour
4027
+ }
4028
+ MoveFilesToLevel(5);
4029
+
4030
+ // The LSM tree should be like:
4031
+ // L5: [0, 199] [200, 399] [400,599] [600,799] [800, 999]
4032
+ // L6: [0,99][100,199][200,299][300,399]....................[800,899][900,999]
4033
+ ASSERT_EQ("0,0,0,0,0,5,10", FilesPerLevel());
4034
+
4035
+ // point the compaction cursor to the 4th file on L5
4036
+ VersionSet* const versions = dbfull()->GetVersionSet();
4037
+ assert(versions);
4038
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
4039
+ ASSERT_NE(cfd, nullptr);
4040
+ Version* const current = cfd->current();
4041
+ ASSERT_NE(current, nullptr);
4042
+ VersionStorageInfo* storage_info = current->storage_info();
4043
+ ASSERT_NE(storage_info, nullptr);
4044
+ const InternalKey split_cursor = InternalKey(Key(600), 100000, kTypeValue);
4045
+ storage_info->AddCursorForOneLevel(5, split_cursor);
4046
+
4047
+ // make the first file on L5 expired, there should be 3 TTL compactions:
4048
+ // 4th one, 5th one, then 1st one.
4049
+ env_->MockSleepForSeconds(19 * 60 * 60 + 1);
4050
+ // trigger TTL compaction
4051
+ ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
4052
+ ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
4053
+ ASSERT_OK(Flush());
4054
+
4055
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
4056
+ ASSERT_EQ(2, NumTableFilesAtLevel(5));
4057
+
4058
+ ASSERT_EQ(3, round_robin_ttl_compactions);
4059
+ ASSERT_EQ(0, ttl_compactions);
4060
+ ASSERT_EQ(0, other_compactions);
4061
+ }
4062
+
3827
4063
  TEST_F(DBCompactionTest, LevelCompactExpiredTtlFiles) {
3828
4064
  const int kNumKeysPerFile = 32;
3829
4065
  const int kNumLevelFiles = 2;
@@ -7958,6 +8194,42 @@ TEST_F(DBCompactionTest, BottomPriCompactionCountsTowardConcurrencyLimit) {
7958
8194
  compact_range_thread.join();
7959
8195
  }
7960
8196
 
8197
+ TEST_F(DBCompactionTest, BottommostFileCompactionAllowIngestBehind) {
8198
+ // allow_ingest_behind prevents seqnum zeroing, and could cause
8199
+ // compaction loop with reason kBottommostFiles.
8200
+ Options options = CurrentOptions();
8201
+ options.env = env_;
8202
+ options.compaction_style = kCompactionStyleLevel;
8203
+ options.allow_ingest_behind = true;
8204
+ options.comparator = BytewiseComparator();
8205
+ DestroyAndReopen(options);
8206
+
8207
+ WriteOptions write_opts;
8208
+ ASSERT_OK(db_->Put(write_opts, "infinite", "compaction loop"));
8209
+ ASSERT_OK(db_->Put(write_opts, "infinite", "loop"));
8210
+
8211
+ ASSERT_OK(Flush());
8212
+ MoveFilesToLevel(1);
8213
+ ASSERT_OK(db_->Put(write_opts, "bumpseqnum", ""));
8214
+ ASSERT_OK(Flush());
8215
+ auto snapshot = db_->GetSnapshot();
8216
+ // Bump up oldest_snapshot_seqnum_ in VersionStorageInfo.
8217
+ db_->ReleaseSnapshot(snapshot);
8218
+ bool compacted = false;
8219
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8220
+ "LevelCompactionPicker::PickCompaction:Return", [&](void* /* arg */) {
8221
+ // There should not be a compaction.
8222
+ compacted = true;
8223
+ });
8224
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8225
+ // Wait for compaction to be scheduled.
8226
+ env_->SleepForMicroseconds(2000000);
8227
+ ASSERT_FALSE(compacted);
8228
+ // The following assert can be used to check for compaction loop:
8229
+ // it used to wait forever before the fix.
8230
+ // ASSERT_OK(dbfull()->TEST_WaitForCompact(true /* wait_unscheduled */));
8231
+ }
8232
+
7961
8233
  #endif // !defined(ROCKSDB_LITE)
7962
8234
 
7963
8235
  } // namespace ROCKSDB_NAMESPACE
@@ -3032,6 +3032,44 @@ TEST_P(DBAtomicFlushTest, BgThreadNoWaitAfterManifestError) {
3032
3032
  SyncPoint::GetInstance()->ClearAllCallBacks();
3033
3033
  }
3034
3034
 
3035
+ TEST_P(DBAtomicFlushTest, NoWaitWhenWritesStopped) {
3036
+ Options options = GetDefaultOptions();
3037
+ options.create_if_missing = true;
3038
+ options.atomic_flush = GetParam();
3039
+ options.max_write_buffer_number = 2;
3040
+ options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
3041
+
3042
+ Reopen(options);
3043
+
3044
+ SyncPoint::GetInstance()->DisableProcessing();
3045
+ SyncPoint::GetInstance()->LoadDependency(
3046
+ {{"DBImpl::DelayWrite:Start",
3047
+ "DBAtomicFlushTest::NoWaitWhenWritesStopped:0"}});
3048
+ SyncPoint::GetInstance()->EnableProcessing();
3049
+
3050
+ ASSERT_OK(dbfull()->PauseBackgroundWork());
3051
+ for (int i = 0; i < options.max_write_buffer_number; ++i) {
3052
+ ASSERT_OK(Put("k" + std::to_string(i), "v" + std::to_string(i)));
3053
+ }
3054
+ std::thread stalled_writer([&]() { ASSERT_OK(Put("k", "v")); });
3055
+
3056
+ TEST_SYNC_POINT("DBAtomicFlushTest::NoWaitWhenWritesStopped:0");
3057
+
3058
+ {
3059
+ FlushOptions flush_opts;
3060
+ flush_opts.wait = false;
3061
+ flush_opts.allow_write_stall = true;
3062
+ ASSERT_TRUE(db_->Flush(flush_opts).IsTryAgain());
3063
+ }
3064
+
3065
+ ASSERT_OK(dbfull()->ContinueBackgroundWork());
3066
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
3067
+
3068
+ stalled_writer.join();
3069
+
3070
+ SyncPoint::GetInstance()->DisableProcessing();
3071
+ }
3072
+
3035
3073
  INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
3036
3074
  testing::Bool());
3037
3075
 
@@ -847,11 +847,13 @@ Status DBImpl::RegisterRecordSeqnoTimeWorker() {
847
847
  InstrumentedMutexLock l(&mutex_);
848
848
 
849
849
  for (auto cfd : *versions_->GetColumnFamilySet()) {
850
- uint64_t preclude_last_option =
851
- cfd->ioptions()->preclude_last_level_data_seconds;
852
- if (!cfd->IsDropped() && preclude_last_option > 0) {
853
- min_time_duration = std::min(preclude_last_option, min_time_duration);
854
- max_time_duration = std::max(preclude_last_option, max_time_duration);
850
+ // preserve time is the max of 2 options.
851
+ uint64_t preserve_time_duration =
852
+ std::max(cfd->ioptions()->preserve_internal_time_seconds,
853
+ cfd->ioptions()->preclude_last_level_data_seconds);
854
+ if (!cfd->IsDropped() && preserve_time_duration > 0) {
855
+ min_time_duration = std::min(preserve_time_duration, min_time_duration);
856
+ max_time_duration = std::max(preserve_time_duration, max_time_duration);
855
857
  }
856
858
  }
857
859
  if (min_time_duration == std::numeric_limits<uint64_t>::max()) {
@@ -863,8 +865,11 @@ Status DBImpl::RegisterRecordSeqnoTimeWorker() {
863
865
 
864
866
  uint64_t seqno_time_cadence = 0;
865
867
  if (min_time_duration != std::numeric_limits<uint64_t>::max()) {
868
+ // round up to 1 when the time_duration is smaller than
869
+ // kMaxSeqnoTimePairsPerCF
866
870
  seqno_time_cadence =
867
- min_time_duration / SeqnoToTimeMapping::kMaxSeqnoTimePairsPerCF;
871
+ (min_time_duration + SeqnoToTimeMapping::kMaxSeqnoTimePairsPerCF - 1) /
872
+ SeqnoToTimeMapping::kMaxSeqnoTimePairsPerCF;
868
873
  }
869
874
 
870
875
  Status s;
@@ -1453,6 +1458,18 @@ Status DBImpl::FlushWAL(bool sync) {
1453
1458
  return SyncWAL();
1454
1459
  }
1455
1460
 
1461
+ bool DBImpl::WALBufferIsEmpty(bool lock) {
1462
+ if (lock) {
1463
+ log_write_mutex_.Lock();
1464
+ }
1465
+ log::Writer* cur_log_writer = logs_.back().writer;
1466
+ auto res = cur_log_writer->BufferIsEmpty();
1467
+ if (lock) {
1468
+ log_write_mutex_.Unlock();
1469
+ }
1470
+ return res;
1471
+ }
1472
+
1456
1473
  Status DBImpl::SyncWAL() {
1457
1474
  TEST_SYNC_POINT("DBImpl::SyncWAL:Begin");
1458
1475
  autovector<log::Writer*, 1> logs_to_sync;
@@ -3091,7 +3108,8 @@ Status DBImpl::CreateColumnFamilyImpl(const ColumnFamilyOptions& cf_options,
3091
3108
  }
3092
3109
  } // InstrumentedMutexLock l(&mutex_)
3093
3110
 
3094
- if (cf_options.preclude_last_level_data_seconds > 0) {
3111
+ if (cf_options.preserve_internal_time_seconds > 0 ||
3112
+ cf_options.preclude_last_level_data_seconds > 0) {
3095
3113
  s = RegisterRecordSeqnoTimeWorker();
3096
3114
  }
3097
3115
  sv_context.Clean();
@@ -3182,7 +3200,8 @@ Status DBImpl::DropColumnFamilyImpl(ColumnFamilyHandle* column_family) {
3182
3200
  bg_cv_.SignalAll();
3183
3201
  }
3184
3202
 
3185
- if (cfd->ioptions()->preclude_last_level_data_seconds > 0) {
3203
+ if (cfd->ioptions()->preserve_internal_time_seconds > 0 ||
3204
+ cfd->ioptions()->preclude_last_level_data_seconds > 0) {
3186
3205
  s = RegisterRecordSeqnoTimeWorker();
3187
3206
  }
3188
3207
 
@@ -3662,14 +3681,16 @@ void DBImpl::ReleaseSnapshot(const Snapshot* s) {
3662
3681
  if (oldest_snapshot > bottommost_files_mark_threshold_) {
3663
3682
  CfdList cf_scheduled;
3664
3683
  for (auto* cfd : *versions_->GetColumnFamilySet()) {
3665
- cfd->current()->storage_info()->UpdateOldestSnapshot(oldest_snapshot);
3666
- if (!cfd->current()
3667
- ->storage_info()
3668
- ->BottommostFilesMarkedForCompaction()
3669
- .empty()) {
3670
- SchedulePendingCompaction(cfd);
3671
- MaybeScheduleFlushOrCompaction();
3672
- cf_scheduled.push_back(cfd);
3684
+ if (!cfd->ioptions()->allow_ingest_behind) {
3685
+ cfd->current()->storage_info()->UpdateOldestSnapshot(oldest_snapshot);
3686
+ if (!cfd->current()
3687
+ ->storage_info()
3688
+ ->BottommostFilesMarkedForCompaction()
3689
+ .empty()) {
3690
+ SchedulePendingCompaction(cfd);
3691
+ MaybeScheduleFlushOrCompaction();
3692
+ cf_scheduled.push_back(cfd);
3693
+ }
3673
3694
  }
3674
3695
  }
3675
3696
 
@@ -3678,7 +3699,8 @@ void DBImpl::ReleaseSnapshot(const Snapshot* s) {
3678
3699
  // mutex might be unlocked during the loop, making the result inaccurate.
3679
3700
  SequenceNumber new_bottommost_files_mark_threshold = kMaxSequenceNumber;
3680
3701
  for (auto* cfd : *versions_->GetColumnFamilySet()) {
3681
- if (CfdListContains(cf_scheduled, cfd)) {
3702
+ if (CfdListContains(cf_scheduled, cfd) ||
3703
+ cfd->ioptions()->allow_ingest_behind) {
3682
3704
  continue;
3683
3705
  }
3684
3706
  new_bottommost_files_mark_threshold = std::min(
@@ -4391,10 +4413,14 @@ Status DBImpl::CheckConsistency() {
4391
4413
  }
4392
4414
  files_by_directory[md.db_path].push_back(fname);
4393
4415
  }
4416
+
4417
+ IOOptions io_opts;
4418
+ io_opts.do_not_recurse = true;
4394
4419
  for (const auto& dir_files : files_by_directory) {
4395
4420
  std::string directory = dir_files.first;
4396
4421
  std::vector<std::string> existing_files;
4397
- Status s = env_->GetChildren(directory, &existing_files);
4422
+ Status s = fs_->GetChildren(directory, io_opts, &existing_files,
4423
+ /*IODebugContext*=*/nullptr);
4398
4424
  if (!s.ok()) {
4399
4425
  corruption_messages +=
4400
4426
  "Can't list files in " + directory + ": " + s.ToString() + "\n";
@@ -4576,8 +4602,12 @@ Status DestroyDB(const std::string& dbname, const Options& options,
4576
4602
  // Reset the logger because it holds a handle to the
4577
4603
  // log file and prevents cleanup and directory removal
4578
4604
  soptions.info_log.reset();
4605
+ IOOptions io_opts;
4579
4606
  // Ignore error in case directory does not exist
4580
- env->GetChildren(dbname, &filenames).PermitUncheckedError();
4607
+ soptions.fs
4608
+ ->GetChildren(dbname, io_opts, &filenames,
4609
+ /*IODebugContext*=*/nullptr)
4610
+ .PermitUncheckedError();
4581
4611
 
4582
4612
  FileLock* lock;
4583
4613
  const std::string lockname = LockFileName(dbname);
@@ -4617,8 +4647,12 @@ Status DestroyDB(const std::string& dbname, const Options& options,
4617
4647
  paths.insert(cf_path.path);
4618
4648
  }
4619
4649
  }
4650
+
4620
4651
  for (const auto& path : paths) {
4621
- if (env->GetChildren(path, &filenames).ok()) {
4652
+ if (soptions.fs
4653
+ ->GetChildren(path, io_opts, &filenames,
4654
+ /*IODebugContext*=*/nullptr)
4655
+ .ok()) {
4622
4656
  for (const auto& fname : filenames) {
4623
4657
  if (ParseFileName(fname, &number, &type) &&
4624
4658
  (type == kTableFile ||
@@ -4640,7 +4674,11 @@ Status DestroyDB(const std::string& dbname, const Options& options,
4640
4674
  std::string archivedir = ArchivalDirectory(dbname);
4641
4675
  bool wal_dir_exists = false;
4642
4676
  if (!soptions.IsWalDirSameAsDBPath(dbname)) {
4643
- wal_dir_exists = env->GetChildren(soptions.wal_dir, &walDirFiles).ok();
4677
+ wal_dir_exists =
4678
+ soptions.fs
4679
+ ->GetChildren(soptions.wal_dir, io_opts, &walDirFiles,
4680
+ /*IODebugContext*=*/nullptr)
4681
+ .ok();
4644
4682
  archivedir = ArchivalDirectory(soptions.wal_dir);
4645
4683
  }
4646
4684
 
@@ -4648,7 +4686,10 @@ Status DestroyDB(const std::string& dbname, const Options& options,
4648
4686
  // processed and removed before those otherwise we have issues
4649
4687
  // removing them
4650
4688
  std::vector<std::string> archiveFiles;
4651
- if (env->GetChildren(archivedir, &archiveFiles).ok()) {
4689
+ if (soptions.fs
4690
+ ->GetChildren(archivedir, io_opts, &archiveFiles,
4691
+ /*IODebugContext*=*/nullptr)
4692
+ .ok()) {
4652
4693
  // Delete archival files.
4653
4694
  for (const auto& file : archiveFiles) {
4654
4695
  if (ParseFileName(file, &number, &type) && type == kWalFile) {
@@ -4789,7 +4830,10 @@ Status DBImpl::DeleteObsoleteOptionsFiles() {
4789
4830
  // to the oldest.
4790
4831
  std::map<uint64_t, std::string> options_filenames;
4791
4832
  Status s;
4792
- s = GetEnv()->GetChildren(GetName(), &filenames);
4833
+ IOOptions io_opts;
4834
+ io_opts.do_not_recurse = true;
4835
+ s = fs_->GetChildren(GetName(), io_opts, &filenames,
4836
+ /*IODebugContext*=*/nullptr);
4793
4837
  if (!s.ok()) {
4794
4838
  return s;
4795
4839
  }
@@ -5247,7 +5291,7 @@ Status DBImpl::IngestExternalFiles(
5247
5291
  mutex_.Unlock();
5248
5292
  status = AtomicFlushMemTables(cfds_to_flush, flush_opts,
5249
5293
  FlushReason::kExternalFileIngestion,
5250
- true /* writes_stopped */);
5294
+ true /* entered_write_thread */);
5251
5295
  mutex_.Lock();
5252
5296
  } else {
5253
5297
  for (size_t i = 0; i != num_cfs; ++i) {
@@ -5258,7 +5302,7 @@ Status DBImpl::IngestExternalFiles(
5258
5302
  ->cfd();
5259
5303
  status = FlushMemTable(cfd, flush_opts,
5260
5304
  FlushReason::kExternalFileIngestion,
5261
- true /* writes_stopped */);
5305
+ true /* entered_write_thread */);
5262
5306
  mutex_.Lock();
5263
5307
  if (!status.ok()) {
5264
5308
  break;
@@ -222,6 +222,9 @@ class DBImpl : public DB {
222
222
  Status DeleteRange(const WriteOptions& options,
223
223
  ColumnFamilyHandle* column_family, const Slice& begin_key,
224
224
  const Slice& end_key) override;
225
+ Status DeleteRange(const WriteOptions& options,
226
+ ColumnFamilyHandle* column_family, const Slice& begin_key,
227
+ const Slice& end_key, const Slice& ts) override;
225
228
 
226
229
  using DB::Write;
227
230
  virtual Status Write(const WriteOptions& options,
@@ -423,7 +426,7 @@ class DBImpl : public DB {
423
426
  const FlushOptions& options,
424
427
  const std::vector<ColumnFamilyHandle*>& column_families) override;
425
428
  virtual Status FlushWAL(bool sync) override;
426
- bool TEST_WALBufferIsEmpty(bool lock = true);
429
+ bool WALBufferIsEmpty(bool lock = true);
427
430
  virtual Status SyncWAL() override;
428
431
  virtual Status LockWAL() override;
429
432
  virtual Status UnlockWAL() override;
@@ -1877,12 +1880,13 @@ class DBImpl : public DB {
1877
1880
 
1878
1881
  // Force current memtable contents to be flushed.
1879
1882
  Status FlushMemTable(ColumnFamilyData* cfd, const FlushOptions& options,
1880
- FlushReason flush_reason, bool writes_stopped = false);
1883
+ FlushReason flush_reason,
1884
+ bool entered_write_thread = false);
1881
1885
 
1882
1886
  Status AtomicFlushMemTables(
1883
1887
  const autovector<ColumnFamilyData*>& column_family_datas,
1884
1888
  const FlushOptions& options, FlushReason flush_reason,
1885
- bool writes_stopped = false);
1889
+ bool entered_write_thread = false);
1886
1890
 
1887
1891
  // Wait until flushing this column family won't stall writes
1888
1892
  Status WaitUntilFlushWouldNotStallWrites(ColumnFamilyData* cfd,