@nxtedition/rocksdb 7.1.14 → 7.1.16

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 (223) hide show
  1. package/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -122,8 +122,9 @@ class BlockBasedTableBuilder : public TableBuilder {
122
122
  void WriteBlock(const Slice& block_contents, BlockHandle* handle,
123
123
  BlockType block_type);
124
124
  // Directly write data to the file.
125
- void WriteRawBlock(const Slice& data, CompressionType, BlockHandle* handle,
126
- BlockType block_type, const Slice* raw_data = nullptr);
125
+ void WriteMaybeCompressedBlock(const Slice& data, CompressionType,
126
+ BlockHandle* handle, BlockType block_type,
127
+ const Slice* raw_data = nullptr);
127
128
 
128
129
  void SetupCacheKeyPrefix(const TableBuilderOptions& tbo);
129
130
 
@@ -161,8 +162,9 @@ class BlockBasedTableBuilder : public TableBuilder {
161
162
  // REQUIRES: Finish(), Abandon() have not been called
162
163
  void Flush();
163
164
 
164
- // Some compression libraries fail when the raw size is bigger than int. If
165
- // uncompressed size is bigger than kCompressionSizeLimit, don't compress it
165
+ // Some compression libraries fail when the uncompressed size is bigger than
166
+ // int. If uncompressed size is bigger than kCompressionSizeLimit, don't
167
+ // compress it
166
168
  const uint64_t kCompressionSizeLimit = std::numeric_limits<int>::max();
167
169
 
168
170
  // Get blocks from mem-table walking thread, compress them and
@@ -170,9 +172,9 @@ class BlockBasedTableBuilder : public TableBuilder {
170
172
  void BGWorkCompression(const CompressionContext& compression_ctx,
171
173
  UncompressionContext* verify_ctx);
172
174
 
173
- // Given raw block content, try to compress it and return result and
175
+ // Given uncompressed block content, try to compress it and return result and
174
176
  // compression type
175
- void CompressAndVerifyBlock(const Slice& raw_block_contents,
177
+ void CompressAndVerifyBlock(const Slice& uncompressed_block_data,
176
178
  bool is_data_block,
177
179
  const CompressionContext& compression_ctx,
178
180
  UncompressionContext* verify_ctx,
@@ -182,17 +184,17 @@ class BlockBasedTableBuilder : public TableBuilder {
182
184
  Status* out_status);
183
185
 
184
186
  // Get compressed blocks from BGWorkCompression and write them into SST
185
- void BGWorkWriteRawBlock();
187
+ void BGWorkWriteMaybeCompressedBlock();
186
188
 
187
189
  // Initialize parallel compression context and
188
- // start BGWorkCompression and BGWorkWriteRawBlock threads
190
+ // start BGWorkCompression and BGWorkWriteMaybeCompressedBlock threads
189
191
  void StartParallelCompression();
190
192
 
191
- // Stop BGWorkCompression and BGWorkWriteRawBlock threads
193
+ // Stop BGWorkCompression and BGWorkWriteMaybeCompressedBlock threads
192
194
  void StopParallelCompression();
193
195
  };
194
196
 
195
- Slice CompressBlock(const Slice& raw, const CompressionInfo& info,
197
+ Slice CompressBlock(const Slice& uncompressed_data, const CompressionInfo& info,
196
198
  CompressionType* type, uint32_t format_version,
197
199
  bool do_sample, std::string* compressed_output,
198
200
  std::string* sampled_output_fast,
@@ -416,6 +416,11 @@ static std::unordered_map<std::string, OptionTypeInfo>
416
416
  {offsetof(struct BlockBasedTableOptions, initial_auto_readahead_size),
417
417
  OptionType::kSizeT, OptionVerificationType::kNormal,
418
418
  OptionTypeFlags::kMutable}},
419
+ {"num_file_reads_for_auto_readahead",
420
+ {offsetof(struct BlockBasedTableOptions,
421
+ num_file_reads_for_auto_readahead),
422
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
423
+ OptionTypeFlags::kMutable}},
419
424
 
420
425
  #endif // ROCKSDB_LITE
421
426
  };
@@ -623,8 +628,8 @@ Status BlockBasedTableFactory::NewTableReader(
623
628
  table_reader_options.force_direct_prefetch, &tail_prefetch_stats_,
624
629
  table_reader_options.block_cache_tracer,
625
630
  table_reader_options.max_file_size_for_l0_meta_pin,
626
- table_reader_options.cur_db_session_id,
627
- table_reader_options.cur_file_num);
631
+ table_reader_options.cur_db_session_id, table_reader_options.cur_file_num,
632
+ table_reader_options.unique_id);
628
633
  }
629
634
 
630
635
  TableBuilder* BlockBasedTableFactory::NewTableBuilder(
@@ -894,6 +899,10 @@ std::string BlockBasedTableFactory::GetPrintableOptions() const {
894
899
  " initial_auto_readahead_size: %" ROCKSDB_PRIszt "\n",
895
900
  table_options_.initial_auto_readahead_size);
896
901
  ret.append(buffer);
902
+ snprintf(buffer, kBufferSize,
903
+ " num_file_reads_for_auto_readahead: %" PRIu64 "\n",
904
+ table_options_.num_file_reads_for_auto_readahead);
905
+ ret.append(buffer);
897
906
  return ret;
898
907
  }
899
908
 
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include <algorithm>
12
12
  #include <array>
13
+ #include <atomic>
13
14
  #include <cstdint>
14
15
  #include <limits>
15
16
  #include <memory>
@@ -411,7 +412,7 @@ template <typename TBlocklike>
411
412
  Status BlockBasedTable::InsertEntryToCache(
412
413
  const CacheTier& cache_tier, Cache* block_cache, const Slice& key,
413
414
  const Cache::CacheItemHelper* cache_helper,
414
- std::unique_ptr<TBlocklike>& block_holder, size_t charge,
415
+ std::unique_ptr<TBlocklike>&& block_holder, size_t charge,
415
416
  Cache::Handle** cache_handle, Cache::Priority priority) const {
416
417
  Status s = Status::OK();
417
418
  if (cache_tier == CacheTier::kNonVolatileBlockTier) {
@@ -421,6 +422,11 @@ Status BlockBasedTable::InsertEntryToCache(
421
422
  s = block_cache->Insert(key, block_holder.get(), charge,
422
423
  cache_helper->del_cb, cache_handle, priority);
423
424
  }
425
+ if (s.ok()) {
426
+ // Cache took ownership
427
+ block_holder.release();
428
+ }
429
+ s.MustCheck();
424
430
  return s;
425
431
  }
426
432
 
@@ -588,7 +594,7 @@ Status BlockBasedTable::Open(
588
594
  TailPrefetchStats* tail_prefetch_stats,
589
595
  BlockCacheTracer* const block_cache_tracer,
590
596
  size_t max_file_size_for_l0_meta_pin, const std::string& cur_db_session_id,
591
- uint64_t cur_file_num) {
597
+ uint64_t cur_file_num, UniqueId64x2 expected_unique_id) {
592
598
  table_reader->reset();
593
599
 
594
600
  Status s;
@@ -597,7 +603,7 @@ Status BlockBasedTable::Open(
597
603
 
598
604
  // From read_options, retain deadline, io_timeout, and rate_limiter_priority.
599
605
  // In future, we may retain more
600
- // options. Specifically, w ignore verify_checksums and default to
606
+ // options. Specifically, we ignore verify_checksums and default to
601
607
  // checksum verification anyway when creating the index and filter
602
608
  // readers.
603
609
  ReadOptions ro;
@@ -682,6 +688,53 @@ Status BlockBasedTable::Open(
682
688
  if (!s.ok()) {
683
689
  return s;
684
690
  }
691
+
692
+ // Check expected unique id if provided
693
+ if (expected_unique_id != kNullUniqueId64x2) {
694
+ auto props = rep->table_properties;
695
+ if (!props) {
696
+ return Status::Corruption("Missing table properties on file " +
697
+ std::to_string(cur_file_num) +
698
+ " with known unique ID");
699
+ }
700
+ UniqueId64x2 actual_unique_id{};
701
+ s = GetSstInternalUniqueId(props->db_id, props->db_session_id,
702
+ props->orig_file_number, &actual_unique_id,
703
+ /*force*/ true);
704
+ assert(s.ok()); // because force=true
705
+ if (expected_unique_id != actual_unique_id) {
706
+ return Status::Corruption(
707
+ "Mismatch in unique ID on table file " +
708
+ std::to_string(cur_file_num) +
709
+ ". Expected: " + InternalUniqueIdToHumanString(&expected_unique_id) +
710
+ " Actual: " + InternalUniqueIdToHumanString(&actual_unique_id));
711
+ }
712
+ TEST_SYNC_POINT_CALLBACK("BlockBasedTable::Open::PassedVerifyUniqueId",
713
+ &actual_unique_id);
714
+ } else {
715
+ TEST_SYNC_POINT_CALLBACK("BlockBasedTable::Open::SkippedVerifyUniqueId",
716
+ nullptr);
717
+ if (ioptions.verify_sst_unique_id_in_manifest && ioptions.logger) {
718
+ // A crude but isolated way of reporting unverified files. This should not
719
+ // be an ongoing concern so doesn't deserve a place in Statistics IMHO.
720
+ static std::atomic<uint64_t> unverified_count{0};
721
+ auto prev_count =
722
+ unverified_count.fetch_add(1, std::memory_order_relaxed);
723
+ if (prev_count == 0) {
724
+ ROCKS_LOG_WARN(
725
+ ioptions.logger,
726
+ "At least one SST file opened without unique ID to verify: %" PRIu64
727
+ ".sst",
728
+ cur_file_num);
729
+ } else if (prev_count % 1000 == 0) {
730
+ ROCKS_LOG_WARN(
731
+ ioptions.logger,
732
+ "Another ~1000 SST files opened without unique ID to verify");
733
+ }
734
+ }
735
+ }
736
+
737
+ // Set up prefix extracto as needed
685
738
  bool force_null_table_prefix_extractor = false;
686
739
  TEST_SYNC_POINT_CALLBACK(
687
740
  "BlockBasedTable::Open::ForceNullTablePrefixExtractor",
@@ -1223,15 +1276,16 @@ Status BlockBasedTable::ReadMetaIndexBlock(
1223
1276
  template <typename TBlocklike>
1224
1277
  Status BlockBasedTable::GetDataBlockFromCache(
1225
1278
  const Slice& cache_key, Cache* block_cache, Cache* block_cache_compressed,
1226
- const ReadOptions& read_options, CachableEntry<TBlocklike>* block,
1279
+ const ReadOptions& read_options,
1280
+ CachableEntry<TBlocklike>* out_parsed_block,
1227
1281
  const UncompressionDict& uncompression_dict, BlockType block_type,
1228
1282
  const bool wait, GetContext* get_context) const {
1229
1283
  const size_t read_amp_bytes_per_bit =
1230
1284
  block_type == BlockType::kData
1231
1285
  ? rep_->table_options.read_amp_bytes_per_bit
1232
1286
  : 0;
1233
- assert(block);
1234
- assert(block->IsEmpty());
1287
+ assert(out_parsed_block);
1288
+ assert(out_parsed_block->IsEmpty());
1235
1289
  // Here we treat the legacy name "...index_and_filter_blocks..." to mean all
1236
1290
  // metadata blocks that might go into block cache, EXCEPT only those needed
1237
1291
  // for the read path (Get, etc.). TableProperties should not be needed on the
@@ -1264,7 +1318,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
1264
1318
  BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type), create_cb,
1265
1319
  priority);
1266
1320
  if (cache_handle != nullptr) {
1267
- block->SetCachedValue(
1321
+ out_parsed_block->SetCachedValue(
1268
1322
  reinterpret_cast<TBlocklike*>(block_cache->Value(cache_handle)),
1269
1323
  block_cache, cache_handle);
1270
1324
  return s;
@@ -1272,7 +1326,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
1272
1326
  }
1273
1327
 
1274
1328
  // If not found, search from the compressed block cache.
1275
- assert(block->IsEmpty());
1329
+ assert(out_parsed_block->IsEmpty());
1276
1330
 
1277
1331
  if (block_cache_compressed == nullptr) {
1278
1332
  return s;
@@ -1310,32 +1364,33 @@ Status BlockBasedTable::GetDataBlockFromCache(
1310
1364
  // Retrieve the uncompressed contents into a new buffer
1311
1365
  UncompressionContext context(compression_type);
1312
1366
  UncompressionInfo info(context, uncompression_dict, compression_type);
1313
- s = UncompressBlockContents(
1367
+ s = UncompressSerializedBlock(
1314
1368
  info, compressed_block->data.data(), compressed_block->data.size(),
1315
1369
  &contents, rep_->table_options.format_version, rep_->ioptions,
1316
1370
  GetMemoryAllocator(rep_->table_options));
1317
1371
 
1318
- // Insert uncompressed block into block cache, the priority is based on the
1372
+ // Insert parsed block into block cache, the priority is based on the
1319
1373
  // data block type.
1320
1374
  if (s.ok()) {
1321
1375
  std::unique_ptr<TBlocklike> block_holder(
1322
1376
  BlocklikeTraits<TBlocklike>::Create(
1323
1377
  std::move(contents), read_amp_bytes_per_bit, statistics,
1324
1378
  rep_->blocks_definitely_zstd_compressed,
1325
- rep_->table_options.filter_policy.get())); // uncompressed block
1379
+ rep_->table_options.filter_policy.get()));
1326
1380
 
1327
1381
  if (block_cache != nullptr && block_holder->own_bytes() &&
1328
1382
  read_options.fill_cache) {
1329
1383
  size_t charge = block_holder->ApproximateMemoryUsage();
1330
1384
  Cache::Handle* cache_handle = nullptr;
1385
+ auto block_holder_raw_ptr = block_holder.get();
1331
1386
  s = InsertEntryToCache(
1332
1387
  rep_->ioptions.lowest_used_cache_tier, block_cache, cache_key,
1333
1388
  BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type),
1334
- block_holder, charge, &cache_handle, priority);
1389
+ std::move(block_holder), charge, &cache_handle, priority);
1335
1390
  if (s.ok()) {
1336
1391
  assert(cache_handle != nullptr);
1337
- block->SetCachedValue(block_holder.release(), block_cache,
1338
- cache_handle);
1392
+ out_parsed_block->SetCachedValue(block_holder_raw_ptr, block_cache,
1393
+ cache_handle);
1339
1394
 
1340
1395
  UpdateCacheInsertionMetrics(block_type, get_context, charge,
1341
1396
  s.IsOkOverwritten(), rep_->ioptions.stats);
@@ -1343,7 +1398,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
1343
1398
  RecordTick(statistics, BLOCK_CACHE_ADD_FAILURES);
1344
1399
  }
1345
1400
  } else {
1346
- block->SetOwnedValue(block_holder.release());
1401
+ out_parsed_block->SetOwnedValue(std::move(block_holder));
1347
1402
  }
1348
1403
  }
1349
1404
 
@@ -1355,8 +1410,8 @@ Status BlockBasedTable::GetDataBlockFromCache(
1355
1410
  template <typename TBlocklike>
1356
1411
  Status BlockBasedTable::PutDataBlockToCache(
1357
1412
  const Slice& cache_key, Cache* block_cache, Cache* block_cache_compressed,
1358
- CachableEntry<TBlocklike>* cached_block, BlockContents* raw_block_contents,
1359
- CompressionType raw_block_comp_type,
1413
+ CachableEntry<TBlocklike>* out_parsed_block, BlockContents&& block_contents,
1414
+ CompressionType block_comp_type,
1360
1415
  const UncompressionDict& uncompression_dict,
1361
1416
  MemoryAllocator* memory_allocator, BlockType block_type,
1362
1417
  GetContext* get_context) const {
@@ -1371,22 +1426,22 @@ Status BlockBasedTable::PutDataBlockToCache(
1371
1426
  block_type != BlockType::kData
1372
1427
  ? Cache::Priority::HIGH
1373
1428
  : Cache::Priority::LOW;
1374
- assert(cached_block);
1375
- assert(cached_block->IsEmpty());
1429
+ assert(out_parsed_block);
1430
+ assert(out_parsed_block->IsEmpty());
1376
1431
 
1377
1432
  Status s;
1378
1433
  Statistics* statistics = ioptions.stats;
1379
1434
 
1380
1435
  std::unique_ptr<TBlocklike> block_holder;
1381
- if (raw_block_comp_type != kNoCompression) {
1436
+ if (block_comp_type != kNoCompression) {
1382
1437
  // Retrieve the uncompressed contents into a new buffer
1383
1438
  BlockContents uncompressed_block_contents;
1384
- UncompressionContext context(raw_block_comp_type);
1385
- UncompressionInfo info(context, uncompression_dict, raw_block_comp_type);
1386
- s = UncompressBlockContents(info, raw_block_contents->data.data(),
1387
- raw_block_contents->data.size(),
1388
- &uncompressed_block_contents, format_version,
1389
- ioptions, memory_allocator);
1439
+ UncompressionContext context(block_comp_type);
1440
+ UncompressionInfo info(context, uncompression_dict, block_comp_type);
1441
+ s = UncompressBlockData(info, block_contents.data.data(),
1442
+ block_contents.data.size(),
1443
+ &uncompressed_block_contents, format_version,
1444
+ ioptions, memory_allocator);
1390
1445
  if (!s.ok()) {
1391
1446
  return s;
1392
1447
  }
@@ -1397,53 +1452,51 @@ Status BlockBasedTable::PutDataBlockToCache(
1397
1452
  rep_->table_options.filter_policy.get()));
1398
1453
  } else {
1399
1454
  block_holder.reset(BlocklikeTraits<TBlocklike>::Create(
1400
- std::move(*raw_block_contents), read_amp_bytes_per_bit, statistics,
1455
+ std::move(block_contents), read_amp_bytes_per_bit, statistics,
1401
1456
  rep_->blocks_definitely_zstd_compressed,
1402
1457
  rep_->table_options.filter_policy.get()));
1403
1458
  }
1404
1459
 
1405
1460
  // Insert compressed block into compressed block cache.
1406
1461
  // Release the hold on the compressed cache entry immediately.
1407
- if (block_cache_compressed != nullptr &&
1408
- raw_block_comp_type != kNoCompression && raw_block_contents != nullptr &&
1409
- raw_block_contents->own_bytes()) {
1410
- assert(raw_block_contents->is_raw_block);
1462
+ if (block_cache_compressed != nullptr && block_comp_type != kNoCompression &&
1463
+ block_contents.own_bytes()) {
1464
+ assert(block_contents.has_trailer);
1411
1465
  assert(!cache_key.empty());
1412
1466
 
1413
- // We cannot directly put raw_block_contents because this could point to
1467
+ // We cannot directly put block_contents because this could point to
1414
1468
  // an object in the stack.
1415
- std::unique_ptr<BlockContents> block_cont_for_comp_cache(
1416
- new BlockContents(std::move(*raw_block_contents)));
1469
+ auto block_cont_for_comp_cache =
1470
+ std::make_unique<BlockContents>(std::move(block_contents));
1471
+ size_t charge = block_cont_for_comp_cache->ApproximateMemoryUsage();
1417
1472
  s = InsertEntryToCache(
1418
1473
  rep_->ioptions.lowest_used_cache_tier, block_cache_compressed,
1419
1474
  cache_key,
1420
1475
  BlocklikeTraits<BlockContents>::GetCacheItemHelper(block_type),
1421
- block_cont_for_comp_cache,
1422
- block_cont_for_comp_cache->ApproximateMemoryUsage(), nullptr,
1476
+ std::move(block_cont_for_comp_cache), charge, nullptr,
1423
1477
  Cache::Priority::LOW);
1424
1478
 
1425
- BlockContents* block_cont_raw_ptr = block_cont_for_comp_cache.release();
1426
1479
  if (s.ok()) {
1427
1480
  // Avoid the following code to delete this cached block.
1428
1481
  RecordTick(statistics, BLOCK_CACHE_COMPRESSED_ADD);
1429
1482
  } else {
1430
1483
  RecordTick(statistics, BLOCK_CACHE_COMPRESSED_ADD_FAILURES);
1431
- delete block_cont_raw_ptr;
1432
1484
  }
1433
1485
  }
1434
1486
 
1435
1487
  // insert into uncompressed block cache
1436
1488
  if (block_cache != nullptr && block_holder->own_bytes()) {
1437
1489
  size_t charge = block_holder->ApproximateMemoryUsage();
1490
+ auto block_holder_raw_ptr = block_holder.get();
1438
1491
  Cache::Handle* cache_handle = nullptr;
1439
1492
  s = InsertEntryToCache(
1440
1493
  rep_->ioptions.lowest_used_cache_tier, block_cache, cache_key,
1441
1494
  BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type),
1442
- block_holder, charge, &cache_handle, priority);
1495
+ std::move(block_holder), charge, &cache_handle, priority);
1443
1496
  if (s.ok()) {
1444
1497
  assert(cache_handle != nullptr);
1445
- cached_block->SetCachedValue(block_holder.release(), block_cache,
1446
- cache_handle);
1498
+ out_parsed_block->SetCachedValue(block_holder_raw_ptr, block_cache,
1499
+ cache_handle);
1447
1500
 
1448
1501
  UpdateCacheInsertionMetrics(block_type, get_context, charge,
1449
1502
  s.IsOkOverwritten(), rep_->ioptions.stats);
@@ -1451,7 +1504,7 @@ Status BlockBasedTable::PutDataBlockToCache(
1451
1504
  RecordTick(statistics, BLOCK_CACHE_ADD_FAILURES);
1452
1505
  }
1453
1506
  } else {
1454
- cached_block->SetOwnedValue(block_holder.release());
1507
+ out_parsed_block->SetOwnedValue(std::move(block_holder));
1455
1508
  }
1456
1509
 
1457
1510
  return s;
@@ -1532,10 +1585,10 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1532
1585
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1533
1586
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1534
1587
  const bool wait, const bool for_compaction,
1535
- CachableEntry<TBlocklike>* block_entry, BlockType block_type,
1588
+ CachableEntry<TBlocklike>* out_parsed_block, BlockType block_type,
1536
1589
  GetContext* get_context, BlockCacheLookupContext* lookup_context,
1537
1590
  BlockContents* contents, bool async_read) const {
1538
- assert(block_entry != nullptr);
1591
+ assert(out_parsed_block != nullptr);
1539
1592
  const bool no_io = (ro.read_tier == kBlockCacheTier);
1540
1593
  Cache* block_cache = rep_->table_options.block_cache.get();
1541
1594
  Cache* block_cache_compressed =
@@ -1555,11 +1608,11 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1555
1608
 
1556
1609
  if (!contents) {
1557
1610
  s = GetDataBlockFromCache(key, block_cache, block_cache_compressed, ro,
1558
- block_entry, uncompression_dict, block_type,
1559
- wait, get_context);
1611
+ out_parsed_block, uncompression_dict,
1612
+ block_type, wait, get_context);
1560
1613
  // Value could still be null at this point, so check the cache handle
1561
1614
  // and update the read pattern for prefetching
1562
- if (block_entry->GetValue() || block_entry->GetCacheHandle()) {
1615
+ if (out_parsed_block->GetValue() || out_parsed_block->GetCacheHandle()) {
1563
1616
  // TODO(haoyu): Differentiate cache hit on uncompressed block cache and
1564
1617
  // compressed block cache.
1565
1618
  is_cache_hit = true;
@@ -1576,25 +1629,26 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1576
1629
 
1577
1630
  // Can't find the block from the cache. If I/O is allowed, read from the
1578
1631
  // file.
1579
- if (block_entry->GetValue() == nullptr &&
1580
- block_entry->GetCacheHandle() == nullptr && !no_io && ro.fill_cache) {
1632
+ if (out_parsed_block->GetValue() == nullptr &&
1633
+ out_parsed_block->GetCacheHandle() == nullptr && !no_io &&
1634
+ ro.fill_cache) {
1581
1635
  Statistics* statistics = rep_->ioptions.stats;
1582
1636
  const bool maybe_compressed =
1583
1637
  block_type != BlockType::kFilter &&
1584
1638
  block_type != BlockType::kCompressionDictionary &&
1585
1639
  rep_->blocks_maybe_compressed;
1586
1640
  const bool do_uncompress = maybe_compressed && !block_cache_compressed;
1587
- CompressionType raw_block_comp_type;
1588
- BlockContents raw_block_contents;
1641
+ CompressionType contents_comp_type;
1642
+ // Maybe serialized or uncompressed
1643
+ BlockContents tmp_contents;
1589
1644
  if (!contents) {
1590
1645
  Histograms histogram = for_compaction ? READ_BLOCK_COMPACTION_MICROS
1591
1646
  : READ_BLOCK_GET_MICROS;
1592
1647
  StopWatch sw(rep_->ioptions.clock, statistics, histogram);
1593
1648
  BlockFetcher block_fetcher(
1594
1649
  rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle,
1595
- &raw_block_contents, rep_->ioptions, do_uncompress,
1596
- maybe_compressed, block_type, uncompression_dict,
1597
- rep_->persistent_cache_options,
1650
+ &tmp_contents, rep_->ioptions, do_uncompress, maybe_compressed,
1651
+ block_type, uncompression_dict, rep_->persistent_cache_options,
1598
1652
  GetMemoryAllocator(rep_->table_options),
1599
1653
  GetMemoryAllocatorForCompressedBlock(rep_->table_options));
1600
1654
 
@@ -1609,8 +1663,8 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1609
1663
  s = block_fetcher.ReadBlockContents();
1610
1664
  }
1611
1665
 
1612
- raw_block_comp_type = block_fetcher.get_compression_type();
1613
- contents = &raw_block_contents;
1666
+ contents_comp_type = block_fetcher.get_compression_type();
1667
+ contents = &tmp_contents;
1614
1668
  if (get_context) {
1615
1669
  switch (block_type) {
1616
1670
  case BlockType::kIndex:
@@ -1625,15 +1679,15 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1625
1679
  }
1626
1680
  }
1627
1681
  } else {
1628
- raw_block_comp_type = GetBlockCompressionType(*contents);
1682
+ contents_comp_type = GetBlockCompressionType(*contents);
1629
1683
  }
1630
1684
 
1631
1685
  if (s.ok()) {
1632
1686
  // If filling cache is allowed and a cache is configured, try to put the
1633
1687
  // block to the cache.
1634
1688
  s = PutDataBlockToCache(
1635
- key, block_cache, block_cache_compressed, block_entry, contents,
1636
- raw_block_comp_type, uncompression_dict,
1689
+ key, block_cache, block_cache_compressed, out_parsed_block,
1690
+ std::move(*contents), contents_comp_type, uncompression_dict,
1637
1691
  GetMemoryAllocator(rep_->table_options), block_type, get_context);
1638
1692
  }
1639
1693
  }
@@ -1644,12 +1698,12 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1644
1698
  lookup_context) {
1645
1699
  size_t usage = 0;
1646
1700
  uint64_t nkeys = 0;
1647
- if (block_entry->GetValue()) {
1701
+ if (out_parsed_block->GetValue()) {
1648
1702
  // Approximate the number of keys in the block using restarts.
1649
- nkeys =
1650
- rep_->table_options.block_restart_interval *
1651
- BlocklikeTraits<TBlocklike>::GetNumRestarts(*block_entry->GetValue());
1652
- usage = block_entry->GetValue()->ApproximateMemoryUsage();
1703
+ nkeys = rep_->table_options.block_restart_interval *
1704
+ BlocklikeTraits<TBlocklike>::GetNumRestarts(
1705
+ *out_parsed_block->GetValue());
1706
+ usage = out_parsed_block->GetValue()->ApproximateMemoryUsage();
1653
1707
  }
1654
1708
  TraceType trace_block_type = TraceType::kTraceMax;
1655
1709
  switch (block_type) {
@@ -1704,7 +1758,7 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
1704
1758
  }
1705
1759
  }
1706
1760
 
1707
- assert(s.ok() || block_entry->GetValue() == nullptr);
1761
+ assert(s.ok() || out_parsed_block->GetValue() == nullptr);
1708
1762
  return s;
1709
1763
  }
1710
1764
 
@@ -1712,32 +1766,33 @@ template <typename TBlocklike>
1712
1766
  Status BlockBasedTable::RetrieveBlock(
1713
1767
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1714
1768
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1715
- CachableEntry<TBlocklike>* block_entry, BlockType block_type,
1769
+ CachableEntry<TBlocklike>* out_parsed_block, BlockType block_type,
1716
1770
  GetContext* get_context, BlockCacheLookupContext* lookup_context,
1717
1771
  bool for_compaction, bool use_cache, bool wait_for_cache,
1718
1772
  bool async_read) const {
1719
- assert(block_entry);
1720
- assert(block_entry->IsEmpty());
1773
+ assert(out_parsed_block);
1774
+ assert(out_parsed_block->IsEmpty());
1721
1775
 
1722
1776
  Status s;
1723
1777
  if (use_cache) {
1724
- s = MaybeReadBlockAndLoadToCache(
1725
- prefetch_buffer, ro, handle, uncompression_dict, wait_for_cache,
1726
- for_compaction, block_entry, block_type, get_context, lookup_context,
1727
- /*contents=*/nullptr, async_read);
1778
+ s = MaybeReadBlockAndLoadToCache(prefetch_buffer, ro, handle,
1779
+ uncompression_dict, wait_for_cache,
1780
+ for_compaction, out_parsed_block,
1781
+ block_type, get_context, lookup_context,
1782
+ /*contents=*/nullptr, async_read);
1728
1783
 
1729
1784
  if (!s.ok()) {
1730
1785
  return s;
1731
1786
  }
1732
1787
 
1733
- if (block_entry->GetValue() != nullptr ||
1734
- block_entry->GetCacheHandle() != nullptr) {
1788
+ if (out_parsed_block->GetValue() != nullptr ||
1789
+ out_parsed_block->GetCacheHandle() != nullptr) {
1735
1790
  assert(s.ok());
1736
1791
  return s;
1737
1792
  }
1738
1793
  }
1739
1794
 
1740
- assert(block_entry->IsEmpty());
1795
+ assert(out_parsed_block->IsEmpty());
1741
1796
 
1742
1797
  const bool no_io = ro.read_tier == kBlockCacheTier;
1743
1798
  if (no_io) {
@@ -1785,7 +1840,7 @@ Status BlockBasedTable::RetrieveBlock(
1785
1840
  return s;
1786
1841
  }
1787
1842
 
1788
- block_entry->SetOwnedValue(block.release());
1843
+ out_parsed_block->SetOwnedValue(std::move(block));
1789
1844
 
1790
1845
  assert(s.ok());
1791
1846
  return s;
@@ -1796,7 +1851,7 @@ Status BlockBasedTable::RetrieveBlock(
1796
1851
  template Status BlockBasedTable::RetrieveBlock<BlockContents>(
1797
1852
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1798
1853
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1799
- CachableEntry<BlockContents>* block_entry, BlockType block_type,
1854
+ CachableEntry<BlockContents>* out_parsed_block, BlockType block_type,
1800
1855
  GetContext* get_context, BlockCacheLookupContext* lookup_context,
1801
1856
  bool for_compaction, bool use_cache, bool wait_for_cache,
1802
1857
  bool async_read) const;
@@ -1804,15 +1859,15 @@ template Status BlockBasedTable::RetrieveBlock<BlockContents>(
1804
1859
  template Status BlockBasedTable::RetrieveBlock<ParsedFullFilterBlock>(
1805
1860
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1806
1861
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1807
- CachableEntry<ParsedFullFilterBlock>* block_entry, BlockType block_type,
1808
- GetContext* get_context, BlockCacheLookupContext* lookup_context,
1809
- bool for_compaction, bool use_cache, bool wait_for_cache,
1810
- bool async_read) const;
1862
+ CachableEntry<ParsedFullFilterBlock>* out_parsed_block,
1863
+ BlockType block_type, GetContext* get_context,
1864
+ BlockCacheLookupContext* lookup_context, bool for_compaction,
1865
+ bool use_cache, bool wait_for_cache, bool async_read) const;
1811
1866
 
1812
1867
  template Status BlockBasedTable::RetrieveBlock<Block>(
1813
1868
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1814
1869
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1815
- CachableEntry<Block>* block_entry, BlockType block_type,
1870
+ CachableEntry<Block>* out_parsed_block, BlockType block_type,
1816
1871
  GetContext* get_context, BlockCacheLookupContext* lookup_context,
1817
1872
  bool for_compaction, bool use_cache, bool wait_for_cache,
1818
1873
  bool async_read) const;
@@ -1820,7 +1875,7 @@ template Status BlockBasedTable::RetrieveBlock<Block>(
1820
1875
  template Status BlockBasedTable::RetrieveBlock<UncompressionDict>(
1821
1876
  FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
1822
1877
  const BlockHandle& handle, const UncompressionDict& uncompression_dict,
1823
- CachableEntry<UncompressionDict>* block_entry, BlockType block_type,
1878
+ CachableEntry<UncompressionDict>* out_parsed_block, BlockType block_type,
1824
1879
  GetContext* get_context, BlockCacheLookupContext* lookup_context,
1825
1880
  bool for_compaction, bool use_cache, bool wait_for_cache,
1826
1881
  bool async_read) const;