@nxtedition/rocksdb 9.0.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/binding.cc +244 -177
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
  3. package/deps/rocksdb/rocksdb/Makefile +15 -6
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +17 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +202 -7
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
  19. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +314 -25
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +29 -4
  22. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
  24. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  27. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  28. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
  29. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  30. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
  32. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  34. package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
  35. package/deps/rocksdb/rocksdb/db/c.cc +64 -0
  36. package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
  37. package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
  38. package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
  39. package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
  51. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
  52. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  53. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
  54. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
  55. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
  58. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
  71. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  72. package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
  73. package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
  74. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  75. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  76. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  77. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
  78. package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
  79. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
  80. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  82. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  83. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  84. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
  85. package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
  86. package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
  87. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
  88. package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
  89. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
  90. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
  91. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
  92. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  93. package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
  94. package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
  95. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
  96. package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
  98. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
  99. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
  100. package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
  101. package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
  102. package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
  103. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
  104. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  105. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  106. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  107. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  108. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
  109. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  110. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  112. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  113. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  114. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  115. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
  116. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  117. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  118. package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
  119. package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
  121. package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
  122. package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
  123. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  124. package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
  125. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  126. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  127. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  128. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  129. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  130. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  131. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
  149. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
  150. package/deps/rocksdb/rocksdb/env/env.cc +5 -0
  151. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
  152. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
  153. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
  154. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
  155. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
  157. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
  158. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
  160. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
  162. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
  163. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
  164. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
  165. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  166. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  167. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
  168. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  169. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  170. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
  171. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  173. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
  174. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
  175. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  176. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  177. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
  178. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
  186. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  188. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  189. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  190. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  191. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  192. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
  193. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
  194. package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
  195. package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
  196. package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
  197. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  198. package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
  199. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  200. package/deps/rocksdb/rocksdb/port/README +10 -0
  201. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  202. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  203. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  204. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
  205. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  206. package/deps/rocksdb/rocksdb/src.mk +7 -1
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
  208. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
  209. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
  210. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
  211. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
  212. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
  213. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  214. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
  215. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  217. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
  218. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
  219. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
  220. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  221. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  222. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  224. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
  225. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
  226. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  228. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
  229. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  230. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
  231. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  232. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  233. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  234. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  235. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
  236. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
  237. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
  239. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  240. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  241. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  242. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  243. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
  244. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  246. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
  247. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
  248. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  249. package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
  250. package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
  251. package/deps/rocksdb/rocksdb/util/compression.h +9 -3
  252. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  253. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  254. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  255. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  256. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  257. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  258. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  259. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  260. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  261. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  262. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
  263. package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
  264. package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
  265. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
  266. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  267. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  268. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
  269. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  270. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
  271. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  272. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
  273. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  274. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
  275. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  276. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  277. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
  278. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  279. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
  280. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
  281. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  282. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
  283. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
  284. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
  285. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
  286. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
  287. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
  288. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  289. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  290. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
  291. package/deps/rocksdb/rocksdb.gyp +4 -2
  292. package/index.js +38 -55
  293. package/package.json +4 -4
  294. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  295. package/util.h +7 -1
  296. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  297. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  298. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  299. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  300. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  301. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  302. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  303. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  304. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  305. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
  306. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  307. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -682,6 +682,7 @@ TEST_F(DBRangeDelTest, TableEvictedDuringScan) {
682
682
  // soon as its refcount drops to zero.
683
683
  bbto.block_cache->EraseUnRefEntries();
684
684
  }
685
+ ASSERT_OK(iter->status());
685
686
  ASSERT_EQ(kNum, expected);
686
687
  delete iter;
687
688
  db_->ReleaseSnapshot(snapshot);
@@ -840,6 +841,7 @@ TEST_F(DBRangeDelTest, IteratorRemovesCoveredKeys) {
840
841
  ++expected;
841
842
  }
842
843
  }
844
+ ASSERT_OK(iter->status());
843
845
  ASSERT_EQ(kNum, expected);
844
846
  delete iter;
845
847
  }
@@ -908,6 +910,7 @@ TEST_F(DBRangeDelTest, IteratorIgnoresRangeDeletions) {
908
910
  std::string key;
909
911
  ASSERT_EQ(expected[i], iter->key());
910
912
  }
913
+ ASSERT_OK(iter->status());
911
914
  ASSERT_EQ(3, i);
912
915
  delete iter;
913
916
  db_->ReleaseSnapshot(snapshot);
@@ -1382,6 +1385,7 @@ TEST_F(DBRangeDelTest, UntruncatedTombstoneDoesNotDeleteNewerKey) {
1382
1385
  for (; iter->Valid(); iter->Next()) {
1383
1386
  ++keys_found;
1384
1387
  }
1388
+ EXPECT_OK(iter->status());
1385
1389
  delete iter;
1386
1390
  return keys_found;
1387
1391
  };
@@ -1485,6 +1489,7 @@ TEST_F(DBRangeDelTest, DeletedMergeOperandReappearsIterPrev) {
1485
1489
  for (; iter->Valid(); iter->Prev()) {
1486
1490
  ++keys_found;
1487
1491
  }
1492
+ ASSERT_OK(iter->status());
1488
1493
  delete iter;
1489
1494
  ASSERT_EQ(kNumKeys, keys_found);
1490
1495
 
@@ -1519,6 +1524,7 @@ TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeys) {
1519
1524
 
1520
1525
  iter->Next();
1521
1526
  ASSERT_FALSE(iter->Valid());
1527
+ ASSERT_OK(iter->status());
1522
1528
 
1523
1529
  delete iter;
1524
1530
  db_->ReleaseSnapshot(snapshot);
@@ -1564,6 +1570,7 @@ TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeysInImmMemTables) {
1564
1570
 
1565
1571
  iter->Next();
1566
1572
  ASSERT_FALSE(iter->Valid());
1573
+ ASSERT_OK(iter->status());
1567
1574
  }
1568
1575
 
1569
1576
  TEST_F(DBRangeDelTest, RangeTombstoneWrittenToMinimalSsts) {
@@ -1978,6 +1985,7 @@ TEST_F(DBRangeDelTest, IteratorRefresh) {
1978
1985
  ASSERT_EQ("key1", iter->key());
1979
1986
  iter->Next();
1980
1987
  ASSERT_FALSE(iter->Valid());
1988
+ ASSERT_OK(iter->status());
1981
1989
 
1982
1990
  delete iter;
1983
1991
  }
@@ -3511,6 +3519,256 @@ TEST_F(DBRangeDelTest, MemtableMaxRangeDeletions) {
3511
3519
  ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
3512
3520
  ASSERT_EQ(3, NumTableFilesAtLevel(0));
3513
3521
  }
3522
+
3523
+ TEST_F(DBRangeDelTest, RangeDelReseekAfterFileReadError) {
3524
+ // This is to test a bug that is fixed in
3525
+ // https://github.com/facebook/rocksdb/pull/11786.
3526
+ Options opts = CurrentOptions();
3527
+ opts.num_levels = 7;
3528
+
3529
+ // Set up LSM
3530
+ //
3531
+ // L4: F1: [key1] F2: [key2]
3532
+ // L5: F3:[DeleteRange(key3, key6)]
3533
+ // L6: F4:[key3, key6]
3534
+ // Will inject error when reading from F2.
3535
+ // SeekToFirst() should land on key1.
3536
+ // Next() should encounter error when reading from F2,
3537
+ // and range del reseek should not reset this status.
3538
+ Random rnd(301);
3539
+ // L6
3540
+ ASSERT_OK(Put(Key(3), rnd.RandomString(100)));
3541
+ ASSERT_OK(Put(Key(6), rnd.RandomString(100)));
3542
+ ASSERT_OK(Flush());
3543
+ MoveFilesToLevel(6);
3544
+ // L5
3545
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(3),
3546
+ Key(6)));
3547
+ ASSERT_OK(Flush());
3548
+ MoveFilesToLevel(5);
3549
+ // L4
3550
+ ASSERT_OK(Put(Key(2), rnd.RandomString(100)));
3551
+ ASSERT_OK(Flush());
3552
+ MoveFilesToLevel(4);
3553
+ std::string fname;
3554
+ std::vector<LiveFileMetaData> live_files;
3555
+ db_->GetLiveFilesMetaData(&live_files);
3556
+ for (auto& meta : live_files) {
3557
+ if (meta.level == 4) {
3558
+ fname = meta.name;
3559
+ break;
3560
+ }
3561
+ }
3562
+ ASSERT_TRUE(!fname.empty());
3563
+ ASSERT_OK(Put(Key(1), rnd.RandomString(100)));
3564
+ ASSERT_OK(Flush());
3565
+ MoveFilesToLevel(4);
3566
+
3567
+ SyncPoint::GetInstance()->SetCallBack(
3568
+ "RandomAccessFileReader::Read::BeforeReturn", [&fname](void* pair_ptr) {
3569
+ auto p =
3570
+ reinterpret_cast<std::pair<std::string*, IOStatus*>*>(pair_ptr);
3571
+ if (p->first->find(fname) != std::string::npos) {
3572
+ *p->second = IOStatus::IOError();
3573
+ p->second->SetRetryable(true);
3574
+ }
3575
+ });
3576
+ SyncPoint::GetInstance()->EnableProcessing();
3577
+ std::unique_ptr<Iterator> iter{db_->NewIterator(ReadOptions())};
3578
+ iter->SeekToFirst();
3579
+ ASSERT_TRUE(iter->Valid());
3580
+ ASSERT_OK(iter->status());
3581
+ ASSERT_EQ(iter->key(), Key(1));
3582
+ iter->Next();
3583
+ ASSERT_FALSE(iter->Valid());
3584
+ ASSERT_NOK(iter->status());
3585
+ ASSERT_TRUE(iter->status().IsIOError());
3586
+ iter.reset();
3587
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3588
+ SyncPoint::GetInstance()->DisableProcessing();
3589
+
3590
+ // Reverse scan
3591
+ // LSM setup
3592
+ // L4: F1: [key2] F2: [key7, key8]
3593
+ // L5: F3:[[key3, key6)]
3594
+ // L6: F4:[key1, key5]
3595
+ // Ingest error when read from F1.
3596
+ // SeekToLast() should land on key8.
3597
+ // During Prev(), MergingIterator will encounter error when reading from F1
3598
+ // and do a range del reseek (it sees key5 covered by a range tombstone).
3599
+ DestroyAndReopen(opts);
3600
+ // L6
3601
+ ASSERT_OK(Put(Key(1), rnd.RandomString(100)));
3602
+ ASSERT_OK(Put(Key(5), rnd.RandomString(100)));
3603
+ ASSERT_OK(Flush());
3604
+ MoveFilesToLevel(6);
3605
+ // L5
3606
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(3),
3607
+ Key(6)));
3608
+ ASSERT_OK(Flush());
3609
+ MoveFilesToLevel(5);
3610
+ // L4
3611
+ ASSERT_OK(Put(Key(2), rnd.RandomString(100)));
3612
+ ASSERT_OK(Flush());
3613
+ MoveFilesToLevel(4);
3614
+ live_files.clear();
3615
+ db_->GetLiveFilesMetaData(&live_files);
3616
+ for (auto& meta : live_files) {
3617
+ if (meta.level == 4) {
3618
+ fname = meta.name;
3619
+ break;
3620
+ }
3621
+ }
3622
+ ASSERT_TRUE(!fname.empty());
3623
+ ASSERT_OK(Put(Key(7), rnd.RandomString(100)));
3624
+ ASSERT_OK(Put(Key(8), rnd.RandomString(100)));
3625
+ ASSERT_OK(Flush());
3626
+ MoveFilesToLevel(4);
3627
+
3628
+ SyncPoint::GetInstance()->SetCallBack(
3629
+ "RandomAccessFileReader::Read::AnyOffset", [&fname](void* pair_ptr) {
3630
+ auto p =
3631
+ reinterpret_cast<std::pair<std::string*, IOStatus*>*>(pair_ptr);
3632
+ if (p->first->find(fname) != std::string::npos) {
3633
+ *p->second = IOStatus::IOError();
3634
+ p->second->SetRetryable(true);
3635
+ }
3636
+ });
3637
+ SyncPoint::GetInstance()->EnableProcessing();
3638
+ iter.reset(db_->NewIterator(ReadOptions()));
3639
+ iter->SeekToLast();
3640
+ ASSERT_TRUE(iter->Valid());
3641
+ ASSERT_OK(iter->status());
3642
+ ASSERT_EQ(iter->key(), Key(8));
3643
+ // Note that for reverse scan, DBIter will need to ensure
3644
+ // the key it returns is the one with the highest sequence number.
3645
+ // To return key7, it internally calls MergingIterator::Prev()
3646
+ // until it reaches a previous user key.
3647
+ iter->Prev();
3648
+ ASSERT_FALSE(iter->Valid());
3649
+ ASSERT_NOK(iter->status());
3650
+ ASSERT_TRUE(iter->status().IsIOError());
3651
+
3652
+ iter.reset();
3653
+ }
3654
+
3655
+ TEST_F(DBRangeDelTest, ReleaseSnapshotAfterIteratorCreation) {
3656
+ // Test that range tombstone code path in LevelIterator
3657
+ // does access ReadOptions::snapshot after Iterator creation.
3658
+ //
3659
+ // Put some data in L2 so that range tombstone in L1 will not be dropped.
3660
+ ASSERT_OK(Put(Key(0), "v"));
3661
+ ASSERT_OK(Put(Key(100), "v"));
3662
+ ASSERT_OK(Flush());
3663
+ MoveFilesToLevel(2);
3664
+
3665
+ // two L1 file with range del
3666
+ ASSERT_OK(Put(Key(1), "v"));
3667
+ ASSERT_OK(Put(Key(2), "v"));
3668
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(3),
3669
+ Key(4)));
3670
+ ASSERT_OK(Flush());
3671
+ MoveFilesToLevel(1);
3672
+
3673
+ ASSERT_OK(Put(Key(5), "v"));
3674
+ ASSERT_OK(Put(Key(6), "v"));
3675
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(5),
3676
+ Key(6)));
3677
+ ASSERT_OK(Flush());
3678
+ MoveFilesToLevel(1);
3679
+
3680
+ ASSERT_EQ(2, NumTableFilesAtLevel(1));
3681
+ ASSERT_EQ(1, NumTableFilesAtLevel(2));
3682
+
3683
+ const Snapshot* snapshot = db_->GetSnapshot();
3684
+ ReadOptions ro;
3685
+ ro.snapshot = snapshot;
3686
+
3687
+ Iterator* iter = db_->NewIterator(ro);
3688
+ db_->ReleaseSnapshot(snapshot);
3689
+
3690
+ iter->Seek(Key(1));
3691
+ std::vector<int> expected_keys{1, 2, 6, 100};
3692
+ for (int i : expected_keys) {
3693
+ ASSERT_OK(iter->status());
3694
+ ASSERT_TRUE(iter->Valid());
3695
+ ASSERT_EQ(iter->key(), Key(i));
3696
+ iter->Next();
3697
+ }
3698
+ ASSERT_TRUE(!iter->Valid() && iter->status().ok());
3699
+
3700
+ delete iter;
3701
+ }
3702
+
3703
+ TEST_F(DBRangeDelTest, RefreshWithSnapshot) {
3704
+ ASSERT_OK(Put(Key(4), "4"));
3705
+ ASSERT_OK(Put(Key(6), "6"));
3706
+ const Snapshot* snapshot = db_->GetSnapshot();
3707
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(3),
3708
+ Key(5)));
3709
+
3710
+ std::unique_ptr<Iterator> iter{db_->NewIterator(ReadOptions())};
3711
+ // Live Memtable
3712
+ iter->SeekToFirst();
3713
+ ASSERT_TRUE(iter->Valid());
3714
+ ASSERT_EQ(iter->key(), Key(6));
3715
+ ASSERT_OK(iter->Refresh(snapshot));
3716
+ iter->SeekToFirst();
3717
+ ASSERT_TRUE(iter->Valid());
3718
+ ASSERT_EQ(iter->key(), Key(4));
3719
+ // Immutable Memtable
3720
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
3721
+ ASSERT_OK(iter->Refresh(nullptr));
3722
+ iter->SeekToFirst();
3723
+ ASSERT_TRUE(iter->Valid());
3724
+ ASSERT_EQ(iter->key(), Key(6));
3725
+ ASSERT_OK(iter->Refresh(snapshot));
3726
+ iter->SeekToFirst();
3727
+ ASSERT_TRUE(iter->Valid());
3728
+ ASSERT_EQ(iter->key(), Key(4));
3729
+ // L0
3730
+ ASSERT_OK(Flush());
3731
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
3732
+ ASSERT_OK(iter->Refresh(nullptr));
3733
+ iter->SeekToFirst();
3734
+ ASSERT_TRUE(iter->Valid());
3735
+ ASSERT_EQ(iter->key(), Key(6));
3736
+ ASSERT_OK(iter->Refresh(snapshot));
3737
+ iter->SeekToFirst();
3738
+ ASSERT_TRUE(iter->Valid());
3739
+ ASSERT_EQ(iter->key(), Key(4));
3740
+ // L1
3741
+ MoveFilesToLevel(1);
3742
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
3743
+ ASSERT_OK(iter->Refresh(nullptr));
3744
+ iter->SeekToFirst();
3745
+ ASSERT_TRUE(iter->Valid());
3746
+ ASSERT_EQ(iter->key(), Key(6));
3747
+ ASSERT_OK(iter->Refresh(snapshot));
3748
+ iter->SeekToFirst();
3749
+ ASSERT_TRUE(iter->Valid());
3750
+ ASSERT_EQ(iter->key(), Key(4));
3751
+ // L1 with two file.
3752
+ // Test that when LevelIterator enters a new file,
3753
+ // it remembers which snapshot sequence number to use.
3754
+ ASSERT_OK(Put(Key(2), "2"));
3755
+ ASSERT_OK(Flush());
3756
+ MoveFilesToLevel(1);
3757
+ ASSERT_EQ(2, NumTableFilesAtLevel(1));
3758
+ ASSERT_OK(iter->Refresh(nullptr));
3759
+ iter->SeekToFirst();
3760
+ ASSERT_TRUE(iter->Valid());
3761
+ // LevelIterator is at the first file
3762
+ ASSERT_EQ(iter->key(), Key(2));
3763
+ ASSERT_OK(iter->Refresh(snapshot));
3764
+ // Will enter the second file, and create a new range tombstone iterator.
3765
+ // It should use the snapshot sequence number.
3766
+ iter->SeekToFirst();
3767
+ ASSERT_TRUE(iter->Valid());
3768
+ ASSERT_EQ(iter->key(), Key(4));
3769
+ iter.reset();
3770
+ db_->ReleaseSnapshot(snapshot);
3771
+ }
3514
3772
  } // namespace ROCKSDB_NAMESPACE
3515
3773
 
3516
3774
  int main(int argc, char** argv) {
@@ -220,6 +220,7 @@ TEST_P(DBRateLimiterOnReadTest, Iterator) {
220
220
  ++expected;
221
221
  }
222
222
  }
223
+ ASSERT_OK(iter->status());
223
224
  // Reverse scan does not read evenly (one block per iteration) due to
224
225
  // descending seqno ordering, so wait until after the loop to check total.
225
226
  ASSERT_EQ(expected, options_.rate_limiter->GetTotalRequests(Env::IO_USER));
@@ -240,6 +240,7 @@ TEST_F(DBReadOnlyTestWithTimestamp, IteratorAndGet) {
240
240
  get_value_and_check(db_, read_opts, it->key(), it->value(),
241
241
  write_timestamps[i]);
242
242
  }
243
+ ASSERT_OK(it->status());
243
244
  size_t expected_count = kMaxKey - start_keys[i] + 1;
244
245
  ASSERT_EQ(expected_count, count);
245
246
 
@@ -252,6 +253,7 @@ TEST_F(DBReadOnlyTestWithTimestamp, IteratorAndGet) {
252
253
  get_value_and_check(db_, read_opts, it->key(), it->value(),
253
254
  write_timestamps[i]);
254
255
  }
256
+ ASSERT_OK(it->status());
255
257
  ASSERT_EQ(static_cast<size_t>(kMaxKey) - start_keys[i] + 1, count);
256
258
 
257
259
  // SeekToFirst()/SeekToLast() with lower/upper bounds.
@@ -273,6 +275,7 @@ TEST_F(DBReadOnlyTestWithTimestamp, IteratorAndGet) {
273
275
  get_value_and_check(db_, read_opts, it->key(), it->value(),
274
276
  write_timestamps[i]);
275
277
  }
278
+ ASSERT_OK(it->status());
276
279
  ASSERT_EQ(r - std::max(l, start_keys[i]), count);
277
280
 
278
281
  for (it->SeekToLast(), key = std::min(r, kMaxKey + 1), count = 0;
@@ -282,6 +285,7 @@ TEST_F(DBReadOnlyTestWithTimestamp, IteratorAndGet) {
282
285
  get_value_and_check(db_, read_opts, it->key(), it->value(),
283
286
  write_timestamps[i]);
284
287
  }
288
+ ASSERT_OK(it->status());
285
289
  l += (kMaxKey / 100);
286
290
  r -= (kMaxKey / 100);
287
291
  }
@@ -328,6 +332,7 @@ TEST_F(DBReadOnlyTestWithTimestamp, Iterators) {
328
332
  CheckIterUserEntry(iters[0], Key1(key), kTypeValue,
329
333
  "value" + std::to_string(key), write_timestamp);
330
334
  }
335
+ ASSERT_OK(iters[0]->status());
331
336
 
332
337
  size_t expected_count = kMaxKey - 0 + 1;
333
338
  ASSERT_EQ(expected_count, count);
@@ -336,6 +341,53 @@ TEST_F(DBReadOnlyTestWithTimestamp, Iterators) {
336
341
  Close();
337
342
  }
338
343
 
344
+ TEST_F(DBReadOnlyTestWithTimestamp, FullHistoryTsLowSanityCheckFail) {
345
+ Options options = CurrentOptions();
346
+ options.env = env_;
347
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
348
+ // Use UDT in memtable only feature for this test, so we can control that
349
+ // newly set `full_history_ts_low` collapse history when Flush happens.
350
+ options.persist_user_defined_timestamps = false;
351
+ options.allow_concurrent_memtable_write = false;
352
+ DestroyAndReopen(options);
353
+
354
+ std::string write_ts;
355
+ PutFixed64(&write_ts, 1);
356
+ ASSERT_OK(db_->Put(WriteOptions(), "foo", write_ts, "val1"));
357
+
358
+ std::string full_history_ts_low;
359
+ PutFixed64(&full_history_ts_low, 3);
360
+ ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(),
361
+ full_history_ts_low));
362
+ ASSERT_OK(Flush(0));
363
+
364
+ // Reopen the database in read only mode to test its timestamp support.
365
+ Close();
366
+ ASSERT_OK(ReadOnlyReopen(options));
367
+
368
+ // Reading below full_history_ts_low fails a sanity check.
369
+ std::string read_ts;
370
+ PutFixed64(&read_ts, 2);
371
+ Slice read_ts_slice = read_ts;
372
+ ReadOptions read_opts;
373
+ read_opts.timestamp = &read_ts_slice;
374
+
375
+ // Get()
376
+ std::string value;
377
+ ASSERT_TRUE(db_->Get(read_opts, "foo", &value).IsInvalidArgument());
378
+ // NewIterator()
379
+ std::unique_ptr<Iterator> iter(
380
+ db_->NewIterator(read_opts, db_->DefaultColumnFamily()));
381
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
382
+
383
+ // NewIterators()
384
+ std::vector<ColumnFamilyHandle*> cfhs = {db_->DefaultColumnFamily()};
385
+ std::vector<Iterator*> iterators;
386
+ ASSERT_TRUE(
387
+ db_->NewIterators(read_opts, cfhs, &iterators).IsInvalidArgument());
388
+ Close();
389
+ }
390
+
339
391
  TEST_F(DBReadOnlyTestWithTimestamp, IteratorsReadTimestampSizeMismatch) {
340
392
  const int kNumKeysPerFile = 128;
341
393
  const uint64_t kMaxKey = 1024;
@@ -164,12 +164,22 @@ TEST_F(DBSecondaryTest, ReopenAsSecondary) {
164
164
  Reopen(options);
165
165
  ASSERT_OK(Put("foo", "foo_value"));
166
166
  ASSERT_OK(Put("bar", "bar_value"));
167
+ WideColumns columns{{kDefaultWideColumnName, "attr_default_val"},
168
+ {"attr_name1", "attr_value_1"},
169
+ {"attr_name2", "attr_value_2"}};
170
+ ASSERT_OK(db_->PutEntity(WriteOptions(), db_->DefaultColumnFamily(), "baz",
171
+ columns));
167
172
  ASSERT_OK(dbfull()->Flush(FlushOptions()));
168
173
  Close();
169
174
 
170
175
  ASSERT_OK(ReopenAsSecondary(options));
171
176
  ASSERT_EQ("foo_value", Get("foo"));
172
177
  ASSERT_EQ("bar_value", Get("bar"));
178
+ PinnableWideColumns result;
179
+ ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(), "baz",
180
+ &result));
181
+ ASSERT_EQ(result.columns(), columns);
182
+
173
183
  ReadOptions ropts;
174
184
  ropts.verify_checksums = true;
175
185
  auto db1 = static_cast<DBImplSecondary*>(db_);
@@ -182,13 +192,17 @@ TEST_F(DBSecondaryTest, ReopenAsSecondary) {
182
192
  ASSERT_EQ("bar", iter->key().ToString());
183
193
  ASSERT_EQ("bar_value", iter->value().ToString());
184
194
  } else if (1 == count) {
195
+ ASSERT_EQ("baz", iter->key().ToString());
196
+ ASSERT_EQ(columns, iter->columns());
197
+ } else if (2 == count) {
185
198
  ASSERT_EQ("foo", iter->key().ToString());
186
199
  ASSERT_EQ("foo_value", iter->value().ToString());
187
200
  }
188
201
  ++count;
189
202
  }
203
+ ASSERT_OK(iter->status());
190
204
  delete iter;
191
- ASSERT_EQ(2, count);
205
+ ASSERT_EQ(3, count);
192
206
  }
193
207
 
194
208
  TEST_F(DBSecondaryTest, SimpleInternalCompaction) {
@@ -521,6 +535,8 @@ TEST_F(DBSecondaryTest, SecondaryCloseFiles) {
521
535
  }
522
536
  ASSERT_FALSE(iter1->Valid());
523
537
  ASSERT_FALSE(iter2->Valid());
538
+ ASSERT_OK(iter1->status());
539
+ ASSERT_OK(iter2->status());
524
540
  };
525
541
 
526
542
  ASSERT_OK(Put("a", "value"));
@@ -793,6 +809,7 @@ TEST_F(DBSecondaryTest, MissingTableFileDuringOpen) {
793
809
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
794
810
  ++count;
795
811
  }
812
+ ASSERT_OK(iter->status());
796
813
  ASSERT_EQ(2, count);
797
814
  delete iter;
798
815
  }
@@ -850,6 +867,7 @@ TEST_F(DBSecondaryTest, MissingTableFile) {
850
867
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
851
868
  ++count;
852
869
  }
870
+ ASSERT_OK(iter->status());
853
871
  ASSERT_EQ(2, count);
854
872
  delete iter;
855
873
  }
@@ -922,6 +940,7 @@ TEST_F(DBSecondaryTest, SwitchManifest) {
922
940
  ASSERT_EQ("value_" + std::to_string(kNumFiles - 1),
923
941
  iter->value().ToString());
924
942
  }
943
+ EXPECT_OK(iter->status());
925
944
  };
926
945
 
927
946
  range_scan_db();
@@ -1472,6 +1491,7 @@ TEST_F(DBSecondaryTestWithTimestamp, IteratorAndGet) {
1472
1491
  get_value_and_check(db_, read_opts, it->key(), it->value(),
1473
1492
  write_timestamps[i]);
1474
1493
  }
1494
+ ASSERT_OK(it->status());
1475
1495
  size_t expected_count = kMaxKey - start_keys[i] + 1;
1476
1496
  ASSERT_EQ(expected_count, count);
1477
1497
 
@@ -1484,6 +1504,7 @@ TEST_F(DBSecondaryTestWithTimestamp, IteratorAndGet) {
1484
1504
  get_value_and_check(db_, read_opts, it->key(), it->value(),
1485
1505
  write_timestamps[i]);
1486
1506
  }
1507
+ ASSERT_OK(it->status());
1487
1508
  ASSERT_EQ(static_cast<size_t>(kMaxKey) - start_keys[i] + 1, count);
1488
1509
 
1489
1510
  // SeekToFirst()/SeekToLast() with lower/upper bounds.
@@ -1505,6 +1526,7 @@ TEST_F(DBSecondaryTestWithTimestamp, IteratorAndGet) {
1505
1526
  get_value_and_check(db_, read_opts, it->key(), it->value(),
1506
1527
  write_timestamps[i]);
1507
1528
  }
1529
+ ASSERT_OK(it->status());
1508
1530
  ASSERT_EQ(r - std::max(l, start_keys[i]), count);
1509
1531
 
1510
1532
  for (it->SeekToLast(), key = std::min(r, kMaxKey + 1), count = 0;
@@ -1514,6 +1536,7 @@ TEST_F(DBSecondaryTestWithTimestamp, IteratorAndGet) {
1514
1536
  get_value_and_check(db_, read_opts, it->key(), it->value(),
1515
1537
  write_timestamps[i]);
1516
1538
  }
1539
+ ASSERT_OK(it->status());
1517
1540
  l += (kMaxKey / 100);
1518
1541
  r -= (kMaxKey / 100);
1519
1542
  }
@@ -1561,6 +1584,55 @@ TEST_F(DBSecondaryTestWithTimestamp, IteratorsReadTimestampSizeMismatch) {
1561
1584
  Close();
1562
1585
  }
1563
1586
 
1587
+ TEST_F(DBSecondaryTestWithTimestamp, FullHistoryTsLowSanityCheckFail) {
1588
+ Options options = CurrentOptions();
1589
+ options.env = env_;
1590
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
1591
+ // Use UDT in memtable only feature for this test, so we can control that
1592
+ // newly set `full_history_ts_low` collapse history when Flush happens.
1593
+ options.persist_user_defined_timestamps = false;
1594
+ options.allow_concurrent_memtable_write = false;
1595
+ DestroyAndReopen(options);
1596
+
1597
+ std::string write_ts;
1598
+ PutFixed64(&write_ts, 1);
1599
+ ASSERT_OK(db_->Put(WriteOptions(), "foo", write_ts, "val1"));
1600
+
1601
+ std::string full_history_ts_low;
1602
+ PutFixed64(&full_history_ts_low, 3);
1603
+ ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(),
1604
+ full_history_ts_low));
1605
+ ASSERT_OK(Flush(0));
1606
+
1607
+ // Reopen the database as secondary instance to test its timestamp support.
1608
+ Close();
1609
+ options.max_open_files = -1;
1610
+ ASSERT_OK(ReopenAsSecondary(options));
1611
+
1612
+ // Reading below full_history_ts_low fails a sanity check.
1613
+ std::string read_ts;
1614
+ PutFixed64(&read_ts, 2);
1615
+ Slice read_ts_slice = read_ts;
1616
+ ReadOptions read_opts;
1617
+ read_opts.timestamp = &read_ts_slice;
1618
+
1619
+ // Get()
1620
+ std::string value;
1621
+ ASSERT_TRUE(db_->Get(read_opts, "foo", &value).IsInvalidArgument());
1622
+
1623
+ // NewIterator()
1624
+ std::unique_ptr<Iterator> iter(
1625
+ db_->NewIterator(read_opts, db_->DefaultColumnFamily()));
1626
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
1627
+
1628
+ // NewIterators()
1629
+ std::vector<ColumnFamilyHandle*> cfhs = {db_->DefaultColumnFamily()};
1630
+ std::vector<Iterator*> iterators;
1631
+ ASSERT_TRUE(
1632
+ db_->NewIterators(read_opts, cfhs, &iterators).IsInvalidArgument());
1633
+ Close();
1634
+ }
1635
+
1564
1636
  TEST_F(DBSecondaryTestWithTimestamp,
1565
1637
  IteratorsReadTimestampSpecifiedWithoutWriteTimestamp) {
1566
1638
  const int kNumKeysPerFile = 128;
@@ -1674,6 +1746,7 @@ TEST_F(DBSecondaryTestWithTimestamp, Iterators) {
1674
1746
  CheckIterUserEntry(iters[0], Key1(key), kTypeValue,
1675
1747
  "value" + std::to_string(key), write_timestamp);
1676
1748
  }
1749
+ ASSERT_OK(iters[0]->status());
1677
1750
 
1678
1751
  size_t expected_count = kMaxKey - 0 + 1;
1679
1752
  ASSERT_EQ(expected_count, count);
@@ -937,12 +937,21 @@ INSTANTIATE_TEST_CASE_P(DBWALTestWithParam, DBWALTestWithParam,
937
937
  ::testing::Values(std::make_tuple("", true),
938
938
  std::make_tuple("_wal_dir", false)));
939
939
 
940
- TEST_F(DBSSTTest, OpenDBWithExistingTrash) {
940
+ TEST_F(DBSSTTest, OpenDBWithExistingTrashAndObsoleteSstFile) {
941
941
  Options options = CurrentOptions();
942
-
943
942
  options.sst_file_manager.reset(
944
943
  NewSstFileManager(env_, nullptr, "", 1024 * 1024 /* 1 MB/sec */));
945
944
  auto sfm = static_cast<SstFileManagerImpl*>(options.sst_file_manager.get());
945
+ // Set an extra high trash ratio to prevent immediate/non-rate limited
946
+ // deletions
947
+ sfm->SetDeleteRateBytesPerSecond(1024 * 1024);
948
+ sfm->delete_scheduler()->SetMaxTrashDBRatio(1000.0);
949
+
950
+ int bg_delete_file = 0;
951
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
952
+ "DeleteScheduler::DeleteTrashFile:DeleteFile",
953
+ [&](void* /*arg*/) { bg_delete_file++; });
954
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
946
955
 
947
956
  Destroy(last_options_);
948
957
 
@@ -951,13 +960,22 @@ TEST_F(DBSSTTest, OpenDBWithExistingTrash) {
951
960
  ASSERT_OK(WriteStringToFile(env_, "abc", dbname_ + "/" + "001.sst.trash"));
952
961
  ASSERT_OK(WriteStringToFile(env_, "abc", dbname_ + "/" + "002.sst.trash"));
953
962
  ASSERT_OK(WriteStringToFile(env_, "abc", dbname_ + "/" + "003.sst.trash"));
954
-
955
- // Reopen the DB and verify that it deletes existing trash files
963
+ // Manually add an obsolete sst file. Obsolete SST files are discovered and
964
+ // deleted upon recovery.
965
+ constexpr uint64_t kSstFileNumber = 100;
966
+ const std::string kObsoleteSstFile =
967
+ MakeTableFileName(dbname_, kSstFileNumber);
968
+ ASSERT_OK(WriteStringToFile(env_, "abc", kObsoleteSstFile));
969
+
970
+ // Reopen the DB and verify that it deletes existing trash files and obsolete
971
+ // SST files with rate limiting.
956
972
  Reopen(options);
957
973
  sfm->WaitForEmptyTrash();
958
974
  ASSERT_NOK(env_->FileExists(dbname_ + "/" + "001.sst.trash"));
959
975
  ASSERT_NOK(env_->FileExists(dbname_ + "/" + "002.sst.trash"));
960
976
  ASSERT_NOK(env_->FileExists(dbname_ + "/" + "003.sst.trash"));
977
+ ASSERT_NOK(env_->FileExists(kObsoleteSstFile));
978
+ ASSERT_EQ(bg_delete_file, 4);
961
979
  }
962
980
 
963
981
  // Create a DB with 2 db_paths, and generate multiple files in the 2
@@ -52,6 +52,7 @@ TEST_P(DBTestTailingIterator, TailingIteratorSingle) {
52
52
 
53
53
  iter->Next();
54
54
  ASSERT_TRUE(!iter->Valid());
55
+ ASSERT_OK(iter->status());
55
56
  }
56
57
 
57
58
  TEST_P(DBTestTailingIterator, TailingIteratorKeepAdding) {
@@ -361,7 +362,7 @@ TEST_P(DBTestTailingIterator, TailingIteratorDeletes) {
361
362
  int count = 0;
362
363
  for (; iter->Valid(); iter->Next(), ++count)
363
364
  ;
364
-
365
+ ASSERT_OK(iter->status());
365
366
  ASSERT_EQ(count, num_records);
366
367
  }
367
368
  Close();
@@ -408,6 +409,7 @@ TEST_P(DBTestTailingIterator, TailingIteratorPrefixSeek) {
408
409
 
409
410
  iter->Next();
410
411
  ASSERT_TRUE(!iter->Valid());
412
+ ASSERT_OK(iter->status());
411
413
  }
412
414
  Close();
413
415
  }