@nxtedition/rocksdb 6.0.0-alpha.0 → 6.0.2

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 (311) hide show
  1. package/BUILDING.md +10 -0
  2. package/binding.cc +14 -17
  3. package/binding.gyp +2 -2
  4. package/deps/rocksdb/build_version.cc +4 -10
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
  6. package/deps/rocksdb/rocksdb/Makefile +57 -86
  7. package/deps/rocksdb/rocksdb/TARGETS +4 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
  13. package/deps/rocksdb/rocksdb/common.mk +30 -0
  14. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  15. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  16. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  17. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  18. package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
  19. package/deps/rocksdb/rocksdb/db/c.cc +45 -0
  20. package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
  21. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
  22. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  23. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
  37. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  38. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  39. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  40. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
  42. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  43. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  44. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  45. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  46. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
  55. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  56. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  57. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  58. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  59. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  60. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  61. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  62. package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
  63. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  64. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  65. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
  66. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  69. package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
  70. package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
  71. package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
  72. package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
  73. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  75. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
  76. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  77. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  78. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  79. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  80. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
  81. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  83. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  84. package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
  85. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  86. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  87. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
  89. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  90. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  91. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  92. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  93. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  94. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  96. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  97. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  98. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
  100. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  101. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
  102. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  103. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
  104. package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
  105. package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
  106. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  107. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  108. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  109. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  112. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  120. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  121. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
  122. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  123. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  124. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  125. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  126. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  127. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  128. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  129. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  130. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  131. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  132. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  133. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  134. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  135. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  136. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  137. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
  138. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  139. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  140. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  141. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
  142. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
  143. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  145. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  146. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  147. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  148. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  149. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  150. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  151. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  152. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
  153. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  154. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  155. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  156. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  157. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
  160. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  162. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  163. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  164. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  165. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  166. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  167. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  168. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  169. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  170. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  171. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  172. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  174. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
  175. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  176. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  177. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  178. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  179. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  180. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  182. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  183. package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
  184. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  185. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  186. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  187. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  188. package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
  189. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  190. package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
  191. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  192. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
  193. package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
  194. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  195. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  196. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  197. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  198. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  199. package/deps/rocksdb/rocksdb/src.mk +2 -0
  200. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  201. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  202. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  203. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  204. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
  205. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  206. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
  208. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
  209. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
  210. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  211. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  212. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  213. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  214. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  215. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  217. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
  218. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
  219. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  220. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
  221. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  222. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  223. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  224. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  225. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  226. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  227. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  228. package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
  229. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  230. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  231. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  232. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  233. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  234. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  235. package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
  236. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
  237. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
  238. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  239. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  240. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  241. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  242. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  243. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
  244. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  246. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  247. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  248. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  249. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  250. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
  251. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  252. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  253. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  254. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  255. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  256. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  257. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  258. package/deps/rocksdb/rocksdb/util/compression.h +7 -7
  259. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  260. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  261. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  262. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  263. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  264. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  265. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  266. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  267. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  268. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  269. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  270. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  271. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  272. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  273. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  274. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  275. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  276. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  277. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  278. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  279. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  280. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  281. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  282. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  283. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  284. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  285. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  286. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  287. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  288. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  289. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  290. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  291. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  292. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  293. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  294. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  295. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  296. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  297. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  298. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  299. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  300. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  301. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  302. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  303. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  304. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  305. package/deps/rocksdb/rocksdb.gyp +40 -31
  306. package/package.json +2 -2
  307. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  308. package/prebuilds/linux-x64/node.napi.node +0 -0
  309. package/deps/rocksdb/rocksdb/python.mk +0 -9
  310. package/prebuilds/darwin-x64/node.napi.node +0 -0
  311. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include <algorithm>
12
12
  #include <array>
13
+ #include <cstdint>
13
14
  #include <limits>
14
15
  #include <memory>
15
16
  #include <string>
@@ -117,14 +118,6 @@ Status ReadBlockFromFile(
117
118
  return s;
118
119
  }
119
120
 
120
- // Release the cached entry and decrement its ref count.
121
- // Do not force erase
122
- void ReleaseCachedEntry(void* arg, void* h) {
123
- Cache* cache = reinterpret_cast<Cache*>(arg);
124
- Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(h);
125
- cache->Release(handle, false /* erase_if_last_ref */);
126
- }
127
-
128
121
  // For hash based index, return false if table_properties->prefix_extractor_name
129
122
  // and prefix_extractor both exist and match, otherwise true.
130
123
  inline bool PrefixExtractorChangedHelper(
@@ -568,7 +561,7 @@ Status BlockBasedTable::Open(
568
561
  Footer footer;
569
562
  std::unique_ptr<FilePrefetchBuffer> prefetch_buffer;
570
563
 
571
- // Only retain read_options.deadline and read_options.io_timeout.
564
+ // From read_options, retain deadline, io_timeout, and rate_limiter_priority.
572
565
  // In future, we may retain more
573
566
  // options. Specifically, w ignore verify_checksums and default to
574
567
  // checksum verification anyway when creating the index and filter
@@ -576,6 +569,7 @@ Status BlockBasedTable::Open(
576
569
  ReadOptions ro;
577
570
  ro.deadline = read_options.deadline;
578
571
  ro.io_timeout = read_options.io_timeout;
572
+ ro.rate_limiter_priority = read_options.rate_limiter_priority;
579
573
 
580
574
  // prefetch both index and filters, down to all partitions
581
575
  const bool prefetch_all = prefetch_index_and_filter_in_cache || level == 0;
@@ -725,7 +719,10 @@ Status BlockBasedTable::Open(
725
719
  mem_usage, &(rep->table_reader_cache_res_handle));
726
720
  if (s.IsIncomplete()) {
727
721
  s = Status::MemoryLimit(
728
- "Can't allocate BlockBasedTableReader due to memory limit based on "
722
+ "Can't allocate " +
723
+ kCacheEntryRoleToCamelString[static_cast<std::uint32_t>(
724
+ CacheEntryRole::kBlockBasedTableReader)] +
725
+ " due to memory limit based on "
729
726
  "cache capacity for memory allocation");
730
727
  }
731
728
  }
@@ -770,7 +767,8 @@ Status BlockBasedTable::PrefetchTail(
770
767
 
771
768
  // Try file system prefetch
772
769
  if (!file->use_direct_io() && !force_direct_prefetch) {
773
- if (!file->Prefetch(prefetch_off, prefetch_len).IsNotSupported()) {
770
+ if (!file->Prefetch(prefetch_off, prefetch_len, ro.rate_limiter_priority)
771
+ .IsNotSupported()) {
774
772
  prefetch_buffer->reset(new FilePrefetchBuffer(
775
773
  0 /* readahead_size */, 0 /* max_readahead_size */,
776
774
  false /* enable */, true /* track_min_offset */));
@@ -782,6 +780,7 @@ Status BlockBasedTable::PrefetchTail(
782
780
  prefetch_buffer->reset(
783
781
  new FilePrefetchBuffer(0 /* readahead_size */, 0 /* max_readahead_size */,
784
782
  true /* enable */, true /* track_min_offset */));
783
+
785
784
  IOOptions opts;
786
785
  Status s = file->PrepareIOOptions(ro, opts);
787
786
  if (s.ok()) {
@@ -1819,10 +1818,11 @@ void BlockBasedTable::RetrieveMultipleBlocks(
1819
1818
  if (s.ok()) {
1820
1819
  if ((req.result.size() != req.len) ||
1821
1820
  (req_offset + BlockSizeWithTrailer(handle) > req.result.size())) {
1822
- s = Status::Corruption(
1823
- "truncated block read from " + rep_->file->file_name() +
1824
- " offset " + ToString(handle.offset()) + ", expected " +
1825
- ToString(req.len) + " bytes, got " + ToString(req.result.size()));
1821
+ s = Status::Corruption("truncated block read from " +
1822
+ rep_->file->file_name() + " offset " +
1823
+ std::to_string(handle.offset()) + ", expected " +
1824
+ std::to_string(req.len) + " bytes, got " +
1825
+ std::to_string(req.result.size()));
1826
1826
  }
1827
1827
  }
1828
1828
 
@@ -2570,10 +2570,11 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2570
2570
  iiter_unique_ptr.reset(iiter);
2571
2571
  }
2572
2572
 
2573
- uint64_t offset = std::numeric_limits<uint64_t>::max();
2573
+ uint64_t prev_offset = std::numeric_limits<uint64_t>::max();
2574
2574
  autovector<BlockHandle, MultiGetContext::MAX_BATCH_SIZE> block_handles;
2575
2575
  autovector<CachableEntry<Block>, MultiGetContext::MAX_BATCH_SIZE> results;
2576
2576
  autovector<Status, MultiGetContext::MAX_BATCH_SIZE> statuses;
2577
+ MultiGetContext::Mask reused_mask = 0;
2577
2578
  char stack_buf[kMultiGetReadStackBufSize];
2578
2579
  std::unique_ptr<char[]> block_buf;
2579
2580
  {
@@ -2635,16 +2636,19 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2635
2636
 
2636
2637
  statuses.emplace_back();
2637
2638
  results.emplace_back();
2638
- if (v.handle.offset() == offset) {
2639
- // We're going to reuse the block for this key later on. No need to
2640
- // look it up now. Place a null handle
2639
+ if (v.handle.offset() == prev_offset) {
2640
+ // This key can reuse the previous block (later on).
2641
+ // Mark previous as "reused"
2642
+ reused_mask |= MultiGetContext::Mask{1} << (block_handles.size() - 1);
2643
+ // Use null handle to indicate this one reuses same block as
2644
+ // previous.
2641
2645
  block_handles.emplace_back(BlockHandle::NullBlockHandle());
2642
2646
  continue;
2643
2647
  }
2644
2648
  // Lookup the cache for the given data block referenced by an index
2645
2649
  // iterator value (i.e BlockHandle). If it exists in the cache,
2646
2650
  // initialize block to the contents of the data block.
2647
- offset = v.handle.offset();
2651
+ prev_offset = v.handle.offset();
2648
2652
  BlockHandle handle = v.handle;
2649
2653
  BlockCacheLookupContext lookup_data_block_context(
2650
2654
  TableReaderCaller::kUserMultiGet);
@@ -2748,6 +2752,7 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2748
2752
  DataBlockIter first_biter;
2749
2753
  DataBlockIter next_biter;
2750
2754
  size_t idx_in_batch = 0;
2755
+ SharedCleanablePtr shared_cleanable;
2751
2756
  for (auto miter = sst_file_range.begin(); miter != sst_file_range.end();
2752
2757
  ++miter) {
2753
2758
  Status s;
@@ -2758,7 +2763,8 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2758
2763
  bool first_block = true;
2759
2764
  do {
2760
2765
  DataBlockIter* biter = nullptr;
2761
- bool reusing_block = true;
2766
+ bool reusing_prev_block;
2767
+ bool later_reused;
2762
2768
  uint64_t referenced_data_size = 0;
2763
2769
  bool does_referenced_key_exist = false;
2764
2770
  BlockCacheLookupContext lookup_data_block_context(
@@ -2772,13 +2778,16 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2772
2778
  NewDataBlockIterator<DataBlockIter>(
2773
2779
  read_options, results[idx_in_batch], &first_biter,
2774
2780
  statuses[idx_in_batch]);
2775
- reusing_block = false;
2781
+ reusing_prev_block = false;
2776
2782
  } else {
2777
2783
  // If handler is null and result is empty, then the status is never
2778
2784
  // set, which should be the initial value: ok().
2779
2785
  assert(statuses[idx_in_batch].ok());
2786
+ reusing_prev_block = true;
2780
2787
  }
2781
2788
  biter = &first_biter;
2789
+ later_reused =
2790
+ (reused_mask & (MultiGetContext::Mask{1} << idx_in_batch)) != 0;
2782
2791
  idx_in_batch++;
2783
2792
  } else {
2784
2793
  IndexValue v = iiter->value();
@@ -2798,7 +2807,8 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2798
2807
  BlockType::kData, get_context, &lookup_data_block_context,
2799
2808
  Status(), nullptr);
2800
2809
  biter = &next_biter;
2801
- reusing_block = false;
2810
+ reusing_prev_block = false;
2811
+ later_reused = false;
2802
2812
  }
2803
2813
 
2804
2814
  if (read_options.read_tier == kBlockCacheTier &&
@@ -2823,28 +2833,56 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2823
2833
  break;
2824
2834
  }
2825
2835
 
2836
+ // Reusing blocks complicates pinning/Cleanable, because the cache
2837
+ // entry referenced by biter can only be released once all returned
2838
+ // pinned values are released. This code previously did an extra
2839
+ // block_cache Ref for each reuse, but that unnecessarily increases
2840
+ // block cache contention. Instead we can use a variant of shared_ptr
2841
+ // to release in block cache only once.
2842
+ //
2843
+ // Although the biter loop below might SaveValue multiple times for
2844
+ // merges, just one value_pinner suffices, as MultiGet will merge
2845
+ // the operands before returning to the API user.
2846
+ Cleanable* value_pinner;
2847
+ if (biter->IsValuePinned()) {
2848
+ if (reusing_prev_block) {
2849
+ // Note that we don't yet know if the MultiGet results will need
2850
+ // to pin this block, so we might wrap a block for sharing and
2851
+ // still end up with 1 (or 0) pinning ref. Not ideal but OK.
2852
+ //
2853
+ // Here we avoid adding redundant cleanups if we didn't end up
2854
+ // delegating the cleanup from last time around.
2855
+ if (!biter->HasCleanups()) {
2856
+ assert(shared_cleanable.get());
2857
+ if (later_reused) {
2858
+ shared_cleanable.RegisterCopyWith(biter);
2859
+ } else {
2860
+ shared_cleanable.MoveAsCleanupTo(biter);
2861
+ }
2862
+ }
2863
+ } else if (later_reused) {
2864
+ assert(biter->HasCleanups());
2865
+ // Make the existing cleanups on `biter` sharable:
2866
+ shared_cleanable.Allocate();
2867
+ // Move existing `biter` cleanup(s) to `shared_cleanable`
2868
+ biter->DelegateCleanupsTo(&*shared_cleanable);
2869
+ // Reference `shared_cleanable` as new cleanup for `biter`
2870
+ shared_cleanable.RegisterCopyWith(biter);
2871
+ }
2872
+ assert(biter->HasCleanups());
2873
+ value_pinner = biter;
2874
+ } else {
2875
+ value_pinner = nullptr;
2876
+ }
2877
+
2826
2878
  // Call the *saver function on each entry/block until it returns false
2827
2879
  for (; biter->Valid(); biter->Next()) {
2828
2880
  ParsedInternalKey parsed_key;
2829
- Cleanable dummy;
2830
- Cleanable* value_pinner = nullptr;
2831
2881
  Status pik_status = ParseInternalKey(
2832
2882
  biter->key(), &parsed_key, false /* log_err_key */); // TODO
2833
2883
  if (!pik_status.ok()) {
2834
2884
  s = pik_status;
2835
2885
  }
2836
- if (biter->IsValuePinned()) {
2837
- if (reusing_block) {
2838
- Cache* block_cache = rep_->table_options.block_cache.get();
2839
- assert(biter->cache_handle() != nullptr);
2840
- block_cache->Ref(biter->cache_handle());
2841
- dummy.RegisterCleanup(&ReleaseCachedEntry, block_cache,
2842
- biter->cache_handle());
2843
- value_pinner = &dummy;
2844
- } else {
2845
- value_pinner = biter;
2846
- }
2847
- }
2848
2886
  if (!get_context->SaveValue(parsed_key, biter->value(), &matched,
2849
2887
  value_pinner)) {
2850
2888
  if (get_context->State() == GetContext::GetState::kFound) {
@@ -2858,7 +2896,10 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2858
2896
  s = biter->status();
2859
2897
  }
2860
2898
  // Write the block cache access.
2861
- if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled()) {
2899
+ // XXX: There appear to be 'break' statements above that bypass this
2900
+ // writing of the block cache trace record
2901
+ if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled() &&
2902
+ !reusing_prev_block) {
2862
2903
  // Avoid making copy of block_key, cf_name, and referenced_key when
2863
2904
  // constructing the access record.
2864
2905
  Slice referenced_key;
@@ -2894,6 +2935,9 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
2894
2935
  }
2895
2936
  if (first_block) {
2896
2937
  iiter->Seek(key);
2938
+ if (!iiter->Valid()) {
2939
+ break;
2940
+ }
2897
2941
  }
2898
2942
  first_block = false;
2899
2943
  iiter->Next();
@@ -3203,7 +3247,7 @@ Status BlockBasedTable::CreateIndexReader(
3203
3247
  }
3204
3248
  default: {
3205
3249
  std::string error_message =
3206
- "Unrecognized index type: " + ToString(rep_->index_type);
3250
+ "Unrecognized index type: " + std::to_string(rep_->index_type);
3207
3251
  return Status::InvalidArgument(error_message.c_str());
3208
3252
  }
3209
3253
  }
@@ -3626,8 +3670,8 @@ Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
3626
3670
  out_stream << " # data blocks: " << num_datablocks << "\n";
3627
3671
  out_stream << " min data block size: " << datablock_size_min << "\n";
3628
3672
  out_stream << " max data block size: " << datablock_size_max << "\n";
3629
- out_stream << " avg data block size: " << ToString(datablock_size_avg)
3630
- << "\n";
3673
+ out_stream << " avg data block size: "
3674
+ << std::to_string(datablock_size_avg) << "\n";
3631
3675
  }
3632
3676
 
3633
3677
  return Status::OK();
@@ -283,46 +283,10 @@ TEST_P(BlockBasedTableReaderTest, MultiGet) {
283
283
  }
284
284
  }
285
285
 
286
- class BlockBasedTableReaderResOnlyCache : public CacheWrapper {
287
- public:
288
- explicit BlockBasedTableReaderResOnlyCache(std::shared_ptr<Cache> target)
289
- : CacheWrapper(std::move(target)) {}
290
-
291
- using Cache::Insert;
292
- Status Insert(const Slice& key, void* value, size_t charge,
293
- void (*deleter)(const Slice& key, void* value),
294
- Handle** handle = nullptr,
295
- Priority priority = Priority::LOW) override {
296
- if (deleter == kNoopDeleterForBlockBasedTableReader) {
297
- return target_->Insert(key, value, charge, deleter, handle, priority);
298
- } else {
299
- return Status::OK();
300
- }
301
- }
302
-
303
- using Cache::Release;
304
- bool Release(Handle* handle, bool force_erase = false) override {
305
- auto deleter = GetDeleter(handle);
306
- if (deleter == kNoopDeleterForBlockBasedTableReader) {
307
- return target_->Release(handle, force_erase);
308
- } else {
309
- return true;
310
- }
311
- }
312
-
313
- private:
314
- static const Cache::DeleterFn kNoopDeleterForBlockBasedTableReader;
315
- };
316
-
317
- const Cache::DeleterFn
318
- BlockBasedTableReaderResOnlyCache::kNoopDeleterForBlockBasedTableReader =
319
- CacheReservationManagerImpl<CacheEntryRole::kBlockBasedTableReader>::
320
- TEST_GetNoopDeleterForRole();
321
-
322
- class BlockBasedTableReaderCapMemoryTest
286
+ class ChargeTableReaderTest
323
287
  : public BlockBasedTableReaderBaseTest,
324
288
  public testing::WithParamInterface<
325
- bool /* reserve_table_builder_memory */> {
289
+ CacheEntryRoleOptions::Decision /* charge_table_reader_mem */> {
326
290
  protected:
327
291
  static std::size_t CalculateMaxTableReaderNumBeforeCacheFull(
328
292
  std::size_t cache_capacity, std::size_t approx_table_reader_mem) {
@@ -361,28 +325,30 @@ class BlockBasedTableReaderCapMemoryTest
361
325
  kv_ = BlockBasedTableReaderBaseTest::GenerateKVMap();
362
326
  compression_type_ = CompressionType::kNoCompression;
363
327
 
364
- table_reader_res_only_cache_.reset(new BlockBasedTableReaderResOnlyCache(
365
- NewLRUCache(4 * CacheReservationManagerImpl<
366
- CacheEntryRole::kBlockBasedTableReader>::
367
- GetDummyEntrySize(),
368
- 0 /* num_shard_bits */, true /* strict_capacity_limit */)));
328
+ table_reader_charge_tracking_cache_ = std::make_shared<
329
+ TargetCacheChargeTrackingCache<
330
+ CacheEntryRole::kBlockBasedTableReader>>((NewLRUCache(
331
+ 4 * CacheReservationManagerImpl<
332
+ CacheEntryRole::kBlockBasedTableReader>::GetDummyEntrySize(),
333
+ 0 /* num_shard_bits */, true /* strict_capacity_limit */)));
369
334
 
370
- // To ApproximateTableReaderMem() without encountering any potential errors
371
- // caused by BlocBasedTableReader::reserve_table_reader_memory == true, we
372
- // first turn off the feature to test
373
- reserve_table_reader_memory_ = false;
335
+ // To ApproximateTableReaderMem() without being affected by
336
+ // the feature of charging its memory, we turn off the feature
337
+ charge_table_reader_ = CacheEntryRoleOptions::Decision::kDisabled;
374
338
  BlockBasedTableReaderBaseTest::SetUp();
375
339
  approx_table_reader_mem_ = ApproximateTableReaderMem();
376
340
 
377
341
  // Now we condtionally turn on the feature to test
378
- reserve_table_reader_memory_ = GetParam();
342
+ charge_table_reader_ = GetParam();
379
343
  ConfigureTableFactory();
380
344
  }
381
345
 
382
346
  void ConfigureTableFactory() override {
383
347
  BlockBasedTableOptions table_options;
384
- table_options.reserve_table_reader_memory = reserve_table_reader_memory_;
385
- table_options.block_cache = table_reader_res_only_cache_;
348
+ table_options.cache_usage_options.options_overrides.insert(
349
+ {CacheEntryRole::kBlockBasedTableReader,
350
+ {/*.charged = */ charge_table_reader_}});
351
+ table_options.block_cache = table_reader_charge_tracking_cache_;
386
352
 
387
353
  table_options.cache_index_and_filter_blocks = false;
388
354
  table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));
@@ -392,9 +358,10 @@ class BlockBasedTableReaderCapMemoryTest
392
358
  options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
393
359
  }
394
360
 
395
- bool reserve_table_reader_memory_;
396
- std::shared_ptr<BlockBasedTableReaderResOnlyCache>
397
- table_reader_res_only_cache_;
361
+ CacheEntryRoleOptions::Decision charge_table_reader_;
362
+ std::shared_ptr<
363
+ TargetCacheChargeTrackingCache<CacheEntryRole::kBlockBasedTableReader>>
364
+ table_reader_charge_tracking_cache_;
398
365
  std::size_t approx_table_reader_mem_;
399
366
  std::map<std::string, std::string> kv_;
400
367
  CompressionType compression_type_;
@@ -420,16 +387,16 @@ class BlockBasedTableReaderCapMemoryTest
420
387
  }
421
388
  };
422
389
 
423
- INSTANTIATE_TEST_CASE_P(CapMemoryUsageUnderCacheCapacity,
424
- BlockBasedTableReaderCapMemoryTest,
425
- ::testing::Values(true, false));
390
+ INSTANTIATE_TEST_CASE_P(
391
+ ChargeTableReaderTest, ChargeTableReaderTest,
392
+ ::testing::Values(CacheEntryRoleOptions::Decision::kEnabled,
393
+ CacheEntryRoleOptions::Decision::kDisabled));
426
394
 
427
- TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
395
+ TEST_P(ChargeTableReaderTest, Basic) {
428
396
  const std::size_t max_table_reader_num_capped =
429
- BlockBasedTableReaderCapMemoryTest::
430
- CalculateMaxTableReaderNumBeforeCacheFull(
431
- table_reader_res_only_cache_->GetCapacity(),
432
- approx_table_reader_mem_);
397
+ ChargeTableReaderTest::CalculateMaxTableReaderNumBeforeCacheFull(
398
+ table_reader_charge_tracking_cache_->GetCapacity(),
399
+ approx_table_reader_mem_);
433
400
 
434
401
  // Acceptable estimtation errors coming from
435
402
  // 1. overstimate max_table_reader_num_capped due to # dummy entries is high
@@ -448,16 +415,16 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
448
415
  << "We need `max_table_reader_num_uncapped` > "
449
416
  "`max_table_reader_num_capped_upper_bound` to differentiate cases "
450
417
  "between "
451
- "reserve_table_reader_memory_ == false and == true)";
418
+ "charge_table_reader_ == kDisabled and == kEnabled)";
452
419
 
453
420
  Status s = Status::OK();
454
421
  std::size_t opened_table_reader_num = 0;
455
422
  std::string table_name;
456
423
  std::vector<std::unique_ptr<BlockBasedTable>> tables;
457
424
  // Keep creating BlockBasedTableReader till hiting the memory limit based on
458
- // cache capacity and creation fails (when reserve_table_reader_memory_ ==
459
- // true) or reaching a specfied big number of table readers (when
460
- // reserve_table_reader_memory_ == false)
425
+ // cache capacity and creation fails (when charge_table_reader_ ==
426
+ // kEnabled) or reaching a specfied big number of table readers (when
427
+ // charge_table_reader_ == kDisabled)
461
428
  while (s.ok() && opened_table_reader_num < max_table_reader_num_uncapped) {
462
429
  table_name = "table_" + std::to_string(opened_table_reader_num);
463
430
  CreateTable(table_name, compression_type_, kv_);
@@ -471,8 +438,12 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
471
438
  }
472
439
  }
473
440
 
474
- if (reserve_table_reader_memory_) {
441
+ if (charge_table_reader_ == CacheEntryRoleOptions::Decision::kEnabled) {
475
442
  EXPECT_TRUE(s.IsMemoryLimit()) << "s: " << s.ToString();
443
+ EXPECT_TRUE(s.ToString().find(
444
+ kCacheEntryRoleToCamelString[static_cast<std::uint32_t>(
445
+ CacheEntryRole::kBlockBasedTableReader)]) !=
446
+ std::string::npos);
476
447
  EXPECT_TRUE(s.ToString().find("memory limit based on cache capacity") !=
477
448
  std::string::npos);
478
449
 
@@ -480,10 +451,9 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
480
451
  EXPECT_LE(opened_table_reader_num, max_table_reader_num_capped_upper_bound);
481
452
 
482
453
  std::size_t updated_max_table_reader_num_capped =
483
- BlockBasedTableReaderCapMemoryTest::
484
- CalculateMaxTableReaderNumBeforeCacheFull(
485
- table_reader_res_only_cache_->GetCapacity() / 2,
486
- approx_table_reader_mem_);
454
+ ChargeTableReaderTest::CalculateMaxTableReaderNumBeforeCacheFull(
455
+ table_reader_charge_tracking_cache_->GetCapacity() / 2,
456
+ approx_table_reader_mem_);
487
457
 
488
458
  // Keep deleting BlockBasedTableReader to lower down memory usage from the
489
459
  // memory limit to make the next creation succeeds
@@ -501,13 +471,13 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
501
471
  EXPECT_TRUE(s.ok()) << s.ToString();
502
472
 
503
473
  tables.clear();
504
- EXPECT_EQ(table_reader_res_only_cache_->GetPinnedUsage(), 0);
474
+ EXPECT_EQ(table_reader_charge_tracking_cache_->GetCacheCharge(), 0);
505
475
  } else {
506
476
  EXPECT_TRUE(s.ok() &&
507
477
  opened_table_reader_num == max_table_reader_num_uncapped)
508
478
  << "s: " << s.ToString() << " opened_table_reader_num: "
509
479
  << std::to_string(opened_table_reader_num);
510
- EXPECT_EQ(table_reader_res_only_cache_->GetPinnedUsage(), 0);
480
+ EXPECT_EQ(table_reader_charge_tracking_cache_->GetCacheCharge(), 0);
511
481
  }
512
482
  }
513
483
 
@@ -8,13 +8,14 @@
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
  #include "table/block_based/block_prefetcher.h"
10
10
 
11
+ #include "rocksdb/file_system.h"
11
12
  #include "table/block_based/block_based_table_reader.h"
12
13
 
13
14
  namespace ROCKSDB_NAMESPACE {
14
- void BlockPrefetcher::PrefetchIfNeeded(const BlockBasedTable::Rep* rep,
15
- const BlockHandle& handle,
16
- size_t readahead_size,
17
- bool is_for_compaction, bool async_io) {
15
+ void BlockPrefetcher::PrefetchIfNeeded(
16
+ const BlockBasedTable::Rep* rep, const BlockHandle& handle,
17
+ const size_t readahead_size, bool is_for_compaction, const bool async_io,
18
+ const Env::IOPriority rate_limiter_priority) {
18
19
  if (is_for_compaction) {
19
20
  rep->CreateFilePrefetchBufferIfNotExists(
20
21
  compaction_readahead_size_, compaction_readahead_size_,
@@ -84,7 +85,8 @@ void BlockPrefetcher::PrefetchIfNeeded(const BlockBasedTable::Rep* rep,
84
85
  // we can fallback to reading from disk if Prefetch fails.
85
86
  Status s = rep->file->Prefetch(
86
87
  handle.offset(),
87
- BlockBasedTable::BlockSizeWithTrailer(handle) + readahead_size_);
88
+ BlockBasedTable::BlockSizeWithTrailer(handle) + readahead_size_,
89
+ rate_limiter_priority);
88
90
  if (s.IsNotSupported()) {
89
91
  rep->CreateFilePrefetchBufferIfNotExists(initial_auto_readahead_size_,
90
92
  max_auto_readahead_size,
@@ -20,7 +20,8 @@ class BlockPrefetcher {
20
20
 
21
21
  void PrefetchIfNeeded(const BlockBasedTable::Rep* rep,
22
22
  const BlockHandle& handle, size_t readahead_size,
23
- bool is_for_compaction, bool async_io);
23
+ bool is_for_compaction, bool async_io,
24
+ Env::IOPriority rate_limiter_priority);
24
25
  FilePrefetchBuffer* prefetch_buffer() { return prefetch_buffer_.get(); }
25
26
 
26
27
  void UpdateReadPattern(const uint64_t& offset, const size_t& len) {
@@ -84,7 +84,7 @@ class FilterBlockBuilder {
84
84
  Status* status, std::unique_ptr<const char[]>* filter_data = nullptr) = 0;
85
85
 
86
86
  // This is called when finishes using the FilterBitsBuilder
87
- // in order to release memory usage and cache reservation
87
+ // in order to release memory usage and cache charge
88
88
  // associated with it timely
89
89
  virtual void ResetFilterBitsBuilder() {}
90
90
 
@@ -109,7 +109,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
109
109
  static constexpr uint32_t kMetadataLen = 5;
110
110
 
111
111
  // Number of hash entries to accumulate before charging their memory usage to
112
- // the cache when cache reservation is available
112
+ // the cache when cache charging is available
113
113
  static const std::size_t kUint64tHashEntryCacheResBucketSize =
114
114
  CacheReservationManagerImpl<
115
115
  CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
@@ -257,7 +257,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
257
257
  // For reserving memory used in (new) Bloom and Ribbon Filter construction
258
258
  std::shared_ptr<CacheReservationManager> cache_res_mgr_;
259
259
 
260
- // For managing cache reservation for final filter in (new) Bloom and Ribbon
260
+ // For managing cache charge for final filter in (new) Bloom and Ribbon
261
261
  // Filter construction
262
262
  std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
263
263
  final_filter_cache_res_handles_;
@@ -270,7 +270,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
270
270
  std::deque<uint64_t> entries;
271
271
 
272
272
  // If cache_res_mgr_ != nullptr,
273
- // it manages cache reservation for buckets of hash entries in (new) Bloom
273
+ // it manages cache charge for buckets of hash entries in (new) Bloom
274
274
  // or Ribbon Filter construction.
275
275
  // Otherwise, it is empty.
276
276
  std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
@@ -338,7 +338,7 @@ class FastLocalBloomBitsBuilder : public XXPH3FilterBitsBuilder {
338
338
  final_filter_cache_res_handle;
339
339
  len_with_metadata =
340
340
  AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
341
- // Cache reservation for mutable_buf
341
+ // Cache charging for mutable_buf
342
342
  if (cache_res_mgr_) {
343
343
  Status s = cache_res_mgr_->MakeCacheReservation(
344
344
  len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
@@ -655,7 +655,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
655
655
  Standard128RibbonTypesAndSettings>::EstimateMemoryUsage(num_slots);
656
656
  Status status_banding_cache_res = Status::OK();
657
657
 
658
- // Cache reservation for banding
658
+ // Cache charging for banding
659
659
  std::unique_ptr<CacheReservationManager::CacheReservationHandle>
660
660
  banding_res_handle;
661
661
  if (cache_res_mgr_) {
@@ -665,7 +665,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
665
665
 
666
666
  if (status_banding_cache_res.IsIncomplete()) {
667
667
  ROCKS_LOG_WARN(info_log_,
668
- "Cache reservation for Ribbon filter banding failed due "
668
+ "Cache charging for Ribbon filter banding failed due "
669
669
  "to cache full");
670
670
  SwapEntriesWith(&bloom_fallback_);
671
671
  assert(hash_entries_info_.entries.empty());
@@ -717,7 +717,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
717
717
  final_filter_cache_res_handle;
718
718
  len_with_metadata =
719
719
  AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
720
- // Cache reservation for mutable_buf
720
+ // Cache charging for mutable_buf
721
721
  if (cache_res_mgr_) {
722
722
  Status s = cache_res_mgr_->MakeCacheReservation(
723
723
  len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
@@ -1483,11 +1483,19 @@ std::string BloomFilterPolicy::GetId() const {
1483
1483
  FilterBitsBuilder* BloomLikeFilterPolicy::GetFastLocalBloomBuilderWithContext(
1484
1484
  const FilterBuildingContext& context) const {
1485
1485
  bool offm = context.table_options.optimize_filters_for_memory;
1486
- bool reserve_filter_construction_mem =
1487
- (context.table_options.reserve_table_builder_memory &&
1488
- context.table_options.block_cache);
1486
+ const auto options_overrides_iter =
1487
+ context.table_options.cache_usage_options.options_overrides.find(
1488
+ CacheEntryRole::kFilterConstruction);
1489
+ const auto filter_construction_charged =
1490
+ options_overrides_iter !=
1491
+ context.table_options.cache_usage_options.options_overrides.end()
1492
+ ? options_overrides_iter->second.charged
1493
+ : context.table_options.cache_usage_options.options.charged;
1494
+
1489
1495
  std::shared_ptr<CacheReservationManager> cache_res_mgr;
1490
- if (reserve_filter_construction_mem) {
1496
+ if (context.table_options.block_cache &&
1497
+ filter_construction_charged ==
1498
+ CacheEntryRoleOptions::Decision::kEnabled) {
1491
1499
  cache_res_mgr = std::make_shared<
1492
1500
  CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
1493
1501
  context.table_options.block_cache);
@@ -1525,11 +1533,19 @@ BloomLikeFilterPolicy::GetStandard128RibbonBuilderWithContext(
1525
1533
  const FilterBuildingContext& context) const {
1526
1534
  // FIXME: code duplication with GetFastLocalBloomBuilderWithContext
1527
1535
  bool offm = context.table_options.optimize_filters_for_memory;
1528
- bool reserve_filter_construction_mem =
1529
- (context.table_options.reserve_table_builder_memory &&
1530
- context.table_options.block_cache);
1536
+ const auto options_overrides_iter =
1537
+ context.table_options.cache_usage_options.options_overrides.find(
1538
+ CacheEntryRole::kFilterConstruction);
1539
+ const auto filter_construction_charged =
1540
+ options_overrides_iter !=
1541
+ context.table_options.cache_usage_options.options_overrides.end()
1542
+ ? options_overrides_iter->second.charged
1543
+ : context.table_options.cache_usage_options.options.charged;
1544
+
1531
1545
  std::shared_ptr<CacheReservationManager> cache_res_mgr;
1532
- if (reserve_filter_construction_mem) {
1546
+ if (context.table_options.block_cache &&
1547
+ filter_construction_charged ==
1548
+ CacheEntryRoleOptions::Decision::kEnabled) {
1533
1549
  cache_res_mgr = std::make_shared<
1534
1550
  CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
1535
1551
  context.table_options.block_cache);
@@ -1542,7 +1558,7 @@ BloomLikeFilterPolicy::GetStandard128RibbonBuilderWithContext(
1542
1558
  }
1543
1559
 
1544
1560
  std::string BloomLikeFilterPolicy::GetBitsPerKeySuffix() const {
1545
- std::string rv = ":" + ROCKSDB_NAMESPACE::ToString(millibits_per_key_ / 1000);
1561
+ std::string rv = ":" + std::to_string(millibits_per_key_ / 1000);
1546
1562
  int frac = millibits_per_key_ % 1000;
1547
1563
  if (frac > 0) {
1548
1564
  rv.push_back('.');
@@ -1837,7 +1853,7 @@ const char* RibbonFilterPolicy::kNickName() { return "rocksdb.RibbonFilter"; }
1837
1853
 
1838
1854
  std::string RibbonFilterPolicy::GetId() const {
1839
1855
  return BloomLikeFilterPolicy::GetId() + ":" +
1840
- ROCKSDB_NAMESPACE::ToString(bloom_before_level_);
1856
+ std::to_string(bloom_before_level_);
1841
1857
  }
1842
1858
 
1843
1859
  const FilterPolicy* NewRibbonFilterPolicy(double bloom_equivalent_bits_per_key,
@@ -117,7 +117,8 @@ InternalIteratorBase<IndexValue>* HashIndexReader::NewIterator(
117
117
  const bool no_io = (read_options.read_tier == kBlockCacheTier);
118
118
  CachableEntry<Block> index_block;
119
119
  const Status s =
120
- GetOrReadIndexBlock(no_io, get_context, lookup_context, &index_block);
120
+ GetOrReadIndexBlock(no_io, read_options.rate_limiter_priority,
121
+ get_context, lookup_context, &index_block);
121
122
  if (!s.ok()) {
122
123
  if (iter != nullptr) {
123
124
  iter->Invalidate(s);