@nxtedition/rocksdb 9.0.0 → 9.0.1

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 (304) hide show
  1. package/binding.cc +0 -21
  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 +182 -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 +293 -17
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +21 -5
  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 +0 -8
  293. package/package.json +1 -1
  294. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  295. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  296. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  297. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  298. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  299. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  300. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  301. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  302. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  303. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  304. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -243,6 +243,36 @@ TEST_F(SmallEnumSetTest, SmallEnumSetTest2) {
243
243
  }
244
244
  }
245
245
 
246
+ // ***************************************************************** //
247
+ // Unit test for Status
248
+ TEST(StatusTest, Update) {
249
+ const Status ok = Status::OK();
250
+ const Status inc = Status::Incomplete("blah");
251
+ const Status notf = Status::NotFound("meow");
252
+
253
+ Status s = ok;
254
+ ASSERT_TRUE(s.UpdateIfOk(Status::Corruption("bad")).IsCorruption());
255
+ ASSERT_TRUE(s.IsCorruption());
256
+
257
+ s = ok;
258
+ ASSERT_TRUE(s.UpdateIfOk(Status::OK()).ok());
259
+ ASSERT_TRUE(s.UpdateIfOk(ok).ok());
260
+ ASSERT_TRUE(s.ok());
261
+
262
+ ASSERT_TRUE(s.UpdateIfOk(inc).IsIncomplete());
263
+ ASSERT_TRUE(s.IsIncomplete());
264
+
265
+ ASSERT_TRUE(s.UpdateIfOk(notf).IsIncomplete());
266
+ ASSERT_TRUE(s.UpdateIfOk(ok).IsIncomplete());
267
+ ASSERT_TRUE(s.IsIncomplete());
268
+
269
+ // Keeps left-most non-OK status
270
+ s = ok;
271
+ ASSERT_TRUE(
272
+ s.UpdateIfOk(Status()).UpdateIfOk(notf).UpdateIfOk(inc).IsNotFound());
273
+ ASSERT_TRUE(s.IsNotFound());
274
+ }
275
+
246
276
  } // namespace ROCKSDB_NAMESPACE
247
277
 
248
278
  int main(int argc, char** argv) {
@@ -45,6 +45,7 @@ static const char* msgs[static_cast<int>(Status::kMaxSubCode)] = {
45
45
  "Txn not prepared", // kTxnNotPrepared
46
46
  "IO fenced off", // kIOFenced
47
47
  "Merge operator failed", // kMergeOperatorFailed
48
+ "Number of operands merged exceeded threshold", // kMergeOperandThresholdExceeded
48
49
  };
49
50
 
50
51
  Status::Status(Code _code, SubCode _subcode, const Slice& msg,
@@ -437,6 +437,45 @@ bool SerializeIntVector(const std::vector<int>& vec, std::string* value) {
437
437
  return true;
438
438
  }
439
439
 
440
+ int ParseTimeStringToSeconds(const std::string& value) {
441
+ int hours, minutes;
442
+ char colon;
443
+
444
+ std::istringstream stream(value);
445
+ stream >> hours >> colon >> minutes;
446
+
447
+ if (stream.fail() || !stream.eof() || colon != ':') {
448
+ return -1;
449
+ }
450
+
451
+ if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
452
+ return -1;
453
+ }
454
+ return hours * 3600 + minutes * 60;
455
+ }
456
+
457
+ bool TryParseTimeRangeString(const std::string& value, int& start_time,
458
+ int& end_time) {
459
+ if (value.empty()) {
460
+ start_time = 0;
461
+ end_time = 0;
462
+ return true;
463
+ }
464
+ auto split = StringSplit(value, '-');
465
+ if (split.size() != 2) {
466
+ return false;
467
+ }
468
+ start_time = ParseTimeStringToSeconds(split[0]);
469
+ if (start_time < 0) {
470
+ return false;
471
+ }
472
+ end_time = ParseTimeStringToSeconds(split[1]);
473
+ if (end_time < 0) {
474
+ return false;
475
+ }
476
+ return true;
477
+ }
478
+
440
479
  // Copied from folly/string.cpp:
441
480
  // https://github.com/facebook/folly/blob/0deef031cb8aab76dc7e736f8b7c22d701d5f36b/folly/String.cpp#L457
442
481
  // There are two variants of `strerror_r` function, one returns
@@ -166,6 +166,16 @@ std::vector<int> ParseVectorInt(const std::string& value);
166
166
 
167
167
  bool SerializeIntVector(const std::vector<int>& vec, std::string* value);
168
168
 
169
+ // Expects HH:mm format for the input value
170
+ // Returns -1 if invalid input. Otherwise returns seconds since midnight
171
+ int ParseTimeStringToSeconds(const std::string& value);
172
+
173
+ // Expects HH:mm-HH:mm format for the input value
174
+ // Returns false, if invalid format.
175
+ // Otherwise, returns true and start_time and end_time are set
176
+ bool TryParseTimeRangeString(const std::string& value, int& start_time,
177
+ int& end_time);
178
+
169
179
  extern const std::string kNullptrString;
170
180
 
171
181
  // errnoStr() function returns a string that describes the error code passed in
@@ -45,6 +45,8 @@ static OperationInfo global_operation_table[] = {
45
45
  {ThreadStatus::OP_DBITERATOR, "DBIterator"},
46
46
  {ThreadStatus::OP_VERIFY_DB_CHECKSUM, "VerifyDBChecksum"},
47
47
  {ThreadStatus::OP_VERIFY_FILE_CHECKSUMS, "VerifyFileChecksums"},
48
+ {ThreadStatus::OP_GETENTITY, "GetEntity"},
49
+ {ThreadStatus::OP_MULTIGETENTITY, "MultiGetEntity"},
48
50
 
49
51
  };
50
52
 
@@ -8,6 +8,7 @@
8
8
 
9
9
  #include "db/dbformat.h"
10
10
  #include "rocksdb/types.h"
11
+ #include "util/coding.h"
11
12
  #include "util/write_batch_util.h"
12
13
 
13
14
  namespace ROCKSDB_NAMESPACE {
@@ -340,4 +341,45 @@ Status ValidateUserDefinedTimestampsOptions(
340
341
  return Status::InvalidArgument(
341
342
  "Unsupported user defined timestamps settings change.");
342
343
  }
344
+
345
+ void GetFullHistoryTsLowFromU64CutoffTs(Slice* cutoff_ts,
346
+ std::string* full_history_ts_low) {
347
+ uint64_t cutoff_udt_ts = 0;
348
+ [[maybe_unused]] bool format_res = GetFixed64(cutoff_ts, &cutoff_udt_ts);
349
+ assert(format_res);
350
+ PutFixed64(full_history_ts_low, cutoff_udt_ts + 1);
351
+ }
352
+
353
+ std::tuple<std::optional<Slice>, std::optional<Slice>>
354
+ MaybeAddTimestampsToRange(const Slice* start, const Slice* end, size_t ts_sz,
355
+ std::string* start_with_ts, std::string* end_with_ts,
356
+ bool exclusive_end) {
357
+ std::optional<Slice> ret_start, ret_end;
358
+ if (start) {
359
+ if (ts_sz == 0) {
360
+ ret_start = *start;
361
+ } else {
362
+ // Maximum timestamp means including all keys with any timestamp for start
363
+ AppendKeyWithMaxTimestamp(start_with_ts, *start, ts_sz);
364
+ ret_start = Slice(*start_with_ts);
365
+ }
366
+ }
367
+ if (end) {
368
+ if (ts_sz == 0) {
369
+ ret_end = *end;
370
+ } else {
371
+ if (exclusive_end) {
372
+ // Append a maximum timestamp as the range limit is exclusive:
373
+ // [start, end)
374
+ AppendKeyWithMaxTimestamp(end_with_ts, *end, ts_sz);
375
+ } else {
376
+ // Append a minimum timestamp to end so the range limit is inclusive:
377
+ // [start, end]
378
+ AppendKeyWithMinTimestamp(end_with_ts, *end, ts_sz);
379
+ }
380
+ ret_end = Slice(*end_with_ts);
381
+ }
382
+ }
383
+ return std::make_tuple(ret_start, ret_end);
384
+ }
343
385
  } // namespace ROCKSDB_NAMESPACE
@@ -246,4 +246,23 @@ Status ValidateUserDefinedTimestampsOptions(
246
246
  const Comparator* new_comparator, const std::string& old_comparator_name,
247
247
  bool new_persist_udt, bool old_persist_udt,
248
248
  bool* mark_sst_files_has_no_udt);
249
+
250
+ // Given a cutoff user-defined timestamp formatted as uint64_t, get the
251
+ // effective `full_history_ts_low` timestamp, which is the next immediately
252
+ // bigger timestamp. Used by the UDT in memtable only feature when flushing
253
+ // memtables and remove timestamps. This process collapses history and increase
254
+ // the effective `full_history_ts_low`.
255
+ void GetFullHistoryTsLowFromU64CutoffTs(Slice* cutoff_ts,
256
+ std::string* full_history_ts_low);
257
+
258
+ // `start` is the inclusive lower user key bound without user-defined timestamp.
259
+ // `end` is the upper user key bound without user-defined timestamp.
260
+ // By default, `end` is treated as being exclusive. If `exclusive_end` is set to
261
+ // false, it's treated as an inclusive upper bound.
262
+ // If any of these two bounds is nullptr, an empty std::optional<Slice> is
263
+ // returned for that bound.
264
+ std::tuple<std::optional<Slice>, std::optional<Slice>>
265
+ MaybeAddTimestampsToRange(const Slice* start, const Slice* end, size_t ts_sz,
266
+ std::string* start_with_ts, std::string* end_with_ts,
267
+ bool exclusive_end = true);
249
268
  } // namespace ROCKSDB_NAMESPACE
@@ -438,6 +438,20 @@ TEST(ValidateUserDefinedTimestampsOptionsTest, InvalidUserComparatorChange) {
438
438
  &mark_sst_files)
439
439
  .IsInvalidArgument());
440
440
  }
441
+
442
+ TEST(GetFullHistoryTsLowFromU64CutoffTsTest, Success) {
443
+ std::string cutoff_ts;
444
+ uint64_t cutoff_ts_int = 3;
445
+ PutFixed64(&cutoff_ts, 3);
446
+ Slice cutoff_ts_slice = cutoff_ts;
447
+ std::string actual_full_history_ts_low;
448
+ GetFullHistoryTsLowFromU64CutoffTs(&cutoff_ts_slice,
449
+ &actual_full_history_ts_low);
450
+
451
+ std::string expected_ts_low;
452
+ PutFixed64(&expected_ts_low, cutoff_ts_int + 1);
453
+ ASSERT_EQ(expected_ts_low, actual_full_history_ts_low);
454
+ }
441
455
  } // namespace ROCKSDB_NAMESPACE
442
456
 
443
457
  int main(int argc, char** argv) {
@@ -11,9 +11,6 @@
11
11
  #ifndef XXH_NAMESPACE
12
12
  #define XXH_NAMESPACE ROCKSDB_
13
13
  #endif // !defined(XXH_NAMESPACE)
14
-
15
- // for FALLTHROUGH_INTENDED, inserted as appropriate
16
- #include "port/lang.h"
17
14
  /* END RocksDB customizations */
18
15
 
19
16
  // clang-format off
@@ -386,10 +386,6 @@ typedef struct {
386
386
  #define XXPH_STATIC_LINKING_ONLY
387
387
  #endif
388
388
 
389
- /* BEGIN RocksDB customizations */
390
- #include "port/lang.h" /* for FALLTHROUGH_INTENDED, inserted as appropriate */
391
- /* END RocksDB customizations */
392
-
393
389
  /* *************************************
394
390
  * Compiler Specific Options
395
391
  ***************************************/
@@ -2101,8 +2101,9 @@ Iterator* BlobDBImpl::NewIterator(const ReadOptions& _read_options) {
2101
2101
  own_snapshot = new ManagedSnapshot(db_);
2102
2102
  snapshot = own_snapshot->snapshot();
2103
2103
  }
2104
+ SuperVersion* sv = cfd->GetReferencedSuperVersion(db_impl_);
2104
2105
  auto* iter = db_impl_->NewIteratorImpl(
2105
- read_options, cfd, snapshot->GetSequenceNumber(),
2106
+ read_options, cfd, sv, snapshot->GetSequenceNumber(),
2106
2107
  nullptr /*read_callback*/, true /*expose_blob_index*/);
2107
2108
  return new BlobDBIterator(own_snapshot, iter, this, clock_, statistics_);
2108
2109
  }
@@ -96,6 +96,7 @@ class TestWritableFile : public WritableFile {
96
96
  virtual bool use_direct_io() const override {
97
97
  return target_->use_direct_io();
98
98
  };
99
+ uint64_t GetFileSize() final { return target_->GetFileSize(); }
99
100
 
100
101
  private:
101
102
  FileState state_;
@@ -408,7 +408,7 @@ IOStatus TestFSRandomAccessFile::Read(uint64_t offset, size_t n,
408
408
  scratch, /*need_count_increase=*/true, /*fault_injected=*/nullptr);
409
409
  }
410
410
  if (s.ok() && fs_->ShouldInjectRandomReadError()) {
411
- return IOStatus::IOError("Injected read error");
411
+ return IOStatus::IOError("injected read error");
412
412
  }
413
413
  return s;
414
414
  }
@@ -430,7 +430,7 @@ IOStatus TestFSRandomAccessFile::ReadAsync(
430
430
  }
431
431
  if (ret.ok()) {
432
432
  if (fs_->ShouldInjectRandomReadError()) {
433
- ret = IOStatus::IOError("Injected read error");
433
+ ret = IOStatus::IOError("injected read error");
434
434
  } else {
435
435
  s = target_->ReadAsync(req, opts, cb, cb_arg, io_handle, del_fn, nullptr);
436
436
  }
@@ -470,7 +470,7 @@ IOStatus TestFSRandomAccessFile::MultiRead(FSReadRequest* reqs, size_t num_reqs,
470
470
  /*fault_injected=*/nullptr);
471
471
  }
472
472
  if (s.ok() && fs_->ShouldInjectRandomReadError()) {
473
- return IOStatus::IOError("Injected read error");
473
+ return IOStatus::IOError("injected read error");
474
474
  }
475
475
  return s;
476
476
  }
@@ -487,7 +487,7 @@ IOStatus TestFSSequentialFile::Read(size_t n, const IOOptions& options,
487
487
  IODebugContext* dbg) {
488
488
  IOStatus s = target()->Read(n, options, result, scratch, dbg);
489
489
  if (s.ok() && fs_->ShouldInjectRandomReadError()) {
490
- return IOStatus::IOError("Injected seq read error");
490
+ return IOStatus::IOError("injected seq read error");
491
491
  }
492
492
  return s;
493
493
  }
@@ -499,7 +499,7 @@ IOStatus TestFSSequentialFile::PositionedRead(uint64_t offset, size_t n,
499
499
  IOStatus s =
500
500
  target()->PositionedRead(offset, n, options, result, scratch, dbg);
501
501
  if (s.ok() && fs_->ShouldInjectRandomReadError()) {
502
- return IOStatus::IOError("Injected seq positioned read error");
502
+ return IOStatus::IOError("injected seq positioned read error");
503
503
  }
504
504
  return s;
505
505
  }
@@ -678,7 +678,7 @@ IOStatus FaultInjectionTestFS::NewRandomAccessFile(
678
678
  return GetError();
679
679
  }
680
680
  if (ShouldInjectRandomReadError()) {
681
- return IOStatus::IOError("Injected error when open random access file");
681
+ return IOStatus::IOError("injected error when open random access file");
682
682
  }
683
683
  IOStatus io_s = InjectThreadSpecificReadError(ErrorOperation::kOpen, nullptr,
684
684
  false, nullptr,
@@ -701,7 +701,7 @@ IOStatus FaultInjectionTestFS::NewSequentialFile(
701
701
  }
702
702
 
703
703
  if (ShouldInjectRandomReadError()) {
704
- return IOStatus::IOError("Injected read error when creating seq file");
704
+ return IOStatus::IOError("injected read error when creating seq file");
705
705
  }
706
706
  IOStatus io_s = target()->NewSequentialFile(fname, file_opts, result, dbg);
707
707
  if (io_s.ok()) {
@@ -956,6 +956,7 @@ IOStatus FaultInjectionTestFS::InjectThreadSpecificReadError(
956
956
  return IOStatus::OK();
957
957
  }
958
958
 
959
+ IOStatus ret;
959
960
  if (ctx->rand.OneIn(ctx->one_in)) {
960
961
  if (ctx->count == 0) {
961
962
  ctx->message = "";
@@ -970,15 +971,15 @@ IOStatus FaultInjectionTestFS::InjectThreadSpecificReadError(
970
971
 
971
972
  if (op != ErrorOperation::kMultiReadSingleReq) {
972
973
  // Likely non-per read status code for MultiRead
973
- ctx->message += "error; ";
974
+ ctx->message += "injected read error; ";
974
975
  ret_fault_injected = true;
975
- return IOStatus::IOError();
976
+ ret = IOStatus::IOError(ctx->message);
976
977
  } else if (Random::GetTLSInstance()->OneIn(8)) {
977
978
  assert(result);
978
979
  // For a small chance, set the failure to status but turn the
979
980
  // result to be empty, which is supposed to be caught for a check.
980
981
  *result = Slice();
981
- ctx->message += "inject empty result; ";
982
+ ctx->message += "injected empty result; ";
982
983
  ret_fault_injected = true;
983
984
  } else if (!direct_io && Random::GetTLSInstance()->OneIn(7) &&
984
985
  scratch != nullptr && result->data() == scratch) {
@@ -995,15 +996,18 @@ IOStatus FaultInjectionTestFS::InjectThreadSpecificReadError(
995
996
  // It would work for CRC. Not 100% sure for xxhash and will adjust
996
997
  // if it is not the case.
997
998
  const_cast<char*>(result->data())[result->size() - 1]++;
998
- ctx->message += "corrupt last byte; ";
999
+ ctx->message += "injected corrupt last byte; ";
999
1000
  ret_fault_injected = true;
1000
1001
  } else {
1001
- ctx->message += "error result multiget single; ";
1002
+ ctx->message += "injected error result multiget single; ";
1002
1003
  ret_fault_injected = true;
1003
- return IOStatus::IOError();
1004
+ ret = IOStatus::IOError(ctx->message);
1004
1005
  }
1005
1006
  }
1006
- return IOStatus::OK();
1007
+ if (ctx->retryable) {
1008
+ ret.SetRetryable(true);
1009
+ }
1010
+ return ret;
1007
1011
  }
1008
1012
 
1009
1013
  bool FaultInjectionTestFS::TryParseFileName(const std::string& file_name,
@@ -1052,7 +1056,7 @@ IOStatus FaultInjectionTestFS::InjectMetadataWriteError() {
1052
1056
  }
1053
1057
  }
1054
1058
  TEST_SYNC_POINT("FaultInjectionTestFS::InjectMetadataWriteError:Injected");
1055
- return IOStatus::IOError();
1059
+ return IOStatus::IOError("injected metadata write error");
1056
1060
  }
1057
1061
 
1058
1062
  void FaultInjectionTestFS::PrintFaultBacktrace() {
@@ -323,8 +323,8 @@ class FaultInjectionTestFS : public FileSystemWrapper {
323
323
  if (!TryParseFileName(file_name, &file_number, &file_type)) {
324
324
  return false;
325
325
  }
326
- return skip_direct_writable_types_.find(file_type) !=
327
- skip_direct_writable_types_.end();
326
+ return direct_writable_types_.find(file_type) !=
327
+ direct_writable_types_.end();
328
328
  }
329
329
  void SetFilesystemActiveNoLock(
330
330
  bool active, IOStatus error = IOStatus::Corruption("Not active")) {
@@ -402,7 +402,8 @@ class FaultInjectionTestFS : public FileSystemWrapper {
402
402
  // seed is the seed for the random number generator, and one_in determines
403
403
  // the probability of injecting error (i.e an error is injected with
404
404
  // 1/one_in probability)
405
- void SetThreadLocalReadErrorContext(uint32_t seed, int one_in) {
405
+ void SetThreadLocalReadErrorContext(uint32_t seed, int one_in,
406
+ bool retryable) {
406
407
  struct ErrorContext* ctx =
407
408
  static_cast<struct ErrorContext*>(thread_local_error_->Get());
408
409
  if (ctx == nullptr) {
@@ -411,6 +412,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
411
412
  }
412
413
  ctx->one_in = one_in;
413
414
  ctx->count = 0;
415
+ ctx->retryable = retryable;
414
416
  }
415
417
 
416
418
  static void DeleteThreadLocalErrorContext(void* p) {
@@ -437,9 +439,9 @@ class FaultInjectionTestFS : public FileSystemWrapper {
437
439
  write_error_allowed_types_ = types;
438
440
  }
439
441
 
440
- void SetSkipDirectWritableTypes(const std::set<FileType>& types) {
442
+ void SetDirectWritableTypes(const std::set<FileType>& types) {
441
443
  MutexLock l(&mutex_);
442
- skip_direct_writable_types_ = types;
444
+ direct_writable_types_ = types;
443
445
  }
444
446
 
445
447
  void SetRandomMetadataWriteError(int one_in) {
@@ -556,12 +558,14 @@ class FaultInjectionTestFS : public FileSystemWrapper {
556
558
  std::string message;
557
559
  int frames;
558
560
  ErrorType type;
561
+ bool retryable;
559
562
 
560
563
  explicit ErrorContext(uint32_t seed)
561
564
  : rand(seed),
562
565
  enable_error_injection(false),
563
566
  callstack(nullptr),
564
- frames(0) {}
567
+ frames(0),
568
+ retryable(false) {}
565
569
  ~ErrorContext() {
566
570
  if (callstack) {
567
571
  free(callstack);
@@ -579,7 +583,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
579
583
  bool inject_for_all_file_types_;
580
584
  std::vector<FileType> write_error_allowed_types_;
581
585
  // File types where direct writable is skipped.
582
- std::set<FileType> skip_direct_writable_types_;
586
+ std::set<FileType> direct_writable_types_;
583
587
  bool ingest_data_corruption_before_write_;
584
588
  ChecksumType checksum_handoff_func_tpye_;
585
589
  bool fail_get_file_unique_id_;
@@ -35,6 +35,11 @@ class FaultInjectionSecondaryCache : public SecondaryCache {
35
35
  const Cache::CacheItemHelper* helper,
36
36
  bool force_insert) override;
37
37
 
38
+ Status InsertSaved(const Slice& /*key*/, const Slice& /*saved*/,
39
+ CompressionType /*type*/, CacheTier /*source*/) override {
40
+ return Status::OK();
41
+ }
42
+
38
43
  std::unique_ptr<SecondaryCacheResultHandle> Lookup(
39
44
  const Slice& key, const Cache::CacheItemHelper* helper,
40
45
  Cache::CreateContext* create_context, bool wait, bool advise_erase,
@@ -193,6 +193,7 @@ TEST_P(StringAppendOperatorTest, IteratorTest) {
193
193
  ASSERT_EQ(res, "a1,a2,a3");
194
194
  }
195
195
  }
196
+ ASSERT_OK(it->status());
196
197
 
197
198
  // Should release the snapshot and be aware of the new stuff now
198
199
  it.reset(db_->NewIterator(ReadOptions()));
@@ -217,6 +218,7 @@ TEST_P(StringAppendOperatorTest, IteratorTest) {
217
218
  ASSERT_EQ(res, "a1,a2,a3,a4");
218
219
  }
219
220
  }
221
+ ASSERT_OK(it->status());
220
222
 
221
223
  slists.Append("k3", "g1");
222
224
 
@@ -242,6 +244,7 @@ TEST_P(StringAppendOperatorTest, IteratorTest) {
242
244
  ASSERT_EQ(res, "g1");
243
245
  }
244
246
  }
247
+ ASSERT_OK(it->status());
245
248
  }
246
249
 
247
250
  TEST_P(StringAppendOperatorTest, SimpleTest) {
@@ -87,6 +87,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate1) {
87
87
  for (; it->Valid(); it->Next()) {
88
88
  keys.insert(it->key().ToString());
89
89
  }
90
+ ASSERT_OK(it->status());
90
91
  }
91
92
  Close();
92
93
 
@@ -124,6 +125,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate1) {
124
125
  it->Next();
125
126
  }
126
127
  ASSERT_TRUE(!it->Valid());
128
+ ASSERT_OK(it->status());
127
129
  }
128
130
  }
129
131
 
@@ -165,6 +167,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate2) {
165
167
  for (; it->Valid(); it->Next()) {
166
168
  keys.insert(it->key().ToString());
167
169
  }
170
+ ASSERT_OK(it->status());
168
171
  }
169
172
 
170
173
  Close();
@@ -202,6 +205,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate2) {
202
205
  it->Next();
203
206
  }
204
207
  ASSERT_TRUE(!it->Valid());
208
+ ASSERT_OK(it->status());
205
209
  }
206
210
  }
207
211
 
@@ -249,6 +253,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate3) {
249
253
  for (; it->Valid(); it->Next()) {
250
254
  keys.insert(it->key().ToString());
251
255
  }
256
+ ASSERT_OK(it->status());
252
257
  }
253
258
  Close();
254
259
 
@@ -286,6 +291,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate3) {
286
291
  it->Next();
287
292
  }
288
293
  ASSERT_TRUE(!it->Valid());
294
+ ASSERT_OK(it->status());
289
295
  }
290
296
  }
291
297
 
@@ -333,6 +339,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate4) {
333
339
  for (; it->Valid(); it->Next()) {
334
340
  keys.insert(it->key().ToString());
335
341
  }
342
+ ASSERT_OK(it->status());
336
343
  }
337
344
 
338
345
  Close();
@@ -370,6 +377,7 @@ TEST_P(DBOptionChangeMigrationTests, Migrate4) {
370
377
  it->Next();
371
378
  }
372
379
  ASSERT_TRUE(!it->Valid());
380
+ ASSERT_OK(it->status());
373
381
  }
374
382
  }
375
383
 
@@ -509,6 +517,7 @@ TEST_F(DBOptionChangeMigrationTest, CompactedSrcToUniversal) {
509
517
  for (; it->Valid(); it->Next()) {
510
518
  keys.insert(it->key().ToString());
511
519
  }
520
+ ASSERT_OK(it->status());
512
521
  }
513
522
 
514
523
  Close();
@@ -169,7 +169,8 @@ class SimCacheImpl : public SimCache {
169
169
 
170
170
  Status Insert(const Slice& key, Cache::ObjectPtr value,
171
171
  const CacheItemHelper* helper, size_t charge, Handle** handle,
172
- Priority priority) override {
172
+ Priority priority, const Slice& compressed = {},
173
+ CompressionType type = kNoCompression) override {
173
174
  // The handle and value passed in are for real cache, so we pass nullptr
174
175
  // to key_only_cache_ for both instead. Also, the deleter function pointer
175
176
  // will be called by user to perform some external operation which should
@@ -178,8 +179,9 @@ class SimCacheImpl : public SimCache {
178
179
  Handle* h = key_only_cache_->Lookup(key);
179
180
  if (h == nullptr) {
180
181
  // TODO: Check for error here?
181
- auto s = key_only_cache_->Insert(key, nullptr, &kNoopCacheItemHelper,
182
- charge, nullptr, priority);
182
+ auto s =
183
+ key_only_cache_->Insert(key, nullptr, &kNoopCacheItemHelper, charge,
184
+ nullptr, priority, compressed, type);
183
185
  s.PermitUncheckedError();
184
186
  } else {
185
187
  key_only_cache_->Release(h);
@@ -189,7 +191,8 @@ class SimCacheImpl : public SimCache {
189
191
  if (!target_) {
190
192
  return Status::OK();
191
193
  }
192
- return target_->Insert(key, value, helper, charge, handle, priority);
194
+ return target_->Insert(key, value, helper, charge, handle, priority,
195
+ compressed, type);
193
196
  }
194
197
 
195
198
  Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
@@ -0,0 +1,13 @@
1
+ The files in this directory originally come from
2
+ https://github.com/percona/PerconaFT/.
3
+
4
+ This directory only includes the "locktree" part of PerconaFT, and its
5
+ dependencies.
6
+
7
+ The following modifications were made:
8
+ - Make locktree usable outside of PerconaFT library
9
+ - Add shared read-only lock support
10
+
11
+ The files named *_subst.* are substitutes of the PerconaFT's files, they
12
+ contain replacements of PerconaFT's functionality.
13
+
@@ -1635,6 +1635,47 @@ TEST_P(OptimisticTransactionTest, SequenceNumberAfterRecoverTest) {
1635
1635
  delete transaction;
1636
1636
  }
1637
1637
 
1638
+ #ifdef __SANITIZE_THREAD__
1639
+ // Skip OptimisticTransactionTest.SequenceNumberAfterRecoverLargeTest under TSAN
1640
+ // to avoid false positive because of TSAN lock limit of 64.
1641
+ #else
1642
+ TEST_P(OptimisticTransactionTest, SequenceNumberAfterRecoverLargeTest) {
1643
+ WriteOptions write_options;
1644
+ OptimisticTransactionOptions transaction_options;
1645
+
1646
+ Transaction* transaction(
1647
+ txn_db->BeginTransaction(write_options, transaction_options));
1648
+
1649
+ std::string value(1024 * 1024, 'X');
1650
+ const size_t n_zero = 2;
1651
+ std::string s_i;
1652
+ Status s;
1653
+ for (int i = 1; i <= 64; i++) {
1654
+ s_i = std::to_string(i);
1655
+ auto key = std::string(n_zero - std::min(n_zero, s_i.length()), '0') + s_i;
1656
+ s = transaction->Put(key, value);
1657
+ ASSERT_OK(s);
1658
+ }
1659
+
1660
+ s = transaction->Commit();
1661
+ ASSERT_OK(s);
1662
+ delete transaction;
1663
+
1664
+ Reopen();
1665
+ transaction = txn_db->BeginTransaction(write_options, transaction_options);
1666
+ s = transaction->Put("bar", "val");
1667
+ ASSERT_OK(s);
1668
+ s = transaction->Commit();
1669
+ if (!s.ok()) {
1670
+ std::cerr << "Failed to commit records. Error: " << s.ToString()
1671
+ << std::endl;
1672
+ }
1673
+ ASSERT_OK(s);
1674
+
1675
+ delete transaction;
1676
+ }
1677
+ #endif // __SANITIZE_THREAD__
1678
+
1638
1679
  TEST_P(OptimisticTransactionTest, TimestampedSnapshotMissingCommitTs) {
1639
1680
  std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
1640
1681
  ASSERT_OK(txn->Put("a", "v"));