@nxtedition/rocksdb 8.2.0 → 8.2.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 (321) hide show
  1. package/binding.cc +3 -3
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -52
  3. package/deps/rocksdb/rocksdb/Makefile +10 -5
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -345
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +92 -0
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +32 -32
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +12 -9
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +6 -43
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +3 -13
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +8 -5
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +21 -47
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -8
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +1 -2
  15. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +44 -7
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +13 -14
  17. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -0
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +2 -1
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +17 -8
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +40 -21
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +41 -42
  25. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +1 -1
  26. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +1 -1
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +5 -4
  28. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -2
  29. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +5 -3
  30. package/deps/rocksdb/rocksdb/db/builder.cc +7 -6
  31. package/deps/rocksdb/rocksdb/db/builder.h +2 -2
  32. package/deps/rocksdb/rocksdb/db/c.cc +76 -5
  33. package/deps/rocksdb/rocksdb/db/c_test.c +141 -0
  34. package/deps/rocksdb/rocksdb/db/column_family.cc +32 -0
  35. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +3 -2
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +5 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -5
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +12 -10
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +21 -17
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -7
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +3 -1
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +77 -50
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +4 -5
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +55 -8
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +142 -56
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +1 -2
  50. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +21 -20
  51. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  52. package/deps/rocksdb/rocksdb/db/corruption_test.cc +5 -4
  53. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +6 -3
  54. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +260 -220
  55. package/deps/rocksdb/rocksdb/db/db_clip_test.cc +142 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +333 -27
  58. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +5 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +7 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +189 -27
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +23 -10
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +134 -90
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -2
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -3
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -1
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +124 -16
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +10 -0
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +7 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +15 -0
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -5
  71. package/deps/rocksdb/rocksdb/db/db_iter.cc +7 -8
  72. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +54 -3
  73. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +42 -0
  74. package/deps/rocksdb/rocksdb/db/db_options_test.cc +116 -1
  75. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -2
  76. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +3 -2
  77. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +9 -8
  78. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +142 -63
  79. package/deps/rocksdb/rocksdb/db/db_test.cc +28 -7
  80. package/deps/rocksdb/rocksdb/db/db_test2.cc +71 -131
  81. package/deps/rocksdb/rocksdb/db/db_test_util.cc +18 -0
  82. package/deps/rocksdb/rocksdb/db/db_test_util.h +6 -0
  83. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +10 -10
  84. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +25 -0
  85. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +88 -0
  86. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +67 -0
  87. package/deps/rocksdb/rocksdb/db/db_write_test.cc +5 -0
  88. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -2
  90. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +86 -1
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +15 -2
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -2
  93. package/deps/rocksdb/rocksdb/db/flush_job.cc +21 -14
  94. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +14 -7
  95. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +31 -8
  96. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +21 -19
  97. package/deps/rocksdb/rocksdb/db/internal_stats.cc +42 -12
  98. package/deps/rocksdb/rocksdb/db/internal_stats.h +1 -0
  99. package/deps/rocksdb/rocksdb/db/kv_checksum.h +92 -6
  100. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -2
  101. package/deps/rocksdb/rocksdb/db/log_format.h +8 -4
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -51
  103. package/deps/rocksdb/rocksdb/db/log_reader.h +16 -0
  104. package/deps/rocksdb/rocksdb/db/log_test.cc +125 -4
  105. package/deps/rocksdb/rocksdb/db/log_writer.cc +32 -2
  106. package/deps/rocksdb/rocksdb/db/log_writer.h +16 -0
  107. package/deps/rocksdb/rocksdb/db/memtable.cc +17 -46
  108. package/deps/rocksdb/rocksdb/db/memtable.h +1 -1
  109. package/deps/rocksdb/rocksdb/db/memtable_list.cc +8 -4
  110. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -1
  111. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +5 -4
  113. package/deps/rocksdb/rocksdb/db/repair.cc +38 -11
  114. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -3
  115. package/deps/rocksdb/rocksdb/db/table_cache.cc +68 -51
  116. package/deps/rocksdb/rocksdb/db/table_cache.h +20 -10
  117. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
  118. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +6 -3
  119. package/deps/rocksdb/rocksdb/db/version_builder.cc +9 -5
  120. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  121. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +140 -120
  122. package/deps/rocksdb/rocksdb/db/version_edit.cc +14 -0
  123. package/deps/rocksdb/rocksdb/db/version_edit.h +12 -4
  124. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +21 -13
  125. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +26 -16
  126. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +9 -9
  127. package/deps/rocksdb/rocksdb/db/version_set.cc +292 -96
  128. package/deps/rocksdb/rocksdb/db/version_set.h +53 -28
  129. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -0
  130. package/deps/rocksdb/rocksdb/db/version_set_test.cc +62 -22
  131. package/deps/rocksdb/rocksdb/db/version_util.h +5 -4
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +3 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +119 -27
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +123 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +7 -2
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +34 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -0
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +43 -33
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +29 -17
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -1
  144. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +85 -50
  145. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +96 -54
  146. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +122 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +206 -0
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +9 -1
  149. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +9 -3
  150. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +322 -92
  151. package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -8
  152. package/deps/rocksdb/rocksdb/env/env_test.cc +31 -0
  153. package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
  154. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +14 -0
  155. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -1
  156. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +5 -1
  157. package/deps/rocksdb/rocksdb/file/file_util.cc +3 -3
  158. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  159. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +89 -0
  160. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +22 -7
  161. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -2
  162. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +1 -1
  163. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +1 -1
  164. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +1 -1
  165. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +3 -0
  166. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +154 -74
  167. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +27 -7
  168. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +107 -28
  169. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -0
  170. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +8 -0
  171. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +7 -1
  173. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +137 -152
  174. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +61 -26
  175. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +30 -26
  176. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +33 -16
  177. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +87 -8
  178. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +1 -0
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -1
  184. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +9 -2
  186. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -0
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +78 -42
  188. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +14 -9
  189. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +4 -9
  192. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +19 -11
  193. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  194. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +211 -555
  195. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -1
  196. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +36 -2
  197. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +17 -7
  198. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +10 -7
  199. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +19 -18
  200. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +10 -2
  201. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  202. package/deps/rocksdb/rocksdb/options/cf_options.cc +35 -2
  203. package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
  204. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1 -1
  205. package/deps/rocksdb/rocksdb/options/options.cc +12 -53
  206. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -0
  207. package/deps/rocksdb/rocksdb/options/options_parser.cc +11 -0
  208. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +32 -4
  209. package/deps/rocksdb/rocksdb/options/options_test.cc +89 -5
  210. package/deps/rocksdb/rocksdb/port/lang.h +27 -0
  211. package/deps/rocksdb/rocksdb/port/stack_trace.cc +67 -24
  212. package/deps/rocksdb/rocksdb/src.mk +2 -0
  213. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -3
  214. package/deps/rocksdb/rocksdb/table/block_based/block.cc +195 -35
  215. package/deps/rocksdb/rocksdb/table/block_based/block.h +197 -24
  216. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +71 -51
  217. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -1
  218. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +4 -6
  219. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +3 -0
  220. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +43 -2
  221. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +36 -6
  222. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +266 -166
  223. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +44 -14
  224. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -1
  225. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +63 -56
  226. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +8 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +4 -2
  228. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +10 -0
  229. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +14 -2
  230. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +918 -2
  231. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -2
  232. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -9
  233. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -8
  234. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +2 -2
  235. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -1
  236. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +18 -23
  237. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +8 -8
  238. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -32
  239. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +7 -8
  240. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +4 -5
  241. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +3 -3
  242. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +46 -53
  243. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +12 -12
  244. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -9
  245. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +26 -23
  246. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -1
  247. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +3 -0
  248. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -2
  249. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +3 -2
  250. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +7 -1
  251. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  252. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  253. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +3 -2
  254. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +5 -2
  255. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +4 -2
  256. package/deps/rocksdb/rocksdb/table/format.cc +4 -4
  257. package/deps/rocksdb/rocksdb/table/format.h +1 -1
  258. package/deps/rocksdb/rocksdb/table/get_context.cc +1 -1
  259. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +33 -22
  260. package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
  261. package/deps/rocksdb/rocksdb/table/mock_table.cc +4 -2
  262. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +1 -1
  264. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +18 -10
  265. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -3
  266. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +10 -7
  267. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +4 -2
  268. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +11 -0
  269. package/deps/rocksdb/rocksdb/table/table_builder.h +14 -5
  270. package/deps/rocksdb/rocksdb/table/table_properties.cc +2 -0
  271. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -3
  272. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +1 -1
  273. package/deps/rocksdb/rocksdb/table/table_test.cc +291 -34
  274. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +3 -1
  275. package/deps/rocksdb/rocksdb/test_util/testharness.h +5 -0
  276. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -2
  277. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +33 -17
  278. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -1
  279. package/deps/rocksdb/rocksdb/util/bloom_impl.h +2 -2
  280. package/deps/rocksdb/rocksdb/util/compression.h +1 -1
  281. package/deps/rocksdb/rocksdb/util/crc32c.cc +24 -83
  282. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +7 -9
  283. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +4 -1
  284. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  285. package/deps/rocksdb/rocksdb/util/gflags_compat.h +9 -10
  286. package/deps/rocksdb/rocksdb/util/math.h +12 -7
  287. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +16 -18
  288. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +46 -2
  289. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +6 -6
  290. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +12 -7
  291. package/deps/rocksdb/rocksdb/util/stop_watch.h +31 -13
  292. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -0
  293. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  294. package/deps/rocksdb/rocksdb/util/udt_util.h +77 -0
  295. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +2 -2
  296. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -1
  297. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -1
  298. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +1 -1
  299. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
  300. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -1
  301. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +11 -1
  302. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +34 -1
  303. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +15 -0
  304. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +1 -1
  305. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +5 -1
  306. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +29 -1
  307. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +0 -1
  308. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +0 -1
  309. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +6 -1
  310. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +10 -0
  311. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +6 -1
  312. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +5 -0
  313. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +5 -0
  314. package/package.json +1 -1
  315. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  316. package/prebuilds/linux-x64/node.napi.node +0 -0
  317. /package/deps/rocksdb/rocksdb/memory/{memory_allocator.h → memory_allocator_impl.h} +0 -0
  318. /package/deps/rocksdb/rocksdb/monitoring/{statistics.h → statistics_impl.h} +0 -0
  319. /package/deps/rocksdb/rocksdb/table/block_based/{flush_block_policy.h → flush_block_policy_impl.h} +0 -0
  320. /package/deps/rocksdb/rocksdb/util/{rate_limiter.h → rate_limiter_impl.h} +0 -0
  321. /package/deps/rocksdb/rocksdb/utilities/agg_merge/{agg_merge.h → agg_merge_impl.h} +0 -0
@@ -560,7 +560,8 @@ Status BlockBasedTable::Open(
560
560
  const EnvOptions& env_options, const BlockBasedTableOptions& table_options,
561
561
  const InternalKeyComparator& internal_comparator,
562
562
  std::unique_ptr<RandomAccessFileReader>&& file, uint64_t file_size,
563
- std::unique_ptr<TableReader>* table_reader,
563
+ uint8_t block_protection_bytes_per_key,
564
+ std::unique_ptr<TableReader>* table_reader, uint64_t tail_size,
564
565
  std::shared_ptr<CacheReservationManager> table_reader_cache_res_mgr,
565
566
  const std::shared_ptr<const SliceTransform>& prefix_extractor,
566
567
  const bool prefetch_index_and_filter_in_cache, const bool skip_filters,
@@ -583,6 +584,7 @@ Status BlockBasedTable::Open(
583
584
  ro.io_timeout = read_options.io_timeout;
584
585
  ro.rate_limiter_priority = read_options.rate_limiter_priority;
585
586
  ro.verify_checksums = read_options.verify_checksums;
587
+ ro.io_activity = read_options.io_activity;
586
588
 
587
589
  // prefetch both index and filters, down to all partitions
588
590
  const bool prefetch_all = prefetch_index_and_filter_in_cache || level == 0;
@@ -591,7 +593,8 @@ Status BlockBasedTable::Open(
591
593
  if (!ioptions.allow_mmap_reads) {
592
594
  s = PrefetchTail(ro, file.get(), file_size, force_direct_prefetch,
593
595
  tail_prefetch_stats, prefetch_all, preload_all,
594
- &prefetch_buffer, ioptions.stats);
596
+ &prefetch_buffer, ioptions.stats, tail_size,
597
+ ioptions.logger);
595
598
  // Return error in prefetch path to users.
596
599
  if (!s.ok()) {
597
600
  return s;
@@ -644,6 +647,7 @@ Status BlockBasedTable::Open(
644
647
  // meta-block reads.
645
648
  rep->compression_dict_handle = BlockHandle::NullBlockHandle();
646
649
 
650
+ rep->create_context.protection_bytes_per_key = block_protection_bytes_per_key;
647
651
  // Read metaindex
648
652
  std::unique_ptr<BlockBasedTable> new_table(
649
653
  new BlockBasedTable(rep, block_cache_tracer));
@@ -670,9 +674,11 @@ Status BlockBasedTable::Open(
670
674
  CompressionTypeToString(kZSTD) ||
671
675
  rep->table_properties->compression_name ==
672
676
  CompressionTypeToString(kZSTDNotFinalCompression));
673
- rep->create_context =
674
- BlockCreateContext(&rep->table_options, rep->ioptions.stats,
675
- blocks_definitely_zstd_compressed);
677
+ rep->create_context = BlockCreateContext(
678
+ &rep->table_options, rep->ioptions.stats,
679
+ blocks_definitely_zstd_compressed, block_protection_bytes_per_key,
680
+ rep->internal_comparator.user_comparator(), rep->index_value_is_full,
681
+ rep->index_has_first_key);
676
682
 
677
683
  // Check expected unique id if provided
678
684
  if (expected_unique_id != kNullUniqueId64x2) {
@@ -802,21 +808,37 @@ Status BlockBasedTable::PrefetchTail(
802
808
  const ReadOptions& ro, RandomAccessFileReader* file, uint64_t file_size,
803
809
  bool force_direct_prefetch, TailPrefetchStats* tail_prefetch_stats,
804
810
  const bool prefetch_all, const bool preload_all,
805
- std::unique_ptr<FilePrefetchBuffer>* prefetch_buffer, Statistics* stats) {
811
+ std::unique_ptr<FilePrefetchBuffer>* prefetch_buffer, Statistics* stats,
812
+ uint64_t tail_size, Logger* const logger) {
813
+ assert(tail_size <= file_size);
814
+
806
815
  size_t tail_prefetch_size = 0;
807
- if (tail_prefetch_stats != nullptr) {
808
- // Multiple threads may get a 0 (no history) when running in parallel,
809
- // but it will get cleared after the first of them finishes.
810
- tail_prefetch_size = tail_prefetch_stats->GetSuggestedPrefetchSize();
811
- }
812
- if (tail_prefetch_size == 0) {
813
- // Before read footer, readahead backwards to prefetch data. Do more
814
- // readahead if we're going to read index/filter.
815
- // TODO: This may incorrectly select small readahead in case partitioned
816
- // index/filter is enabled and top-level partition pinning is enabled.
817
- // That's because we need to issue readahead before we read the properties,
818
- // at which point we don't yet know the index type.
819
- tail_prefetch_size = prefetch_all || preload_all ? 512 * 1024 : 4 * 1024;
816
+ if (tail_size != 0) {
817
+ tail_prefetch_size = tail_size;
818
+ } else {
819
+ if (tail_prefetch_stats != nullptr) {
820
+ // Multiple threads may get a 0 (no history) when running in parallel,
821
+ // but it will get cleared after the first of them finishes.
822
+ tail_prefetch_size = tail_prefetch_stats->GetSuggestedPrefetchSize();
823
+ }
824
+ if (tail_prefetch_size == 0) {
825
+ // Before read footer, readahead backwards to prefetch data. Do more
826
+ // readahead if we're going to read index/filter.
827
+ // TODO: This may incorrectly select small readahead in case partitioned
828
+ // index/filter is enabled and top-level partition pinning is enabled.
829
+ // That's because we need to issue readahead before we read the
830
+ // properties, at which point we don't yet know the index type.
831
+ tail_prefetch_size = prefetch_all || preload_all ? 512 * 1024 : 4 * 1024;
832
+
833
+ ROCKS_LOG_WARN(logger,
834
+ "Tail prefetch size %zu is calculated based on heuristics",
835
+ tail_prefetch_size);
836
+ } else {
837
+ ROCKS_LOG_WARN(
838
+ logger,
839
+ "Tail prefetch size %zu is calculated based on TailPrefetchStats",
840
+ tail_prefetch_size);
841
+ }
820
842
  }
821
843
  size_t prefetch_off;
822
844
  size_t prefetch_len;
@@ -916,10 +938,18 @@ Status BlockBasedTable::ReadPropertiesBlock(
916
938
  // If table properties don't contain index type, we assume that the table
917
939
  // is in very old format and has kBinarySearch index type.
918
940
  auto& props = rep_->table_properties->user_collected_properties;
919
- auto pos = props.find(BlockBasedTablePropertyNames::kIndexType);
920
- if (pos != props.end()) {
941
+ auto index_type_pos = props.find(BlockBasedTablePropertyNames::kIndexType);
942
+ if (index_type_pos != props.end()) {
921
943
  rep_->index_type = static_cast<BlockBasedTableOptions::IndexType>(
922
- DecodeFixed32(pos->second.c_str()));
944
+ DecodeFixed32(index_type_pos->second.c_str()));
945
+ }
946
+ auto min_ts_pos = props.find("rocksdb.timestamp_min");
947
+ if (min_ts_pos != props.end()) {
948
+ rep_->min_timestamp = Slice(min_ts_pos->second);
949
+ }
950
+ auto max_ts_pos = props.find("rocksdb.timestamp_max");
951
+ if (max_ts_pos != props.end()) {
952
+ rep_->max_timestamp = Slice(max_ts_pos->second);
923
953
  }
924
954
 
925
955
  rep_->index_has_first_key =
@@ -1127,7 +1157,8 @@ Status BlockBasedTable::PrefetchIndexAndFilterBlocks(
1127
1157
  // are hence follow the configuration for pin and prefetch regardless of
1128
1158
  // the value of cache_index_and_filter_blocks
1129
1159
  if (prefetch_all || pin_partition) {
1130
- s = rep_->index_reader->CacheDependencies(ro, pin_partition);
1160
+ s = rep_->index_reader->CacheDependencies(ro, pin_partition,
1161
+ prefetch_buffer);
1131
1162
  }
1132
1163
  if (!s.ok()) {
1133
1164
  return s;
@@ -1151,7 +1182,7 @@ Status BlockBasedTable::PrefetchIndexAndFilterBlocks(
1151
1182
  if (filter) {
1152
1183
  // Refer to the comment above about paritioned indexes always being cached
1153
1184
  if (prefetch_all || pin_partition) {
1154
- s = filter->CacheDependencies(ro, pin_partition);
1185
+ s = filter->CacheDependencies(ro, pin_partition, prefetch_buffer);
1155
1186
  if (!s.ok()) {
1156
1187
  return s;
1157
1188
  }
@@ -1555,75 +1586,111 @@ BlockBasedTable::MaybeReadBlockAndLoadToCache(
1555
1586
  }
1556
1587
  }
1557
1588
 
1558
- // Fill lookup_context.
1589
+ // TODO: optimize so that lookup_context != nullptr implies the others
1559
1590
  if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled() &&
1560
1591
  lookup_context) {
1561
- size_t usage = 0;
1562
- uint64_t nkeys = 0;
1563
- if (out_parsed_block->GetValue()) {
1564
- // Approximate the number of keys in the block using restarts.
1565
- // FIXME: Should this only apply to data blocks?
1566
- nkeys = rep_->table_options.block_restart_interval *
1567
- GetBlockNumRestarts(*out_parsed_block->GetValue());
1568
- usage = out_parsed_block->GetValue()->ApproximateMemoryUsage();
1569
- }
1570
- TraceType trace_block_type = TraceType::kTraceMax;
1571
- switch (TBlocklike::kBlockType) {
1572
- case BlockType::kData:
1573
- trace_block_type = TraceType::kBlockTraceDataBlock;
1574
- break;
1575
- case BlockType::kFilter:
1576
- case BlockType::kFilterPartitionIndex:
1577
- trace_block_type = TraceType::kBlockTraceFilterBlock;
1578
- break;
1579
- case BlockType::kCompressionDictionary:
1580
- trace_block_type = TraceType::kBlockTraceUncompressionDictBlock;
1581
- break;
1582
- case BlockType::kRangeDeletion:
1583
- trace_block_type = TraceType::kBlockTraceRangeDeletionBlock;
1584
- break;
1585
- case BlockType::kIndex:
1586
- trace_block_type = TraceType::kBlockTraceIndexBlock;
1587
- break;
1588
- default:
1589
- // This cannot happen.
1590
- assert(false);
1591
- break;
1592
- }
1593
- bool no_insert = no_io || !ro.fill_cache;
1594
- if (BlockCacheTraceHelper::IsGetOrMultiGetOnDataBlock(
1595
- trace_block_type, lookup_context->caller)) {
1596
- // Defer logging the access to Get() and MultiGet() to trace additional
1597
- // information, e.g., referenced_key_exist_in_block.
1598
-
1599
- // Make a copy of the block key here since it will be logged later.
1600
- lookup_context->FillLookupContext(
1601
- is_cache_hit, no_insert, trace_block_type,
1602
- /*block_size=*/usage, /*block_key=*/key.ToString(), nkeys);
1603
- } else {
1604
- // Avoid making copy of block_key and cf_name when constructing the access
1605
- // record.
1606
- BlockCacheTraceRecord access_record(
1607
- rep_->ioptions.clock->NowMicros(),
1608
- /*block_key=*/"", trace_block_type,
1609
- /*block_size=*/usage, rep_->cf_id_for_tracing(),
1610
- /*cf_name=*/"", rep_->level_for_tracing(),
1611
- rep_->sst_number_for_tracing(), lookup_context->caller, is_cache_hit,
1612
- no_insert, lookup_context->get_id,
1613
- lookup_context->get_from_user_specified_snapshot,
1614
- /*referenced_key=*/"");
1615
- // TODO: Should handle this error?
1616
- block_cache_tracer_
1617
- ->WriteBlockAccess(access_record, key, rep_->cf_name_for_tracing(),
1618
- lookup_context->referenced_key)
1619
- .PermitUncheckedError();
1620
- }
1592
+ SaveLookupContextOrTraceRecord(
1593
+ key, is_cache_hit, ro, out_parsed_block->GetValue(), lookup_context);
1621
1594
  }
1622
1595
 
1623
1596
  assert(s.ok() || out_parsed_block->GetValue() == nullptr);
1624
1597
  return s;
1625
1598
  }
1626
1599
 
1600
+ template <typename TBlocklike>
1601
+ WithBlocklikeCheck<void, TBlocklike>
1602
+ BlockBasedTable::SaveLookupContextOrTraceRecord(
1603
+ const Slice& block_key, bool is_cache_hit, const ReadOptions& ro,
1604
+ const TBlocklike* parsed_block_value,
1605
+ BlockCacheLookupContext* lookup_context) const {
1606
+ assert(lookup_context);
1607
+ size_t usage = 0;
1608
+ uint64_t nkeys = 0;
1609
+ if (parsed_block_value) {
1610
+ // Approximate the number of keys in the block using restarts.
1611
+ int interval = rep_->table_options.block_restart_interval;
1612
+ nkeys = interval * GetBlockNumRestarts(*parsed_block_value);
1613
+ // On average, the last restart should be just over half utilized.
1614
+ // Specifically, 1..N should be N/2 + 0.5. For example, 7 -> 4, 8 -> 4.5.
1615
+ // Use the get_id to alternate between rounding up vs. down.
1616
+ if (nkeys > 0) {
1617
+ bool rounding = static_cast<int>(lookup_context->get_id) & 1;
1618
+ nkeys -= (interval - rounding) / 2;
1619
+ }
1620
+ usage = parsed_block_value->ApproximateMemoryUsage();
1621
+ }
1622
+ TraceType trace_block_type = TraceType::kTraceMax;
1623
+ switch (TBlocklike::kBlockType) {
1624
+ case BlockType::kData:
1625
+ trace_block_type = TraceType::kBlockTraceDataBlock;
1626
+ break;
1627
+ case BlockType::kFilter:
1628
+ case BlockType::kFilterPartitionIndex:
1629
+ trace_block_type = TraceType::kBlockTraceFilterBlock;
1630
+ break;
1631
+ case BlockType::kCompressionDictionary:
1632
+ trace_block_type = TraceType::kBlockTraceUncompressionDictBlock;
1633
+ break;
1634
+ case BlockType::kRangeDeletion:
1635
+ trace_block_type = TraceType::kBlockTraceRangeDeletionBlock;
1636
+ break;
1637
+ case BlockType::kIndex:
1638
+ trace_block_type = TraceType::kBlockTraceIndexBlock;
1639
+ break;
1640
+ default:
1641
+ // This cannot happen.
1642
+ assert(false);
1643
+ break;
1644
+ }
1645
+ const bool no_io = ro.read_tier == kBlockCacheTier;
1646
+ bool no_insert = no_io || !ro.fill_cache;
1647
+ if (BlockCacheTraceHelper::IsGetOrMultiGetOnDataBlock(
1648
+ trace_block_type, lookup_context->caller)) {
1649
+ // Make a copy of the block key here since it will be logged later.
1650
+ lookup_context->FillLookupContext(is_cache_hit, no_insert, trace_block_type,
1651
+ /*block_size=*/usage,
1652
+ block_key.ToString(), nkeys);
1653
+
1654
+ // Defer logging the access to Get() and MultiGet() to trace additional
1655
+ // information, e.g., referenced_key
1656
+ } else {
1657
+ // Avoid making copy of block_key if it doesn't need to be saved in
1658
+ // BlockCacheLookupContext
1659
+ lookup_context->FillLookupContext(is_cache_hit, no_insert, trace_block_type,
1660
+ /*block_size=*/usage,
1661
+ /*block_key=*/{}, nkeys);
1662
+
1663
+ // Fill in default values for irrelevant/unknown fields
1664
+ FinishTraceRecord(*lookup_context, block_key,
1665
+ lookup_context->referenced_key,
1666
+ /*does_referenced_key_exist*/ false,
1667
+ /*referenced_data_size*/ 0);
1668
+ }
1669
+ }
1670
+
1671
+ void BlockBasedTable::FinishTraceRecord(
1672
+ const BlockCacheLookupContext& lookup_context, const Slice& block_key,
1673
+ const Slice& referenced_key, bool does_referenced_key_exist,
1674
+ uint64_t referenced_data_size) const {
1675
+ // Avoid making copy of referenced_key if it doesn't need to be saved in
1676
+ // BlockCacheLookupContext
1677
+ BlockCacheTraceRecord access_record(
1678
+ rep_->ioptions.clock->NowMicros(),
1679
+ /*block_key=*/"", lookup_context.block_type, lookup_context.block_size,
1680
+ rep_->cf_id_for_tracing(),
1681
+ /*cf_name=*/"", rep_->level_for_tracing(), rep_->sst_number_for_tracing(),
1682
+ lookup_context.caller, lookup_context.is_cache_hit,
1683
+ lookup_context.no_insert, lookup_context.get_id,
1684
+ lookup_context.get_from_user_specified_snapshot,
1685
+ /*referenced_key=*/"", referenced_data_size,
1686
+ lookup_context.num_keys_in_block, does_referenced_key_exist);
1687
+ // TODO: Should handle status here?
1688
+ block_cache_tracer_
1689
+ ->WriteBlockAccess(access_record, block_key, rep_->cf_name_for_tracing(),
1690
+ referenced_key)
1691
+ .PermitUncheckedError();
1692
+ }
1693
+
1627
1694
  template <typename TBlocklike /*, auto*/>
1628
1695
  WithBlocklikeCheck<Status, TBlocklike> BlockBasedTable::RetrieveBlock(
1629
1696
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
@@ -1746,8 +1813,8 @@ BlockBasedTable::PartitionedIndexIteratorState::NewSecondaryIterator(
1746
1813
  bool BlockBasedTable::PrefixRangeMayMatch(
1747
1814
  const Slice& internal_key, const ReadOptions& read_options,
1748
1815
  const SliceTransform* options_prefix_extractor,
1749
- const bool need_upper_bound_check,
1750
- BlockCacheLookupContext* lookup_context) const {
1816
+ const bool need_upper_bound_check, BlockCacheLookupContext* lookup_context,
1817
+ bool* filter_checked) const {
1751
1818
  if (!rep_->filter_policy) {
1752
1819
  return true;
1753
1820
  }
@@ -1772,7 +1839,7 @@ bool BlockBasedTable::PrefixRangeMayMatch(
1772
1839
  bool may_match = true;
1773
1840
 
1774
1841
  FilterBlockReader* const filter = rep_->filter.get();
1775
- bool filter_checked = false;
1842
+ *filter_checked = false;
1776
1843
  if (filter != nullptr) {
1777
1844
  const bool no_io = read_options.read_tier == kBlockCacheTier;
1778
1845
 
@@ -1780,16 +1847,8 @@ bool BlockBasedTable::PrefixRangeMayMatch(
1780
1847
  may_match = filter->RangeMayExist(
1781
1848
  read_options.iterate_upper_bound, user_key_without_ts, prefix_extractor,
1782
1849
  rep_->internal_comparator.user_comparator(), const_ikey_ptr,
1783
- &filter_checked, need_upper_bound_check, no_io, lookup_context,
1784
- read_options.rate_limiter_priority);
1785
- }
1786
-
1787
- if (filter_checked) {
1788
- Statistics* statistics = rep_->ioptions.stats;
1789
- RecordTick(statistics, BLOOM_FILTER_PREFIX_CHECKED);
1790
- if (!may_match) {
1791
- RecordTick(statistics, BLOOM_FILTER_PREFIX_USEFUL);
1792
- }
1850
+ filter_checked, need_upper_bound_check, no_io, lookup_context,
1851
+ read_options);
1793
1852
  }
1794
1853
 
1795
1854
  return may_match;
@@ -1807,6 +1866,13 @@ bool BlockBasedTable::PrefixExtractorChanged(
1807
1866
  }
1808
1867
  }
1809
1868
 
1869
+ Statistics* BlockBasedTable::GetStatistics() const {
1870
+ return rep_->ioptions.stats;
1871
+ }
1872
+ bool BlockBasedTable::IsLastLevel() const {
1873
+ return rep_->level == rep_->ioptions.num_levels - 1;
1874
+ }
1875
+
1810
1876
  InternalIterator* BlockBasedTable::NewIterator(
1811
1877
  const ReadOptions& read_options, const SliceTransform* prefix_extractor,
1812
1878
  Arena* arena, bool skip_filters, TableReaderCaller caller,
@@ -1855,7 +1921,7 @@ bool BlockBasedTable::FullFilterKeyMayMatch(
1855
1921
  FilterBlockReader* filter, const Slice& internal_key, const bool no_io,
1856
1922
  const SliceTransform* prefix_extractor, GetContext* get_context,
1857
1923
  BlockCacheLookupContext* lookup_context,
1858
- Env::IOPriority rate_limiter_priority) const {
1924
+ const ReadOptions& read_options) const {
1859
1925
  if (filter == nullptr) {
1860
1926
  return true;
1861
1927
  }
@@ -1865,22 +1931,31 @@ bool BlockBasedTable::FullFilterKeyMayMatch(
1865
1931
  size_t ts_sz = rep_->internal_comparator.user_comparator()->timestamp_size();
1866
1932
  Slice user_key_without_ts = StripTimestampFromUserKey(user_key, ts_sz);
1867
1933
  if (rep_->whole_key_filtering) {
1868
- may_match =
1869
- filter->KeyMayMatch(user_key_without_ts, no_io, const_ikey_ptr,
1870
- get_context, lookup_context, rate_limiter_priority);
1934
+ may_match = filter->KeyMayMatch(user_key_without_ts, no_io, const_ikey_ptr,
1935
+ get_context, lookup_context, read_options);
1936
+ if (may_match) {
1937
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_POSITIVE);
1938
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, 1, rep_->level);
1939
+ } else {
1940
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_USEFUL);
1941
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
1942
+ }
1871
1943
  } else if (!PrefixExtractorChanged(prefix_extractor) &&
1872
- prefix_extractor->InDomain(user_key_without_ts) &&
1873
- !filter->PrefixMayMatch(
1874
- prefix_extractor->Transform(user_key_without_ts), no_io,
1875
- const_ikey_ptr, get_context, lookup_context,
1876
- rate_limiter_priority)) {
1944
+ prefix_extractor->InDomain(user_key_without_ts)) {
1877
1945
  // FIXME ^^^: there should be no reason for Get() to depend on current
1878
1946
  // prefix_extractor at all. It should always use table_prefix_extractor.
1879
- may_match = false;
1880
- }
1881
- if (may_match) {
1882
- RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_POSITIVE);
1883
- PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, 1, rep_->level);
1947
+ may_match = filter->PrefixMayMatch(
1948
+ prefix_extractor->Transform(user_key_without_ts), no_io, const_ikey_ptr,
1949
+ get_context, lookup_context, read_options);
1950
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_CHECKED);
1951
+ if (may_match) {
1952
+ // Includes prefix stats
1953
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, 1, rep_->level);
1954
+ } else {
1955
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_USEFUL);
1956
+ // Includes prefix stats
1957
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
1958
+ }
1884
1959
  }
1885
1960
  return may_match;
1886
1961
  }
@@ -1889,14 +1964,14 @@ void BlockBasedTable::FullFilterKeysMayMatch(
1889
1964
  FilterBlockReader* filter, MultiGetRange* range, const bool no_io,
1890
1965
  const SliceTransform* prefix_extractor,
1891
1966
  BlockCacheLookupContext* lookup_context,
1892
- Env::IOPriority rate_limiter_priority) const {
1967
+ const ReadOptions& read_options) const {
1893
1968
  if (filter == nullptr) {
1894
1969
  return;
1895
1970
  }
1896
1971
  uint64_t before_keys = range->KeysLeft();
1897
1972
  assert(before_keys > 0); // Caller should ensure
1898
1973
  if (rep_->whole_key_filtering) {
1899
- filter->KeysMayMatch(range, no_io, lookup_context, rate_limiter_priority);
1974
+ filter->KeysMayMatch(range, no_io, lookup_context, read_options);
1900
1975
  uint64_t after_keys = range->KeysLeft();
1901
1976
  if (after_keys) {
1902
1977
  RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_POSITIVE, after_keys);
@@ -1913,13 +1988,21 @@ void BlockBasedTable::FullFilterKeysMayMatch(
1913
1988
  // FIXME ^^^: there should be no reason for MultiGet() to depend on current
1914
1989
  // prefix_extractor at all. It should always use table_prefix_extractor.
1915
1990
  filter->PrefixesMayMatch(range, prefix_extractor, false, lookup_context,
1916
- rate_limiter_priority);
1991
+ read_options);
1917
1992
  RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_CHECKED, before_keys);
1918
1993
  uint64_t after_keys = range->KeysLeft();
1994
+ if (after_keys) {
1995
+ // Includes prefix stats
1996
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, after_keys,
1997
+ rep_->level);
1998
+ }
1919
1999
  uint64_t filtered_keys = before_keys - after_keys;
1920
2000
  if (filtered_keys) {
1921
2001
  RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_USEFUL,
1922
2002
  filtered_keys);
2003
+ // Includes prefix stats
2004
+ PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, filtered_keys,
2005
+ rep_->level);
1923
2006
  }
1924
2007
  }
1925
2008
  }
@@ -1937,8 +2020,8 @@ Status BlockBasedTable::ApproximateKeyAnchors(const ReadOptions& read_options,
1937
2020
  // `CacheDependencies()` brings all the blocks into cache using one I/O. That
1938
2021
  // way the full index scan usually finds the index data it is looking for in
1939
2022
  // cache rather than doing an I/O for each "dependency" (partition).
1940
- Status s =
1941
- rep_->index_reader->CacheDependencies(read_options, false /* pin */);
2023
+ Status s = rep_->index_reader->CacheDependencies(
2024
+ read_options, false /* pin */, nullptr /* prefetch_buffer */);
1942
2025
  if (!s.ok()) {
1943
2026
  return s;
1944
2027
  }
@@ -1985,10 +2068,28 @@ Status BlockBasedTable::ApproximateKeyAnchors(const ReadOptions& read_options,
1985
2068
  return Status::OK();
1986
2069
  }
1987
2070
 
2071
+ bool BlockBasedTable::TimestampMayMatch(const ReadOptions& read_options) const {
2072
+ if (read_options.timestamp != nullptr && !rep_->min_timestamp.empty()) {
2073
+ RecordTick(rep_->ioptions.stats, TIMESTAMP_FILTER_TABLE_CHECKED);
2074
+ auto read_ts = read_options.timestamp;
2075
+ auto comparator = rep_->internal_comparator.user_comparator();
2076
+ if (comparator->CompareTimestamp(*read_ts, rep_->min_timestamp) < 0) {
2077
+ RecordTick(rep_->ioptions.stats, TIMESTAMP_FILTER_TABLE_FILTERED);
2078
+ return false;
2079
+ }
2080
+ }
2081
+ return true;
2082
+ }
2083
+
1988
2084
  Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
1989
2085
  GetContext* get_context,
1990
2086
  const SliceTransform* prefix_extractor,
1991
2087
  bool skip_filters) {
2088
+ // Similar to Bloom filter !may_match
2089
+ // If timestamp is beyond the range of the table, skip
2090
+ if (!TimestampMayMatch(read_options)) {
2091
+ return Status::OK();
2092
+ }
1992
2093
  assert(key.size() >= 8); // key must be internal key
1993
2094
  assert(get_context != nullptr);
1994
2095
  Status s;
@@ -2010,14 +2111,11 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
2010
2111
  read_options.snapshot != nullptr;
2011
2112
  }
2012
2113
  TEST_SYNC_POINT("BlockBasedTable::Get:BeforeFilterMatch");
2013
- const bool may_match = FullFilterKeyMayMatch(
2014
- filter, key, no_io, prefix_extractor, get_context, &lookup_context,
2015
- read_options.rate_limiter_priority);
2114
+ const bool may_match =
2115
+ FullFilterKeyMayMatch(filter, key, no_io, prefix_extractor, get_context,
2116
+ &lookup_context, read_options);
2016
2117
  TEST_SYNC_POINT("BlockBasedTable::Get:AfterFilterMatch");
2017
- if (!may_match) {
2018
- RecordTick(rep_->ioptions.stats, BLOOM_FILTER_USEFUL);
2019
- PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
2020
- } else {
2118
+ if (may_match) {
2021
2119
  IndexBlockIter iiter_on_stack;
2022
2120
  // if prefix_extractor found in block differs from options, disable
2023
2121
  // BlockPrefixIndex. Only do this check when index_type is kHashSearch.
@@ -2107,6 +2205,9 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
2107
2205
  }
2108
2206
  }
2109
2207
  s = biter.status();
2208
+ if (!s.ok()) {
2209
+ break;
2210
+ }
2110
2211
  }
2111
2212
  // Write the block cache access record.
2112
2213
  if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled()) {
@@ -2118,25 +2219,9 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
2118
2219
  } else {
2119
2220
  referenced_key = key;
2120
2221
  }
2121
- BlockCacheTraceRecord access_record(
2122
- rep_->ioptions.clock->NowMicros(),
2123
- /*block_key=*/"", lookup_data_block_context.block_type,
2124
- lookup_data_block_context.block_size, rep_->cf_id_for_tracing(),
2125
- /*cf_name=*/"", rep_->level_for_tracing(),
2126
- rep_->sst_number_for_tracing(), lookup_data_block_context.caller,
2127
- lookup_data_block_context.is_cache_hit,
2128
- lookup_data_block_context.no_insert,
2129
- lookup_data_block_context.get_id,
2130
- lookup_data_block_context.get_from_user_specified_snapshot,
2131
- /*referenced_key=*/"", referenced_data_size,
2132
- lookup_data_block_context.num_keys_in_block,
2133
- does_referenced_key_exist);
2134
- // TODO: Should handle status here?
2135
- block_cache_tracer_
2136
- ->WriteBlockAccess(access_record,
2137
- lookup_data_block_context.block_key,
2138
- rep_->cf_name_for_tracing(), referenced_key)
2139
- .PermitUncheckedError();
2222
+ FinishTraceRecord(lookup_data_block_context,
2223
+ lookup_data_block_context.block_key, referenced_key,
2224
+ does_referenced_key_exist, referenced_data_size);
2140
2225
  }
2141
2226
 
2142
2227
  if (done) {
@@ -2145,10 +2230,16 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
2145
2230
  }
2146
2231
  }
2147
2232
  if (matched && filter != nullptr) {
2148
- RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_TRUE_POSITIVE);
2233
+ if (rep_->whole_key_filtering) {
2234
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_TRUE_POSITIVE);
2235
+ } else {
2236
+ RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_TRUE_POSITIVE);
2237
+ }
2238
+ // Includes prefix stats
2149
2239
  PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_true_positive, 1,
2150
2240
  rep_->level);
2151
2241
  }
2242
+
2152
2243
  if (s.ok() && !iiter->status().IsNotFound()) {
2153
2244
  s = iiter->status();
2154
2245
  }
@@ -2182,12 +2273,13 @@ Status BlockBasedTable::MultiGetFilter(const ReadOptions& read_options,
2182
2273
  TableReaderCaller::kUserMultiGet, tracing_mget_id,
2183
2274
  /*_get_from_user_specified_snapshot=*/read_options.snapshot != nullptr};
2184
2275
  FullFilterKeysMayMatch(filter, mget_range, no_io, prefix_extractor,
2185
- &lookup_context, read_options.rate_limiter_priority);
2276
+ &lookup_context, read_options);
2186
2277
 
2187
2278
  return Status::OK();
2188
2279
  }
2189
2280
 
2190
- Status BlockBasedTable::Prefetch(const Slice* const begin,
2281
+ Status BlockBasedTable::Prefetch(const ReadOptions& read_options,
2282
+ const Slice* const begin,
2191
2283
  const Slice* const end) {
2192
2284
  auto& comparator = rep_->internal_comparator;
2193
2285
  UserComparatorWrapper user_comparator(comparator.user_comparator());
@@ -2197,7 +2289,7 @@ Status BlockBasedTable::Prefetch(const Slice* const begin,
2197
2289
  }
2198
2290
  BlockCacheLookupContext lookup_context{TableReaderCaller::kPrefetch};
2199
2291
  IndexBlockIter iiter_on_stack;
2200
- auto iiter = NewIndexIterator(ReadOptions(), /*need_upper_bound_check=*/false,
2292
+ auto iiter = NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
2201
2293
  &iiter_on_stack, /*get_context=*/nullptr,
2202
2294
  &lookup_context);
2203
2295
  std::unique_ptr<InternalIteratorBase<IndexValue>> iiter_unique_ptr;
@@ -2234,7 +2326,7 @@ Status BlockBasedTable::Prefetch(const Slice* const begin,
2234
2326
  DataBlockIter biter;
2235
2327
  Status tmp_status;
2236
2328
  NewDataBlockIterator<DataBlockIter>(
2237
- ReadOptions(), block_handle, &biter, /*type=*/BlockType::kData,
2329
+ read_options, block_handle, &biter, /*type=*/BlockType::kData,
2238
2330
  /*get_context=*/nullptr, &lookup_context,
2239
2331
  /*prefetch_buffer=*/nullptr, /*for_compaction=*/false,
2240
2332
  /*async_read=*/false, tmp_status);
@@ -2254,11 +2346,10 @@ Status BlockBasedTable::VerifyChecksum(const ReadOptions& read_options,
2254
2346
  // Check Meta blocks
2255
2347
  std::unique_ptr<Block> metaindex;
2256
2348
  std::unique_ptr<InternalIterator> metaindex_iter;
2257
- ReadOptions ro;
2258
- s = ReadMetaIndexBlock(ro, nullptr /* prefetch buffer */, &metaindex,
2259
- &metaindex_iter);
2349
+ s = ReadMetaIndexBlock(read_options, nullptr /* prefetch buffer */,
2350
+ &metaindex, &metaindex_iter);
2260
2351
  if (s.ok()) {
2261
- s = VerifyChecksumInMetaBlocks(metaindex_iter.get());
2352
+ s = VerifyChecksumInMetaBlocks(read_options, metaindex_iter.get());
2262
2353
  if (!s.ok()) {
2263
2354
  return s;
2264
2355
  }
@@ -2365,7 +2456,7 @@ BlockType BlockBasedTable::GetBlockTypeForMetaBlockByName(
2365
2456
  }
2366
2457
 
2367
2458
  Status BlockBasedTable::VerifyChecksumInMetaBlocks(
2368
- InternalIteratorBase<Slice>* index_iter) {
2459
+ const ReadOptions& read_options, InternalIteratorBase<Slice>* index_iter) {
2369
2460
  Status s;
2370
2461
  for (index_iter->SeekToFirst(); index_iter->Valid(); index_iter->Next()) {
2371
2462
  s = index_iter->status();
@@ -2381,14 +2472,14 @@ Status BlockBasedTable::VerifyChecksumInMetaBlocks(
2381
2472
  // Unfortunate special handling for properties block checksum w/
2382
2473
  // global seqno
2383
2474
  std::unique_ptr<TableProperties> table_properties;
2384
- s = ReadTablePropertiesHelper(ReadOptions(), handle, rep_->file.get(),
2475
+ s = ReadTablePropertiesHelper(read_options, handle, rep_->file.get(),
2385
2476
  nullptr /* prefetch_buffer */, rep_->footer,
2386
2477
  rep_->ioptions, &table_properties,
2387
2478
  nullptr /* memory_allocator */);
2388
2479
  } else {
2389
2480
  s = BlockFetcher(
2390
2481
  rep_->file.get(), nullptr /* prefetch buffer */, rep_->footer,
2391
- ReadOptions(), handle, &contents, rep_->ioptions,
2482
+ read_options, handle, &contents, rep_->ioptions,
2392
2483
  false /* decompress */, false /*maybe_compressed*/,
2393
2484
  GetBlockTypeForMetaBlockByName(meta_block_name),
2394
2485
  UncompressionDict::GetEmptyDict(), rep_->persistent_cache_options)
@@ -2500,7 +2591,8 @@ uint64_t BlockBasedTable::GetApproximateDataSize() {
2500
2591
  return rep_->footer.metaindex_handle().offset();
2501
2592
  }
2502
2593
 
2503
- uint64_t BlockBasedTable::ApproximateOffsetOf(const Slice& key,
2594
+ uint64_t BlockBasedTable::ApproximateOffsetOf(const ReadOptions& read_options,
2595
+ const Slice& key,
2504
2596
  TableReaderCaller caller) {
2505
2597
  uint64_t data_size = GetApproximateDataSize();
2506
2598
  if (UNLIKELY(data_size == 0)) {
@@ -2514,6 +2606,7 @@ uint64_t BlockBasedTable::ApproximateOffsetOf(const Slice& key,
2514
2606
  IndexBlockIter iiter_on_stack;
2515
2607
  ReadOptions ro;
2516
2608
  ro.total_order_seek = true;
2609
+ ro.io_activity = read_options.io_activity;
2517
2610
  auto index_iter =
2518
2611
  NewIndexIterator(ro, /*disable_prefix_seek=*/true,
2519
2612
  /*input_iter=*/&iiter_on_stack, /*get_context=*/nullptr,
@@ -2542,7 +2635,8 @@ uint64_t BlockBasedTable::ApproximateOffsetOf(const Slice& key,
2542
2635
  static_cast<double>(rep_->file_size));
2543
2636
  }
2544
2637
 
2545
- uint64_t BlockBasedTable::ApproximateSize(const Slice& start, const Slice& end,
2638
+ uint64_t BlockBasedTable::ApproximateSize(const ReadOptions& read_options,
2639
+ const Slice& start, const Slice& end,
2546
2640
  TableReaderCaller caller) {
2547
2641
  assert(rep_->internal_comparator.Compare(start, end) <= 0);
2548
2642
 
@@ -2559,6 +2653,7 @@ uint64_t BlockBasedTable::ApproximateSize(const Slice& start, const Slice& end,
2559
2653
  IndexBlockIter iiter_on_stack;
2560
2654
  ReadOptions ro;
2561
2655
  ro.total_order_seek = true;
2656
+ ro.io_activity = read_options.io_activity;
2562
2657
  auto index_iter =
2563
2658
  NewIndexIterator(ro, /*disable_prefix_seek=*/true,
2564
2659
  /*input_iter=*/&iiter_on_stack, /*get_context=*/nullptr,
@@ -2610,9 +2705,9 @@ bool BlockBasedTable::TEST_IndexBlockInCache() const {
2610
2705
  }
2611
2706
 
2612
2707
  Status BlockBasedTable::GetKVPairsFromDataBlocks(
2613
- std::vector<KVPairBlock>* kv_pair_blocks) {
2708
+ const ReadOptions& read_options, std::vector<KVPairBlock>* kv_pair_blocks) {
2614
2709
  std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
2615
- NewIndexIterator(ReadOptions(), /*need_upper_bound_check=*/false,
2710
+ NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
2616
2711
  /*input_iter=*/nullptr, /*get_context=*/nullptr,
2617
2712
  /*lookup_contex=*/nullptr));
2618
2713
 
@@ -2633,7 +2728,7 @@ Status BlockBasedTable::GetKVPairsFromDataBlocks(
2633
2728
  std::unique_ptr<InternalIterator> datablock_iter;
2634
2729
  Status tmp_status;
2635
2730
  datablock_iter.reset(NewDataBlockIterator<DataBlockIter>(
2636
- ReadOptions(), blockhandles_iter->value().handle,
2731
+ read_options, blockhandles_iter->value().handle,
2637
2732
  /*input_iter=*/nullptr, /*type=*/BlockType::kData,
2638
2733
  /*get_context=*/nullptr, /*lookup_context=*/nullptr,
2639
2734
  /*prefetch_buffer=*/nullptr, /*for_compaction=*/false,
@@ -2679,7 +2774,8 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
2679
2774
  "--------------------------------------\n";
2680
2775
  std::unique_ptr<Block> metaindex;
2681
2776
  std::unique_ptr<InternalIterator> metaindex_iter;
2682
- ReadOptions ro;
2777
+ // TODO: plumb Env::IOActivity
2778
+ const ReadOptions ro;
2683
2779
  Status s = ReadMetaIndexBlock(ro, nullptr /* prefetch_buffer */, &metaindex,
2684
2780
  &metaindex_iter);
2685
2781
  if (s.ok()) {
@@ -2735,7 +2831,7 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
2735
2831
  if (rep_->uncompression_dict_reader) {
2736
2832
  CachableEntry<UncompressionDict> uncompression_dict;
2737
2833
  s = rep_->uncompression_dict_reader->GetOrReadUncompressionDictionary(
2738
- nullptr /* prefetch_buffer */, false /* no_io */,
2834
+ nullptr /* prefetch_buffer */, ro, false /* no_io */,
2739
2835
  false, /* verify_checksums */
2740
2836
  nullptr /* get_context */, nullptr /* lookup_context */,
2741
2837
  &uncompression_dict);
@@ -2753,7 +2849,7 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
2753
2849
  }
2754
2850
 
2755
2851
  // Output range deletions block
2756
- auto* range_del_iter = NewRangeTombstoneIterator(ReadOptions());
2852
+ auto* range_del_iter = NewRangeTombstoneIterator(ro);
2757
2853
  if (range_del_iter != nullptr) {
2758
2854
  range_del_iter->SeekToFirst();
2759
2855
  if (range_del_iter->Valid()) {
@@ -2783,8 +2879,10 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
2783
2879
  Status BlockBasedTable::DumpIndexBlock(std::ostream& out_stream) {
2784
2880
  out_stream << "Index Details:\n"
2785
2881
  "--------------------------------------\n";
2882
+ // TODO: plumb Env::IOActivity
2883
+ const ReadOptions read_options;
2786
2884
  std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
2787
- NewIndexIterator(ReadOptions(), /*need_upper_bound_check=*/false,
2885
+ NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
2788
2886
  /*input_iter=*/nullptr, /*get_context=*/nullptr,
2789
2887
  /*lookup_contex=*/nullptr));
2790
2888
  Status s = blockhandles_iter->status();
@@ -2832,8 +2930,10 @@ Status BlockBasedTable::DumpIndexBlock(std::ostream& out_stream) {
2832
2930
  }
2833
2931
 
2834
2932
  Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
2933
+ // TODO: plumb Env::IOActivity
2934
+ const ReadOptions read_options;
2835
2935
  std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
2836
- NewIndexIterator(ReadOptions(), /*need_upper_bound_check=*/false,
2936
+ NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
2837
2937
  /*input_iter=*/nullptr, /*get_context=*/nullptr,
2838
2938
  /*lookup_contex=*/nullptr));
2839
2939
  Status s = blockhandles_iter->status();
@@ -2867,7 +2967,7 @@ Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
2867
2967
  std::unique_ptr<InternalIterator> datablock_iter;
2868
2968
  Status tmp_status;
2869
2969
  datablock_iter.reset(NewDataBlockIterator<DataBlockIter>(
2870
- ReadOptions(), blockhandles_iter->value().handle,
2970
+ read_options, blockhandles_iter->value().handle,
2871
2971
  /*input_iter=*/nullptr, /*type=*/BlockType::kData,
2872
2972
  /*get_context=*/nullptr, /*lookup_context=*/nullptr,
2873
2973
  /*prefetch_buffer=*/nullptr, /*for_compaction=*/false,