@nxtedition/rocksdb 10.1.5 → 10.1.6

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 (254) hide show
  1. package/binding.cc +5 -7
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
  3. package/deps/rocksdb/rocksdb/Makefile +38 -15
  4. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
  9. package/deps/rocksdb/rocksdb/db/builder.h +1 -1
  10. package/deps/rocksdb/rocksdb/db/c.cc +205 -6
  11. package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
  12. package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
  14. package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
  26. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
  27. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
  28. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
  29. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
  30. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
  38. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
  39. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
  40. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  44. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
  45. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
  46. package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
  47. package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
  48. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
  50. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
  51. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
  52. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
  53. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
  55. package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
  56. package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
  57. package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
  58. package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
  59. package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
  60. package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
  61. package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
  62. package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
  64. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
  65. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
  68. package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
  69. package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
  70. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
  71. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
  72. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
  73. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
  74. package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
  75. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
  76. package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
  77. package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
  78. package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
  79. package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
  80. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
  82. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
  83. package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
  84. package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
  85. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  86. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
  90. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
  91. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
  95. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
  96. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
  97. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
  98. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
  99. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
  100. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
  101. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
  102. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
  103. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
  104. package/deps/rocksdb/rocksdb/env/env.cc +6 -0
  105. package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
  106. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  107. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
  108. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
  109. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
  110. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
  111. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
  113. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
  115. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
  119. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
  122. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
  128. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  129. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
  130. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  131. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  132. package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
  133. package/deps/rocksdb/rocksdb/options/options.cc +3 -0
  134. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  136. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
  137. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
  138. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  139. package/deps/rocksdb/rocksdb/src.mk +4 -0
  140. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
  147. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
  149. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
  150. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
  151. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
  152. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
  153. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
  154. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
  155. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
  156. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
  157. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
  158. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
  160. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
  161. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
  163. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
  165. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
  166. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
  167. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
  168. package/deps/rocksdb/rocksdb/table/format.cc +1 -2
  169. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
  170. package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
  171. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
  172. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
  173. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
  174. package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
  175. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  176. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
  177. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
  178. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
  179. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
  180. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
  181. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
  182. package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
  183. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  184. package/deps/rocksdb/rocksdb/util/random.cc +2 -1
  185. package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
  186. package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
  187. package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
  188. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
  189. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
  191. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
  192. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
  193. package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
  194. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
  195. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
  196. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
  197. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
  198. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
  199. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
  200. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
  202. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
  203. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  204. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
  205. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
  206. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
  207. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
  208. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
  209. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
  210. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
  211. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
  212. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
  213. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
  214. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
  215. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
  216. package/package.json +1 -1
  217. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  218. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  219. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  220. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  221. package/.tap/test-results/test/batch-test.js.tap +0 -12
  222. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  223. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  224. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  225. package/.tap/test-results/test/column-test.js.tap +0 -55
  226. package/.tap/test-results/test/common.js.tap +0 -0
  227. package/.tap/test-results/test/compression-test.js.tap +0 -30
  228. package/.tap/test-results/test/db-identity.js.tap +0 -12
  229. package/.tap/test-results/test/electron.js.tap +0 -0
  230. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  231. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  232. package/.tap/test-results/test/gc.js.tap +0 -0
  233. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  234. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  235. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  236. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  237. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  238. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  239. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  240. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  241. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  242. package/.tap/test-results/test/lock-test.js.tap +0 -18
  243. package/.tap/test-results/test/lock.js.tap +0 -0
  244. package/.tap/test-results/test/make.js.tap +0 -0
  245. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  246. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  247. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  248. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  249. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  250. package/deps/rocksdb/rocksdb/README.md +0 -29
  251. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  252. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  253. package/deps/rocksdb/rocksdb/port/README +0 -10
  254. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -62,7 +62,6 @@ TBlockIter* BlockBasedTable::NewDataBlockIterator(
62
62
  CachableEntry<Block> block;
63
63
  if (rep_->uncompression_dict_reader && block_type == BlockType::kData) {
64
64
  CachableEntry<UncompressionDict> uncompression_dict;
65
- const bool no_io = (ro.read_tier == kBlockCacheTier);
66
65
  // For async scans, don't use the prefetch buffer since an async prefetch
67
66
  // might already be under way and this would invalidate it. Also, the
68
67
  // uncompression dict is typically at the end of the file and would
@@ -72,8 +71,7 @@ TBlockIter* BlockBasedTable::NewDataBlockIterator(
72
71
  // pattern.
73
72
  s = rep_->uncompression_dict_reader->GetOrReadUncompressionDictionary(
74
73
  ((ro.async_io || ro.auto_readahead_size) ? nullptr : prefetch_buffer),
75
- ro, no_io, ro.verify_checksums, get_context, lookup_context,
76
- &uncompression_dict);
74
+ ro, get_context, lookup_context, &uncompression_dict);
77
75
  if (!s.ok()) {
78
76
  iter->Invalidate(s);
79
77
  return iter;
@@ -362,7 +362,6 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
362
362
 
363
363
  // First check the full filter
364
364
  // If full filter not useful, Then go into each block
365
- const bool no_io = read_options.read_tier == kBlockCacheTier;
366
365
  uint64_t tracing_mget_id = BlockCacheTraceHelper::kReservedGetId;
367
366
  if (sst_file_range.begin()->get_context) {
368
367
  tracing_mget_id = sst_file_range.begin()->get_context->get_tracing_get_id();
@@ -372,7 +371,7 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
372
371
  BlockCacheLookupContext metadata_lookup_context{
373
372
  TableReaderCaller::kUserMultiGet, tracing_mget_id,
374
373
  /*_get_from_user_specified_snapshot=*/read_options.snapshot != nullptr};
375
- FullFilterKeysMayMatch(filter, &sst_file_range, no_io, prefix_extractor,
374
+ FullFilterKeysMayMatch(filter, &sst_file_range, prefix_extractor,
376
375
  &metadata_lookup_context, read_options);
377
376
 
378
377
  if (!sst_file_range.empty()) {
@@ -461,9 +460,9 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
461
460
  uncompression_dict_status =
462
461
  rep_->uncompression_dict_reader
463
462
  ->GetOrReadUncompressionDictionary(
464
- nullptr /* prefetch_buffer */, read_options, no_io,
465
- read_options.verify_checksums, get_context,
466
- &metadata_lookup_context, &uncompression_dict);
463
+ nullptr /* prefetch_buffer */, read_options,
464
+ get_context, &metadata_lookup_context,
465
+ &uncompression_dict);
467
466
  uncompression_dict_inited = true;
468
467
  }
469
468
 
@@ -668,7 +667,7 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
668
667
  biter->status().IsIncomplete()) {
669
668
  // couldn't get block from block_cache
670
669
  // Update Saver.state to Found because we are only looking for
671
- // whether we can guarantee the key is not there when "no_io" is set
670
+ // whether we can guarantee the key is not there with kBlockCacheTier
672
671
  get_context->MarkKeyMayExist();
673
672
  break;
674
673
  }
@@ -156,4 +156,35 @@ template <typename TUse, typename TBlocklike>
156
156
  using WithBlocklikeCheck = std::enable_if_t<
157
157
  TBlocklike::kCacheEntryRole == CacheEntryRole::kMisc || true, TUse>;
158
158
 
159
+ // Helper for the uncache_aggressiveness option
160
+ class UncacheAggressivenessAdvisor {
161
+ public:
162
+ UncacheAggressivenessAdvisor(uint32_t uncache_aggressiveness) {
163
+ assert(uncache_aggressiveness > 0);
164
+ allowance_ = std::min(uncache_aggressiveness, uint32_t{3});
165
+ threshold_ = std::pow(0.99, uncache_aggressiveness - 1);
166
+ }
167
+ void Report(bool erased) { ++(erased ? useful_ : not_useful_); }
168
+ bool ShouldContinue() {
169
+ if (not_useful_ < allowance_) {
170
+ return true;
171
+ } else {
172
+ // See UncacheAggressivenessAdvisor unit test
173
+ return (useful_ + 1.0) / (useful_ + not_useful_ - allowance_ + 1.5) >=
174
+ threshold_;
175
+ }
176
+ }
177
+
178
+ private:
179
+ // Baseline minimum number of "not useful" to consider stopping, to allow
180
+ // sufficient evidence for checking the threshold. Actual minimum will be
181
+ // higher as threshold gets well below 1.0.
182
+ int allowance_;
183
+ // After allowance, stop if useful ratio is below this threshold
184
+ double threshold_;
185
+ // Counts
186
+ int useful_ = 0;
187
+ int not_useful_ = 0;
188
+ };
189
+
159
190
  } // namespace ROCKSDB_NAMESPACE
@@ -18,6 +18,12 @@ void BlockPrefetcher::PrefetchIfNeeded(
18
18
  const bool no_sequential_checking, const ReadOptions& read_options,
19
19
  const std::function<void(bool, uint64_t&, uint64_t&)>& readaheadsize_cb,
20
20
  bool is_async_io_prefetch) {
21
+ if (read_options.read_tier == ReadTier::kBlockCacheTier) {
22
+ // Disable prefetching when IO disallowed. (Note that we haven't allocated
23
+ // any buffers yet despite the various tracked settings.)
24
+ return;
25
+ }
26
+
21
27
  ReadaheadParams readahead_params;
22
28
  readahead_params.initial_readahead_size = readahead_size;
23
29
  readahead_params.max_readahead_size = readahead_size;
@@ -78,7 +78,7 @@ class CachableEntry {
78
78
  return *this;
79
79
  }
80
80
 
81
- ReleaseResource();
81
+ ReleaseResource(/*erase_if_last_ref=*/false);
82
82
 
83
83
  value_ = rhs.value_;
84
84
  cache_ = rhs.cache_;
@@ -95,7 +95,7 @@ class CachableEntry {
95
95
  return *this;
96
96
  }
97
97
 
98
- ~CachableEntry() { ReleaseResource(); }
98
+ ~CachableEntry() { ReleaseResource(/*erase_if_last_ref=*/false); }
99
99
 
100
100
  bool IsEmpty() const {
101
101
  return value_ == nullptr && cache_ == nullptr && cache_handle_ == nullptr &&
@@ -114,7 +114,12 @@ class CachableEntry {
114
114
  bool GetOwnValue() const { return own_value_; }
115
115
 
116
116
  void Reset() {
117
- ReleaseResource();
117
+ ReleaseResource(/*erase_if_last_ref=*/false);
118
+ ResetFields();
119
+ }
120
+
121
+ void ResetEraseIfLastRef() {
122
+ ReleaseResource(/*erase_if_last_ref=*/true);
118
123
  ResetFields();
119
124
  }
120
125
 
@@ -200,10 +205,10 @@ class CachableEntry {
200
205
  }
201
206
 
202
207
  private:
203
- void ReleaseResource() noexcept {
208
+ void ReleaseResource(bool erase_if_last_ref) noexcept {
204
209
  if (LIKELY(cache_handle_ != nullptr)) {
205
210
  assert(cache_ != nullptr);
206
- cache_->Release(cache_handle_);
211
+ cache_->Release(cache_handle_, erase_if_last_ref);
207
212
  } else if (own_value_) {
208
213
  delete value_;
209
214
  }
@@ -100,39 +100,34 @@ class FilterBlockReader {
100
100
  FilterBlockReader& operator=(const FilterBlockReader&) = delete;
101
101
 
102
102
  /**
103
- * If no_io is set, then it returns true if it cannot answer the query without
104
- * reading data from disk. This is used in PartitionedFilterBlockReader to
105
- * avoid reading partitions that are not in block cache already
106
- *
107
103
  * Normally filters are built on only the user keys and the InternalKey is not
108
104
  * needed for a query. The index in PartitionedFilterBlockReader however is
109
105
  * built upon InternalKey and must be provided via const_ikey_ptr when running
110
106
  * queries.
111
107
  */
112
- virtual bool KeyMayMatch(const Slice& key, const bool no_io,
113
- const Slice* const const_ikey_ptr,
108
+ virtual bool KeyMayMatch(const Slice& key, const Slice* const const_ikey_ptr,
114
109
  GetContext* get_context,
115
110
  BlockCacheLookupContext* lookup_context,
116
111
  const ReadOptions& read_options) = 0;
117
112
 
118
- virtual void KeysMayMatch(MultiGetRange* range, const bool no_io,
113
+ virtual void KeysMayMatch(MultiGetRange* range,
119
114
  BlockCacheLookupContext* lookup_context,
120
115
  const ReadOptions& read_options) {
121
116
  for (auto iter = range->begin(); iter != range->end(); ++iter) {
122
117
  const Slice ukey_without_ts = iter->ukey_without_ts;
123
118
  const Slice ikey = iter->ikey;
124
119
  GetContext* const get_context = iter->get_context;
125
- if (!KeyMayMatch(ukey_without_ts, no_io, &ikey, get_context,
126
- lookup_context, read_options)) {
120
+ if (!KeyMayMatch(ukey_without_ts, &ikey, get_context, lookup_context,
121
+ read_options)) {
127
122
  range->SkipKey(iter);
128
123
  }
129
124
  }
130
125
  }
131
126
 
132
127
  /**
133
- * no_io and const_ikey_ptr here means the same as in KeyMayMatch
128
+ * Similar to KeyMayMatch
134
129
  */
135
- virtual bool PrefixMayMatch(const Slice& prefix, const bool no_io,
130
+ virtual bool PrefixMayMatch(const Slice& prefix,
136
131
  const Slice* const const_ikey_ptr,
137
132
  GetContext* get_context,
138
133
  BlockCacheLookupContext* lookup_context,
@@ -140,7 +135,6 @@ class FilterBlockReader {
140
135
 
141
136
  virtual void PrefixesMayMatch(MultiGetRange* range,
142
137
  const SliceTransform* prefix_extractor,
143
- const bool no_io,
144
138
  BlockCacheLookupContext* lookup_context,
145
139
  const ReadOptions& read_options) {
146
140
  for (auto iter = range->begin(); iter != range->end(); ++iter) {
@@ -148,8 +142,8 @@ class FilterBlockReader {
148
142
  const Slice ikey = iter->ikey;
149
143
  GetContext* const get_context = iter->get_context;
150
144
  if (prefix_extractor->InDomain(ukey_without_ts) &&
151
- !PrefixMayMatch(prefix_extractor->Transform(ukey_without_ts), no_io,
152
- &ikey, get_context, lookup_context, read_options)) {
145
+ !PrefixMayMatch(prefix_extractor->Transform(ukey_without_ts), &ikey,
146
+ get_context, lookup_context, read_options)) {
153
147
  range->SkipKey(iter);
154
148
  }
155
149
  }
@@ -169,13 +163,15 @@ class FilterBlockReader {
169
163
  return Status::OK();
170
164
  }
171
165
 
166
+ virtual void EraseFromCacheBeforeDestruction(
167
+ uint32_t /*uncache_aggressiveness*/) {}
168
+
172
169
  virtual bool RangeMayExist(const Slice* /*iterate_upper_bound*/,
173
170
  const Slice& user_key_without_ts,
174
171
  const SliceTransform* prefix_extractor,
175
172
  const Comparator* /*comparator*/,
176
173
  const Slice* const const_ikey_ptr,
177
174
  bool* filter_checked, bool need_upper_bound_check,
178
- bool no_io,
179
175
  BlockCacheLookupContext* lookup_context,
180
176
  const ReadOptions& read_options) = 0;
181
177
  };
@@ -67,8 +67,7 @@ bool FilterBlockReaderCommon<TBlocklike>::cache_filter_blocks() const {
67
67
 
68
68
  template <typename TBlocklike>
69
69
  Status FilterBlockReaderCommon<TBlocklike>::GetOrReadFilterBlock(
70
- bool no_io, GetContext* get_context,
71
- BlockCacheLookupContext* lookup_context,
70
+ GetContext* get_context, BlockCacheLookupContext* lookup_context,
72
71
  CachableEntry<TBlocklike>* filter_block,
73
72
  const ReadOptions& read_options) const {
74
73
  assert(filter_block);
@@ -78,12 +77,7 @@ Status FilterBlockReaderCommon<TBlocklike>::GetOrReadFilterBlock(
78
77
  return Status::OK();
79
78
  }
80
79
 
81
- ReadOptions ro = read_options;
82
- if (no_io) {
83
- ro.read_tier = kBlockCacheTier;
84
- }
85
-
86
- return ReadFilterBlock(table_, nullptr /* prefetch_buffer */, ro,
80
+ return ReadFilterBlock(table_, nullptr /* prefetch_buffer */, read_options,
87
81
  cache_filter_blocks(), get_context, lookup_context,
88
82
  filter_block);
89
83
  }
@@ -102,8 +96,8 @@ bool FilterBlockReaderCommon<TBlocklike>::RangeMayExist(
102
96
  const Slice* iterate_upper_bound, const Slice& user_key_without_ts,
103
97
  const SliceTransform* prefix_extractor, const Comparator* comparator,
104
98
  const Slice* const const_ikey_ptr, bool* filter_checked,
105
- bool need_upper_bound_check, bool no_io,
106
- BlockCacheLookupContext* lookup_context, const ReadOptions& read_options) {
99
+ bool need_upper_bound_check, BlockCacheLookupContext* lookup_context,
100
+ const ReadOptions& read_options) {
107
101
  if (!prefix_extractor || !prefix_extractor->InDomain(user_key_without_ts)) {
108
102
  *filter_checked = false;
109
103
  return true;
@@ -115,7 +109,7 @@ bool FilterBlockReaderCommon<TBlocklike>::RangeMayExist(
115
109
  return true;
116
110
  } else {
117
111
  *filter_checked = true;
118
- return PrefixMayMatch(prefix, no_io, const_ikey_ptr,
112
+ return PrefixMayMatch(prefix, const_ikey_ptr,
119
113
  /* get_context */ nullptr, lookup_context,
120
114
  read_options);
121
115
  }
@@ -155,6 +149,18 @@ bool FilterBlockReaderCommon<TBlocklike>::IsFilterCompatible(
155
149
  }
156
150
  }
157
151
 
152
+ template <typename TBlocklike>
153
+ void FilterBlockReaderCommon<TBlocklike>::EraseFromCacheBeforeDestruction(
154
+ uint32_t uncache_aggressiveness) {
155
+ if (uncache_aggressiveness > 0) {
156
+ if (filter_block_.IsCached()) {
157
+ filter_block_.ResetEraseIfLastRef();
158
+ } else {
159
+ table()->EraseFromCache(table()->get_rep()->filter_handle);
160
+ }
161
+ }
162
+ }
163
+
158
164
  // Explicitly instantiate templates for both "blocklike" types we use.
159
165
  // This makes it possible to keep the template definitions in the .cc file.
160
166
  template class FilterBlockReaderCommon<Block_kFilterPartitionIndex>;
@@ -38,10 +38,13 @@ class FilterBlockReaderCommon : public FilterBlockReader {
38
38
  const SliceTransform* prefix_extractor,
39
39
  const Comparator* comparator,
40
40
  const Slice* const const_ikey_ptr, bool* filter_checked,
41
- bool need_upper_bound_check, bool no_io,
41
+ bool need_upper_bound_check,
42
42
  BlockCacheLookupContext* lookup_context,
43
43
  const ReadOptions& read_options) override;
44
44
 
45
+ void EraseFromCacheBeforeDestruction(
46
+ uint32_t /*uncache_aggressiveness*/) override;
47
+
45
48
  protected:
46
49
  static Status ReadFilterBlock(const BlockBasedTable* table,
47
50
  FilePrefetchBuffer* prefetch_buffer,
@@ -55,7 +58,7 @@ class FilterBlockReaderCommon : public FilterBlockReader {
55
58
  bool whole_key_filtering() const;
56
59
  bool cache_filter_blocks() const;
57
60
 
58
- Status GetOrReadFilterBlock(bool no_io, GetContext* get_context,
61
+ Status GetOrReadFilterBlock(GetContext* get_context,
59
62
  BlockCacheLookupContext* lookup_context,
60
63
  CachableEntry<TBlocklike>* filter_block,
61
64
  const ReadOptions& read_options) const;
@@ -20,7 +20,8 @@ namespace ROCKSDB_NAMESPACE {
20
20
  FullFilterBlockBuilder::FullFilterBlockBuilder(
21
21
  const SliceTransform* _prefix_extractor, bool whole_key_filtering,
22
22
  FilterBitsBuilder* filter_bits_builder)
23
- : prefix_extractor_(_prefix_extractor),
23
+ : need_last_prefix_(whole_key_filtering && _prefix_extractor != nullptr),
24
+ prefix_extractor_(_prefix_extractor),
24
25
  whole_key_filtering_(whole_key_filtering),
25
26
  last_whole_key_recorded_(false),
26
27
  last_prefix_recorded_(false),
@@ -38,7 +39,7 @@ void FullFilterBlockBuilder::Add(const Slice& key_without_ts) {
38
39
  const bool add_prefix =
39
40
  prefix_extractor_ && prefix_extractor_->InDomain(key_without_ts);
40
41
 
41
- if (!last_prefix_recorded_ && last_key_in_domain_) {
42
+ if (need_last_prefix_ && !last_prefix_recorded_ && last_key_in_domain_) {
42
43
  // We can reach here when a new filter partition starts in partitioned
43
44
  // filter. The last prefix in the previous partition should be added if
44
45
  // necessary regardless of key_without_ts, to support prefix SeekForPrev.
@@ -82,7 +83,15 @@ inline void FullFilterBlockBuilder::AddKey(const Slice& key) {
82
83
  void FullFilterBlockBuilder::AddPrefix(const Slice& key) {
83
84
  assert(prefix_extractor_ && prefix_extractor_->InDomain(key));
84
85
  Slice prefix = prefix_extractor_->Transform(key);
85
- if (whole_key_filtering_) {
86
+ if (need_last_prefix_) {
87
+ // WART/FIXME: Because last_prefix_str_ is needed above to make
88
+ // SeekForPrev work with partitioned + prefix filters, we are currently
89
+ // use this inefficient code in that case (in addition to prefix+whole
90
+ // key). Hopefully this can be optimized with some refactoring up the call
91
+ // chain to BlockBasedTableBuilder. Even in PartitionedFilterBlockBuilder,
92
+ // we don't currently have access to the previous key/prefix by the time we
93
+ // know we are starting a new partition.
94
+
86
95
  // if both whole_key and prefix are added to bloom then we will have whole
87
96
  // key and prefix addition being interleaved and thus cannot rely on the
88
97
  // bits builder to properly detect the duplicates by comparing with the last
@@ -123,7 +132,7 @@ FullFilterBlockReader::FullFilterBlockReader(
123
132
  CachableEntry<ParsedFullFilterBlock>&& filter_block)
124
133
  : FilterBlockReaderCommon(t, std::move(filter_block)) {}
125
134
 
126
- bool FullFilterBlockReader::KeyMayMatch(const Slice& key, const bool no_io,
135
+ bool FullFilterBlockReader::KeyMayMatch(const Slice& key,
127
136
  const Slice* const /*const_ikey_ptr*/,
128
137
  GetContext* get_context,
129
138
  BlockCacheLookupContext* lookup_context,
@@ -131,7 +140,7 @@ bool FullFilterBlockReader::KeyMayMatch(const Slice& key, const bool no_io,
131
140
  if (!whole_key_filtering()) {
132
141
  return true;
133
142
  }
134
- return MayMatch(key, no_io, get_context, lookup_context, read_options);
143
+ return MayMatch(key, get_context, lookup_context, read_options);
135
144
  }
136
145
 
137
146
  std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
@@ -162,19 +171,19 @@ std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
162
171
  }
163
172
 
164
173
  bool FullFilterBlockReader::PrefixMayMatch(
165
- const Slice& prefix, const bool no_io,
166
- const Slice* const /*const_ikey_ptr*/, GetContext* get_context,
167
- BlockCacheLookupContext* lookup_context, const ReadOptions& read_options) {
168
- return MayMatch(prefix, no_io, get_context, lookup_context, read_options);
174
+ const Slice& prefix, const Slice* const /*const_ikey_ptr*/,
175
+ GetContext* get_context, BlockCacheLookupContext* lookup_context,
176
+ const ReadOptions& read_options) {
177
+ return MayMatch(prefix, get_context, lookup_context, read_options);
169
178
  }
170
179
 
171
- bool FullFilterBlockReader::MayMatch(const Slice& entry, bool no_io,
180
+ bool FullFilterBlockReader::MayMatch(const Slice& entry,
172
181
  GetContext* get_context,
173
182
  BlockCacheLookupContext* lookup_context,
174
183
  const ReadOptions& read_options) const {
175
184
  CachableEntry<ParsedFullFilterBlock> filter_block;
176
185
 
177
- const Status s = GetOrReadFilterBlock(no_io, get_context, lookup_context,
186
+ const Status s = GetOrReadFilterBlock(get_context, lookup_context,
178
187
  &filter_block, read_options);
179
188
  if (!s.ok()) {
180
189
  IGNORE_STATUS_IF_ERROR(s);
@@ -199,32 +208,30 @@ bool FullFilterBlockReader::MayMatch(const Slice& entry, bool no_io,
199
208
  }
200
209
 
201
210
  void FullFilterBlockReader::KeysMayMatch(
202
- MultiGetRange* range, const bool no_io,
203
- BlockCacheLookupContext* lookup_context, const ReadOptions& read_options) {
211
+ MultiGetRange* range, BlockCacheLookupContext* lookup_context,
212
+ const ReadOptions& read_options) {
204
213
  if (!whole_key_filtering()) {
205
214
  // Simply return. Don't skip any key - consider all keys as likely to be
206
215
  // present
207
216
  return;
208
217
  }
209
- MayMatch(range, no_io, nullptr, lookup_context, read_options);
218
+ MayMatch(range, nullptr, lookup_context, read_options);
210
219
  }
211
220
 
212
221
  void FullFilterBlockReader::PrefixesMayMatch(
213
222
  MultiGetRange* range, const SliceTransform* prefix_extractor,
214
- const bool no_io, BlockCacheLookupContext* lookup_context,
215
- const ReadOptions& read_options) {
216
- MayMatch(range, no_io, prefix_extractor, lookup_context, read_options);
223
+ BlockCacheLookupContext* lookup_context, const ReadOptions& read_options) {
224
+ MayMatch(range, prefix_extractor, lookup_context, read_options);
217
225
  }
218
226
 
219
- void FullFilterBlockReader::MayMatch(MultiGetRange* range, bool no_io,
227
+ void FullFilterBlockReader::MayMatch(MultiGetRange* range,
220
228
  const SliceTransform* prefix_extractor,
221
229
  BlockCacheLookupContext* lookup_context,
222
230
  const ReadOptions& read_options) const {
223
231
  CachableEntry<ParsedFullFilterBlock> filter_block;
224
232
 
225
- const Status s =
226
- GetOrReadFilterBlock(no_io, range->begin()->get_context, lookup_context,
227
- &filter_block, read_options);
233
+ const Status s = GetOrReadFilterBlock(
234
+ range->begin()->get_context, lookup_context, &filter_block, read_options);
228
235
  if (!s.ok()) {
229
236
  IGNORE_STATUS_IF_ERROR(s);
230
237
  return;
@@ -69,6 +69,7 @@ class FullFilterBlockBuilder : public FilterBlockBuilder {
69
69
  void AddPrefix(const Slice& key);
70
70
  const SliceTransform* prefix_extractor() { return prefix_extractor_; }
71
71
  const std::string& last_prefix_str() const { return last_prefix_str_; }
72
+ bool need_last_prefix_;
72
73
 
73
74
  private:
74
75
  // important: all of these might point to invalid addresses
@@ -102,41 +103,38 @@ class FullFilterBlockReader
102
103
  FilePrefetchBuffer* prefetch_buffer, bool use_cache, bool prefetch,
103
104
  bool pin, BlockCacheLookupContext* lookup_context);
104
105
 
105
- bool KeyMayMatch(const Slice& key, const bool no_io,
106
- const Slice* const const_ikey_ptr, GetContext* get_context,
106
+ bool KeyMayMatch(const Slice& key, const Slice* const const_ikey_ptr,
107
+ GetContext* get_context,
107
108
  BlockCacheLookupContext* lookup_context,
108
109
  const ReadOptions& read_options) override;
109
110
 
110
- bool PrefixMayMatch(const Slice& prefix, const bool no_io,
111
- const Slice* const const_ikey_ptr,
111
+ bool PrefixMayMatch(const Slice& prefix, const Slice* const const_ikey_ptr,
112
112
  GetContext* get_context,
113
113
  BlockCacheLookupContext* lookup_context,
114
114
  const ReadOptions& read_options) override;
115
115
 
116
- void KeysMayMatch(MultiGetRange* range, const bool no_io,
116
+ void KeysMayMatch(MultiGetRange* range,
117
117
  BlockCacheLookupContext* lookup_context,
118
118
  const ReadOptions& read_options) override;
119
119
  // Used in partitioned filter code
120
120
  void KeysMayMatch2(MultiGetRange* range,
121
121
  const SliceTransform* /*prefix_extractor*/,
122
- const bool no_io, BlockCacheLookupContext* lookup_context,
122
+ BlockCacheLookupContext* lookup_context,
123
123
  const ReadOptions& read_options) {
124
- KeysMayMatch(range, no_io, lookup_context, read_options);
124
+ KeysMayMatch(range, lookup_context, read_options);
125
125
  }
126
126
 
127
127
  void PrefixesMayMatch(MultiGetRange* range,
128
128
  const SliceTransform* prefix_extractor,
129
- const bool no_io,
130
129
  BlockCacheLookupContext* lookup_context,
131
130
  const ReadOptions& read_options) override;
132
131
  size_t ApproximateMemoryUsage() const override;
133
132
 
134
133
  private:
135
- bool MayMatch(const Slice& entry, bool no_io, GetContext* get_context,
134
+ bool MayMatch(const Slice& entry, GetContext* get_context,
136
135
  BlockCacheLookupContext* lookup_context,
137
136
  const ReadOptions& read_options) const;
138
- void MayMatch(MultiGetRange* range, bool no_io,
139
- const SliceTransform* prefix_extractor,
137
+ void MayMatch(MultiGetRange* range, const SliceTransform* prefix_extractor,
140
138
  BlockCacheLookupContext* lookup_context,
141
139
  const ReadOptions& read_options) const;
142
140
  };
@@ -115,7 +115,7 @@ TEST_F(PluginFullFilterBlockTest, PluginEmptyBuilder) {
115
115
  FullFilterBlockReader reader(table_.get(), std::move(block));
116
116
  // Remain same symantic with blockbased filter
117
117
  ASSERT_TRUE(reader.KeyMayMatch("foo",
118
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
118
+ /*const_ikey_ptr=*/nullptr,
119
119
  /*get_context=*/nullptr,
120
120
  /*lookup_context=*/nullptr, ReadOptions()));
121
121
  }
@@ -136,31 +136,31 @@ TEST_F(PluginFullFilterBlockTest, PluginSingleChunk) {
136
136
 
137
137
  FullFilterBlockReader reader(table_.get(), std::move(block));
138
138
  ASSERT_TRUE(reader.KeyMayMatch("foo",
139
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
139
+ /*const_ikey_ptr=*/nullptr,
140
140
  /*get_context=*/nullptr,
141
141
  /*lookup_context=*/nullptr, ReadOptions()));
142
142
  ASSERT_TRUE(reader.KeyMayMatch("bar",
143
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
143
+ /*const_ikey_ptr=*/nullptr,
144
144
  /*get_context=*/nullptr,
145
145
  /*lookup_context=*/nullptr, ReadOptions()));
146
146
  ASSERT_TRUE(reader.KeyMayMatch("box",
147
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
147
+ /*const_ikey_ptr=*/nullptr,
148
148
  /*get_context=*/nullptr,
149
149
  /*lookup_context=*/nullptr, ReadOptions()));
150
150
  ASSERT_TRUE(reader.KeyMayMatch("hello",
151
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
151
+ /*const_ikey_ptr=*/nullptr,
152
152
  /*get_context=*/nullptr,
153
153
  /*lookup_context=*/nullptr, ReadOptions()));
154
154
  ASSERT_TRUE(reader.KeyMayMatch("foo",
155
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
155
+ /*const_ikey_ptr=*/nullptr,
156
156
  /*get_context=*/nullptr,
157
157
  /*lookup_context=*/nullptr, ReadOptions()));
158
158
  ASSERT_TRUE(!reader.KeyMayMatch("missing",
159
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
159
+ /*const_ikey_ptr=*/nullptr,
160
160
  /*get_context=*/nullptr,
161
161
  /*lookup_context=*/nullptr, ReadOptions()));
162
162
  ASSERT_TRUE(!reader.KeyMayMatch("other",
163
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
163
+ /*const_ikey_ptr=*/nullptr,
164
164
  /*get_context=*/nullptr,
165
165
  /*lookup_context=*/nullptr, ReadOptions()));
166
166
  }
@@ -185,7 +185,7 @@ TEST_F(FullFilterBlockTest, EmptyBuilder) {
185
185
  FullFilterBlockReader reader(table_.get(), std::move(block));
186
186
  // Remain same symantic with blockbased filter
187
187
  ASSERT_TRUE(reader.KeyMayMatch("foo",
188
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
188
+ /*const_ikey_ptr=*/nullptr,
189
189
  /*get_context=*/nullptr,
190
190
  /*lookup_context=*/nullptr, ReadOptions()));
191
191
  }
@@ -285,31 +285,31 @@ TEST_F(FullFilterBlockTest, SingleChunk) {
285
285
 
286
286
  FullFilterBlockReader reader(table_.get(), std::move(block));
287
287
  ASSERT_TRUE(reader.KeyMayMatch("foo",
288
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
288
+ /*const_ikey_ptr=*/nullptr,
289
289
  /*get_context=*/nullptr,
290
290
  /*lookup_context=*/nullptr, ReadOptions()));
291
291
  ASSERT_TRUE(reader.KeyMayMatch("bar",
292
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
292
+ /*const_ikey_ptr=*/nullptr,
293
293
  /*get_context=*/nullptr,
294
294
  /*lookup_context=*/nullptr, ReadOptions()));
295
295
  ASSERT_TRUE(reader.KeyMayMatch("box",
296
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
296
+ /*const_ikey_ptr=*/nullptr,
297
297
  /*get_context=*/nullptr,
298
298
  /*lookup_context=*/nullptr, ReadOptions()));
299
299
  ASSERT_TRUE(reader.KeyMayMatch("hello",
300
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
300
+ /*const_ikey_ptr=*/nullptr,
301
301
  /*get_context=*/nullptr,
302
302
  /*lookup_context=*/nullptr, ReadOptions()));
303
303
  ASSERT_TRUE(reader.KeyMayMatch("foo",
304
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
304
+ /*const_ikey_ptr=*/nullptr,
305
305
  /*get_context=*/nullptr,
306
306
  /*lookup_context=*/nullptr, ReadOptions()));
307
307
  ASSERT_TRUE(!reader.KeyMayMatch("missing",
308
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
308
+ /*const_ikey_ptr=*/nullptr,
309
309
  /*get_context=*/nullptr,
310
310
  /*lookup_context=*/nullptr, ReadOptions()));
311
311
  ASSERT_TRUE(!reader.KeyMayMatch("other",
312
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
312
+ /*const_ikey_ptr=*/nullptr,
313
313
  /*get_context=*/nullptr,
314
314
  /*lookup_context=*/nullptr, ReadOptions()));
315
315
  }
@@ -114,9 +114,8 @@ InternalIteratorBase<IndexValue>* HashIndexReader::NewIterator(
114
114
  IndexBlockIter* iter, GetContext* get_context,
115
115
  BlockCacheLookupContext* lookup_context) {
116
116
  const BlockBasedTable::Rep* rep = table()->get_rep();
117
- const bool no_io = (read_options.read_tier == kBlockCacheTier);
118
117
  CachableEntry<Block> index_block;
119
- const Status s = GetOrReadIndexBlock(no_io, get_context, lookup_context,
118
+ const Status s = GetOrReadIndexBlock(get_context, lookup_context,
120
119
  &index_block, read_options);
121
120
  if (!s.ok()) {
122
121
  if (iter != nullptr) {
@@ -35,9 +35,8 @@ Status BlockBasedTable::IndexReaderCommon::ReadIndexBlock(
35
35
  }
36
36
 
37
37
  Status BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock(
38
- bool no_io, GetContext* get_context,
39
- BlockCacheLookupContext* lookup_context, CachableEntry<Block>* index_block,
40
- const ReadOptions& ro) const {
38
+ GetContext* get_context, BlockCacheLookupContext* lookup_context,
39
+ CachableEntry<Block>* index_block, const ReadOptions& ro) const {
41
40
  assert(index_block != nullptr);
42
41
 
43
42
  if (!index_block_.IsEmpty()) {
@@ -45,13 +44,19 @@ Status BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock(
45
44
  return Status::OK();
46
45
  }
47
46
 
48
- ReadOptions read_options = ro;
49
- if (no_io) {
50
- read_options.read_tier = kBlockCacheTier;
51
- }
52
-
53
- return ReadIndexBlock(table_, /*prefetch_buffer=*/nullptr, read_options,
47
+ return ReadIndexBlock(table_, /*prefetch_buffer=*/nullptr, ro,
54
48
  cache_index_blocks(), get_context, lookup_context,
55
49
  index_block);
56
50
  }
51
+
52
+ void BlockBasedTable::IndexReaderCommon::EraseFromCacheBeforeDestruction(
53
+ uint32_t uncache_aggressiveness) {
54
+ if (uncache_aggressiveness > 0) {
55
+ if (index_block_.IsCached()) {
56
+ index_block_.ResetEraseIfLastRef();
57
+ } else {
58
+ table()->EraseFromCache(table()->get_rep()->index_handle);
59
+ }
60
+ }
61
+ }
57
62
  } // namespace ROCKSDB_NAMESPACE