@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
@@ -30,7 +30,7 @@ namespace ROCKSDB_NAMESPACE {
30
30
  // Helper routine: decode the next block entry starting at "p",
31
31
  // storing the number of shared key bytes, non_shared key bytes,
32
32
  // and the length of the value in "*shared", "*non_shared", and
33
- // "*value_length", respectively. Will not derefence past "limit".
33
+ // "*value_length", respectively. Will not dereference past "limit".
34
34
  //
35
35
  // If any errors are detected, returns nullptr. Otherwise, returns a
36
36
  // pointer to the key delta (just past the three decoded values).
@@ -137,17 +137,26 @@ struct DecodeEntryV4 {
137
137
  return DecodeKeyV4()(p, limit, shared, non_shared);
138
138
  }
139
139
  };
140
+
140
141
  void DataBlockIter::NextImpl() {
142
+ #ifndef NDEBUG
143
+ if (TEST_Corrupt_Callback("DataBlockIter::NextImpl")) return;
144
+ #endif
141
145
  bool is_shared = false;
142
146
  ParseNextDataKey(&is_shared);
147
+ ++cur_entry_idx_;
143
148
  }
144
149
 
145
150
  void MetaBlockIter::NextImpl() {
146
151
  bool is_shared = false;
147
152
  ParseNextKey<CheckAndDecodeEntry>(&is_shared);
153
+ ++cur_entry_idx_;
148
154
  }
149
155
 
150
- void IndexBlockIter::NextImpl() { ParseNextIndexKey(); }
156
+ void IndexBlockIter::NextImpl() {
157
+ ParseNextIndexKey();
158
+ ++cur_entry_idx_;
159
+ }
151
160
 
152
161
  void IndexBlockIter::PrevImpl() {
153
162
  assert(Valid());
@@ -166,6 +175,7 @@ void IndexBlockIter::PrevImpl() {
166
175
  // Loop until end of current entry hits the start of original entry
167
176
  while (ParseNextIndexKey() && NextEntryOffset() < original) {
168
177
  }
178
+ --cur_entry_idx_;
169
179
  }
170
180
 
171
181
  void MetaBlockIter::PrevImpl() {
@@ -187,6 +197,7 @@ void MetaBlockIter::PrevImpl() {
187
197
  while (ParseNextKey<CheckAndDecodeEntry>(&is_shared) &&
188
198
  NextEntryOffset() < original) {
189
199
  }
200
+ --cur_entry_idx_;
190
201
  }
191
202
 
192
203
  // Similar to IndexBlockIter::PrevImpl but also caches the prev entries
@@ -195,6 +206,7 @@ void DataBlockIter::PrevImpl() {
195
206
 
196
207
  assert(prev_entries_idx_ == -1 ||
197
208
  static_cast<size_t>(prev_entries_idx_) < prev_entries_.size());
209
+ --cur_entry_idx_;
198
210
  // Check if we can use cached prev_entries_
199
211
  if (prev_entries_idx_ > 0 &&
200
212
  prev_entries_[prev_entries_idx_].offset == current_) {
@@ -307,11 +319,11 @@ void MetaBlockIter::SeekImpl(const Slice& target) {
307
319
  // target = "seek_user_key @ type | seqno".
308
320
  //
309
321
  // For any type other than kTypeValue, kTypeDeletion, kTypeSingleDeletion,
310
- // kTypeBlobIndex, or kTypeWideColumnEntity, this function behaves identically
311
- // to Seek().
322
+ // kTypeBlobIndex, kTypeWideColumnEntity or kTypeMerge, this function behaves
323
+ // identically to Seek().
312
324
  //
313
325
  // For any type in kTypeValue, kTypeDeletion, kTypeSingleDeletion,
314
- // kTypeBlobIndex, or kTypeWideColumnEntity:
326
+ // kTypeBlobIndex, kTypeWideColumnEntity, or kTypeMerge:
315
327
  //
316
328
  // If the return value is FALSE, iter location is undefined, and it means:
317
329
  // 1) there is no key in this block falling into the range:
@@ -319,10 +331,10 @@ void MetaBlockIter::SeekImpl(const Slice& target) {
319
331
  // inclusive; AND
320
332
  // 2) the last key of this block has a greater user_key from seek_user_key
321
333
  //
322
- // If the return value is TRUE, iter location has two possibilies:
323
- // 1) If iter is valid, it is set to a location as if set by BinarySeek. In
324
- // this case, it points to the first key with a larger user_key or a matching
325
- // user_key with a seqno no greater than the seeking seqno.
334
+ // If the return value is TRUE, iter location has two possibilities:
335
+ // 1) If iter is valid, it is set to a location as if set by SeekImpl(target).
336
+ // In this case, it points to the first key with a larger user_key or a
337
+ // matching user_key with a seqno no greater than the seeking seqno.
326
338
  // 2) If the iter is invalid, it means that either all the user_key is less
327
339
  // than the seek_user_key, or the block ends with a matching user_key but
328
340
  // with a smaller [ type | seqno ] (i.e. a larger seqno, or the same seqno
@@ -347,11 +359,11 @@ bool DataBlockIter::SeekForGetImpl(const Slice& target) {
347
359
  // boundary key: axy@50 (we make minimal assumption about a boundary key)
348
360
  // Block N+1: [axy@10, ... ]
349
361
  //
350
- // If seek_key = axy@60, the search will starts from Block N.
362
+ // If seek_key = axy@60, the search will start from Block N.
351
363
  // Even if the user_key is not found in the hash map, the caller still
352
364
  // have to continue searching the next block.
353
365
  //
354
- // In this case, we pretend the key is the the last restart interval.
366
+ // In this case, we pretend the key is in the last restart interval.
355
367
  // The while-loop below will search the last restart interval for the
356
368
  // key. It will stop at the first key that is larger than the seek_key,
357
369
  // or to the end of the block if no one is larger.
@@ -364,12 +376,15 @@ bool DataBlockIter::SeekForGetImpl(const Slice& target) {
364
376
  assert(restart_index < num_restarts_);
365
377
  SeekToRestartPoint(restart_index);
366
378
  current_ = GetRestartPoint(restart_index);
379
+ cur_entry_idx_ =
380
+ static_cast<int32_t>(restart_index * block_restart_interval_) - 1;
367
381
 
368
382
  uint32_t limit = restarts_;
369
383
  if (restart_index + 1 < num_restarts_) {
370
384
  limit = GetRestartPoint(restart_index + 1);
371
385
  }
372
386
  while (current_ < limit) {
387
+ ++cur_entry_idx_;
373
388
  bool shared;
374
389
  // Here we only linear seek the target key inside the restart interval.
375
390
  // If a key does not exist inside a restart interval, we avoid
@@ -381,14 +396,20 @@ bool DataBlockIter::SeekForGetImpl(const Slice& target) {
381
396
  // we stop at the first potential matching user key.
382
397
  break;
383
398
  }
399
+ // If the loop exits due to CompareCurrentKey(target) >= 0, then current key
400
+ // exists, and its checksum verification will be done in UpdateKey() called
401
+ // in SeekForGet().
402
+ // TODO(cbi): If this loop exits with current_ == restart_, per key-value
403
+ // checksum will not be verified in UpdateKey() since Valid()
404
+ // will return false.
384
405
  }
385
406
 
386
407
  if (current_ == restarts_) {
387
- // Search reaches to the end of the block. There are three possibilites:
388
- // 1) there is only one user_key match in the block (otherwise collsion).
408
+ // Search reaches to the end of the block. There are three possibilities:
409
+ // 1) there is only one user_key match in the block (otherwise collision).
389
410
  // the matching user_key resides in the last restart interval, and it
390
411
  // is the last key of the restart interval and of the block as well.
391
- // ParseNextKey() skiped it as its [ type | seqno ] is smaller.
412
+ // ParseNextKey() skipped it as its [ type | seqno ] is smaller.
392
413
  //
393
414
  // 2) The seek_key is not found in the HashIndex Lookup(), i.e. kNoEntry,
394
415
  // AND all existing user_keys in the restart interval are smaller than
@@ -412,11 +433,11 @@ bool DataBlockIter::SeekForGetImpl(const Slice& target) {
412
433
  ValueType value_type = ExtractValueType(raw_key_.GetInternalKey());
413
434
  if (value_type != ValueType::kTypeValue &&
414
435
  value_type != ValueType::kTypeDeletion &&
436
+ value_type != ValueType::kTypeMerge &&
415
437
  value_type != ValueType::kTypeSingleDeletion &&
416
438
  value_type != ValueType::kTypeBlobIndex &&
417
439
  value_type != ValueType::kTypeWideColumnEntity) {
418
440
  SeekImpl(target);
419
- return true;
420
441
  }
421
442
 
422
443
  // Result found, and the iter is correctly set.
@@ -424,6 +445,9 @@ bool DataBlockIter::SeekForGetImpl(const Slice& target) {
424
445
  }
425
446
 
426
447
  void IndexBlockIter::SeekImpl(const Slice& target) {
448
+ #ifndef NDEBUG
449
+ if (TEST_Corrupt_Callback("IndexBlockIter::SeekImpl")) return;
450
+ #endif
427
451
  TEST_SYNC_POINT("IndexBlockIter::Seek:0");
428
452
  PERF_TIMER_GUARD(block_seek_nanos);
429
453
  if (data_ == nullptr) { // Not init yet
@@ -478,7 +502,9 @@ void DataBlockIter::SeekForPrevImpl(const Slice& target) {
478
502
  FindKeyAfterBinarySeek(seek_key, index, skip_linear_scan);
479
503
 
480
504
  if (!Valid()) {
481
- SeekToLastImpl();
505
+ if (status_.ok()) {
506
+ SeekToLastImpl();
507
+ }
482
508
  } else {
483
509
  while (Valid() && CompareCurrentKey(seek_key) > 0) {
484
510
  PrevImpl();
@@ -502,7 +528,9 @@ void MetaBlockIter::SeekForPrevImpl(const Slice& target) {
502
528
  FindKeyAfterBinarySeek(seek_key, index, skip_linear_scan);
503
529
 
504
530
  if (!Valid()) {
505
- SeekToLastImpl();
531
+ if (status_.ok()) {
532
+ SeekToLastImpl();
533
+ }
506
534
  } else {
507
535
  while (Valid() && CompareCurrentKey(seek_key) > 0) {
508
536
  PrevImpl();
@@ -517,6 +545,7 @@ void DataBlockIter::SeekToFirstImpl() {
517
545
  SeekToRestartPoint(0);
518
546
  bool is_shared = false;
519
547
  ParseNextDataKey(&is_shared);
548
+ cur_entry_idx_ = 0;
520
549
  }
521
550
 
522
551
  void MetaBlockIter::SeekToFirstImpl() {
@@ -526,15 +555,20 @@ void MetaBlockIter::SeekToFirstImpl() {
526
555
  SeekToRestartPoint(0);
527
556
  bool is_shared = false;
528
557
  ParseNextKey<CheckAndDecodeEntry>(&is_shared);
558
+ cur_entry_idx_ = 0;
529
559
  }
530
560
 
531
561
  void IndexBlockIter::SeekToFirstImpl() {
562
+ #ifndef NDEBUG
563
+ if (TEST_Corrupt_Callback("IndexBlockIter::SeekToFirstImpl")) return;
564
+ #endif
532
565
  if (data_ == nullptr) { // Not init yet
533
566
  return;
534
567
  }
535
568
  status_ = Status::OK();
536
569
  SeekToRestartPoint(0);
537
570
  ParseNextIndexKey();
571
+ cur_entry_idx_ = 0;
538
572
  }
539
573
 
540
574
  void DataBlockIter::SeekToLastImpl() {
@@ -543,8 +577,10 @@ void DataBlockIter::SeekToLastImpl() {
543
577
  }
544
578
  SeekToRestartPoint(num_restarts_ - 1);
545
579
  bool is_shared = false;
580
+ cur_entry_idx_ = (num_restarts_ - 1) * block_restart_interval_;
546
581
  while (ParseNextDataKey(&is_shared) && NextEntryOffset() < restarts_) {
547
582
  // Keep skipping
583
+ ++cur_entry_idx_;
548
584
  }
549
585
  }
550
586
 
@@ -554,9 +590,13 @@ void MetaBlockIter::SeekToLastImpl() {
554
590
  }
555
591
  SeekToRestartPoint(num_restarts_ - 1);
556
592
  bool is_shared = false;
593
+ assert(num_restarts_ >= 1);
594
+ cur_entry_idx_ =
595
+ static_cast<int32_t>((num_restarts_ - 1) * block_restart_interval_);
557
596
  while (ParseNextKey<CheckAndDecodeEntry>(&is_shared) &&
558
597
  NextEntryOffset() < restarts_) {
559
- // Keep skipping
598
+ // Will probably never reach here since restart_interval is always 1
599
+ ++cur_entry_idx_;
560
600
  }
561
601
  }
562
602
 
@@ -566,20 +606,12 @@ void IndexBlockIter::SeekToLastImpl() {
566
606
  }
567
607
  status_ = Status::OK();
568
608
  SeekToRestartPoint(num_restarts_ - 1);
609
+ cur_entry_idx_ = (num_restarts_ - 1) * block_restart_interval_;
569
610
  while (ParseNextIndexKey() && NextEntryOffset() < restarts_) {
570
- // Keep skipping
611
+ ++cur_entry_idx_;
571
612
  }
572
613
  }
573
614
 
574
- template <class TValue>
575
- void BlockIter<TValue>::CorruptionError() {
576
- current_ = restarts_;
577
- restart_index_ = num_restarts_;
578
- status_ = Status::Corruption("bad entry in block");
579
- raw_key_.Clear();
580
- value_.clear();
581
- }
582
-
583
615
  template <class TValue>
584
616
  template <typename DecodeEntryFunc>
585
617
  bool BlockIter<TValue>::ParseNextKey(bool* is_shared) {
@@ -666,12 +698,12 @@ bool IndexBlockIter::ParseNextIndexKey() {
666
698
  // restart_point 1: k, v (off, sz), k, v (delta-sz), ..., k, v (delta-sz)
667
699
  // ...
668
700
  // restart_point n-1: k, v (off, sz), k, v (delta-sz), ..., k, v (delta-sz)
669
- // where, k is key, v is value, and its encoding is in parenthesis.
701
+ // where, k is key, v is value, and its encoding is in parentheses.
670
702
  // The format of each key is (shared_size, non_shared_size, shared, non_shared)
671
703
  // The format of each value, i.e., block handle, is (offset, size) whenever the
672
704
  // is_shared is false, which included the first entry in each restart point.
673
- // Otherwise the format is delta-size = block handle size - size of last block
674
- // handle.
705
+ // Otherwise, the format is delta-size = the size of current block - the size o
706
+ // last block.
675
707
  void IndexBlockIter::DecodeCurrentValue(bool is_shared) {
676
708
  Slice v(value_.data(), data_ + restarts_ - value_.data());
677
709
  // Delta encoding is used if `shared` != 0.
@@ -710,6 +742,7 @@ void BlockIter<TValue>::FindKeyAfterBinarySeek(const Slice& target,
710
742
  // to follow it up with NextImpl() to position the iterator at the restart
711
743
  // key.
712
744
  SeekToRestartPoint(index);
745
+ cur_entry_idx_ = static_cast<int32_t>(index * block_restart_interval_) - 1;
713
746
  NextImpl();
714
747
 
715
748
  if (!skip_linear_scan) {
@@ -728,6 +761,8 @@ void BlockIter<TValue>::FindKeyAfterBinarySeek(const Slice& target,
728
761
  while (true) {
729
762
  NextImpl();
730
763
  if (!Valid()) {
764
+ // TODO(cbi): per key-value checksum will not be verified in UpdateKey()
765
+ // since Valid() will returns false.
731
766
  break;
732
767
  }
733
768
  if (current_ == max_offset) {
@@ -976,6 +1011,7 @@ Block::~Block() {
976
1011
  // This sync point can be re-enabled if RocksDB can control the
977
1012
  // initialization order of any/all static options created by the user.
978
1013
  // TEST_SYNC_POINT("Block::~Block");
1014
+ delete[] kv_checksum_;
979
1015
  }
980
1016
 
981
1017
  Block::Block(BlockContents&& contents, size_t read_amp_bytes_per_bit,
@@ -1035,6 +1071,126 @@ Block::Block(BlockContents&& contents, size_t read_amp_bytes_per_bit,
1035
1071
  }
1036
1072
  }
1037
1073
 
1074
+ void Block::InitializeDataBlockProtectionInfo(uint8_t protection_bytes_per_key,
1075
+ const Comparator* raw_ucmp) {
1076
+ protection_bytes_per_key_ = 0;
1077
+ if (protection_bytes_per_key > 0 && num_restarts_ > 0) {
1078
+ // NewDataIterator() is called with protection_bytes_per_key_ = 0.
1079
+ // This is intended since checksum is not constructed yet.
1080
+ //
1081
+ // We do not know global_seqno yet, so checksum computation and
1082
+ // verification all assume global_seqno = 0.
1083
+ std::unique_ptr<DataBlockIter> iter{NewDataIterator(
1084
+ raw_ucmp, kDisableGlobalSequenceNumber, nullptr /* iter */,
1085
+ nullptr /* stats */, true /* block_contents_pinned */)};
1086
+ if (iter->status().ok()) {
1087
+ block_restart_interval_ = iter->GetRestartInterval();
1088
+ }
1089
+ uint32_t num_keys = 0;
1090
+ if (iter->status().ok()) {
1091
+ num_keys = iter->NumberOfKeys(block_restart_interval_);
1092
+ }
1093
+ if (iter->status().ok()) {
1094
+ checksum_size_ = num_keys * protection_bytes_per_key;
1095
+ kv_checksum_ = new char[(size_t)checksum_size_];
1096
+ size_t i = 0;
1097
+ iter->SeekToFirst();
1098
+ while (iter->Valid()) {
1099
+ GenerateKVChecksum(kv_checksum_ + i, protection_bytes_per_key,
1100
+ iter->key(), iter->value());
1101
+ iter->Next();
1102
+ i += protection_bytes_per_key;
1103
+ }
1104
+ assert(!iter->status().ok() || i == num_keys * protection_bytes_per_key);
1105
+ }
1106
+ if (!iter->status().ok()) {
1107
+ size_ = 0; // Error marker
1108
+ return;
1109
+ }
1110
+ protection_bytes_per_key_ = protection_bytes_per_key;
1111
+ }
1112
+ }
1113
+
1114
+ void Block::InitializeIndexBlockProtectionInfo(uint8_t protection_bytes_per_key,
1115
+ const Comparator* raw_ucmp,
1116
+ bool value_is_full,
1117
+ bool index_has_first_key) {
1118
+ protection_bytes_per_key_ = 0;
1119
+ if (num_restarts_ > 0 && protection_bytes_per_key > 0) {
1120
+ // Note that `global_seqno` and `key_includes_seq` are hardcoded here. They
1121
+ // do not impact how the index block is parsed. During checksum
1122
+ // construction/verification, we use the entire key buffer from
1123
+ // raw_key_.GetKey() returned by iter->key() as the `key` part of key-value
1124
+ // checksum, and the content of this buffer do not change for different
1125
+ // values of `global_seqno` or `key_includes_seq`.
1126
+ std::unique_ptr<IndexBlockIter> iter{NewIndexIterator(
1127
+ raw_ucmp, kDisableGlobalSequenceNumber /* global_seqno */, nullptr,
1128
+ nullptr /* Statistics */, true /* total_order_seek */,
1129
+ index_has_first_key /* have_first_key */, false /* key_includes_seq */,
1130
+ value_is_full, true /* block_contents_pinned */,
1131
+ nullptr /* prefix_index */)};
1132
+ if (iter->status().ok()) {
1133
+ block_restart_interval_ = iter->GetRestartInterval();
1134
+ }
1135
+ uint32_t num_keys = 0;
1136
+ if (iter->status().ok()) {
1137
+ num_keys = iter->NumberOfKeys(block_restart_interval_);
1138
+ }
1139
+ if (iter->status().ok()) {
1140
+ checksum_size_ = num_keys * protection_bytes_per_key;
1141
+ kv_checksum_ = new char[(size_t)checksum_size_];
1142
+ iter->SeekToFirst();
1143
+ size_t i = 0;
1144
+ while (iter->Valid()) {
1145
+ GenerateKVChecksum(kv_checksum_ + i, protection_bytes_per_key,
1146
+ iter->key(), iter->raw_value());
1147
+ iter->Next();
1148
+ i += protection_bytes_per_key;
1149
+ }
1150
+ assert(!iter->status().ok() || i == num_keys * protection_bytes_per_key);
1151
+ }
1152
+ if (!iter->status().ok()) {
1153
+ size_ = 0; // Error marker
1154
+ return;
1155
+ }
1156
+ protection_bytes_per_key_ = protection_bytes_per_key;
1157
+ }
1158
+ }
1159
+
1160
+ void Block::InitializeMetaIndexBlockProtectionInfo(
1161
+ uint8_t protection_bytes_per_key) {
1162
+ protection_bytes_per_key_ = 0;
1163
+ if (num_restarts_ > 0 && protection_bytes_per_key > 0) {
1164
+ std::unique_ptr<MetaBlockIter> iter{
1165
+ NewMetaIterator(true /* block_contents_pinned */)};
1166
+ if (iter->status().ok()) {
1167
+ block_restart_interval_ = iter->GetRestartInterval();
1168
+ }
1169
+ uint32_t num_keys = 0;
1170
+ if (iter->status().ok()) {
1171
+ num_keys = iter->NumberOfKeys(block_restart_interval_);
1172
+ }
1173
+ if (iter->status().ok()) {
1174
+ checksum_size_ = num_keys * protection_bytes_per_key;
1175
+ kv_checksum_ = new char[(size_t)checksum_size_];
1176
+ iter->SeekToFirst();
1177
+ size_t i = 0;
1178
+ while (iter->Valid()) {
1179
+ GenerateKVChecksum(kv_checksum_ + i, protection_bytes_per_key,
1180
+ iter->key(), iter->value());
1181
+ iter->Next();
1182
+ i += protection_bytes_per_key;
1183
+ }
1184
+ assert(!iter->status().ok() || i == num_keys * protection_bytes_per_key);
1185
+ }
1186
+ if (!iter->status().ok()) {
1187
+ size_ = 0; // Error marker
1188
+ return;
1189
+ }
1190
+ protection_bytes_per_key_ = protection_bytes_per_key;
1191
+ }
1192
+ }
1193
+
1038
1194
  MetaBlockIter* Block::NewMetaIterator(bool block_contents_pinned) {
1039
1195
  MetaBlockIter* iter = new MetaBlockIter();
1040
1196
  if (size_ < 2 * sizeof(uint32_t)) {
@@ -1045,7 +1201,8 @@ MetaBlockIter* Block::NewMetaIterator(bool block_contents_pinned) {
1045
1201
  iter->Invalidate(Status::OK());
1046
1202
  } else {
1047
1203
  iter->Initialize(data_, restart_offset_, num_restarts_,
1048
- block_contents_pinned);
1204
+ block_contents_pinned, protection_bytes_per_key_,
1205
+ kv_checksum_, block_restart_interval_);
1049
1206
  }
1050
1207
  return iter;
1051
1208
  }
@@ -1072,7 +1229,8 @@ DataBlockIter* Block::NewDataIterator(const Comparator* raw_ucmp,
1072
1229
  ret_iter->Initialize(
1073
1230
  raw_ucmp, data_, restart_offset_, num_restarts_, global_seqno,
1074
1231
  read_amp_bitmap_.get(), block_contents_pinned,
1075
- data_block_hash_index_.Valid() ? &data_block_hash_index_ : nullptr);
1232
+ data_block_hash_index_.Valid() ? &data_block_hash_index_ : nullptr,
1233
+ protection_bytes_per_key_, kv_checksum_, block_restart_interval_);
1076
1234
  if (read_amp_bitmap_) {
1077
1235
  if (read_amp_bitmap_->GetStatistics() != stats) {
1078
1236
  // DB changed the Statistics pointer, we need to notify read_amp_bitmap_
@@ -1108,8 +1266,9 @@ IndexBlockIter* Block::NewIndexIterator(
1108
1266
  total_order_seek ? nullptr : prefix_index;
1109
1267
  ret_iter->Initialize(raw_ucmp, data_, restart_offset_, num_restarts_,
1110
1268
  global_seqno, prefix_index_ptr, have_first_key,
1111
- key_includes_seq, value_is_full,
1112
- block_contents_pinned);
1269
+ key_includes_seq, value_is_full, block_contents_pinned,
1270
+ protection_bytes_per_key_, kv_checksum_,
1271
+ block_restart_interval_);
1113
1272
  }
1114
1273
 
1115
1274
  return ret_iter;
@@ -1125,6 +1284,7 @@ size_t Block::ApproximateMemoryUsage() const {
1125
1284
  if (read_amp_bitmap_) {
1126
1285
  usage += read_amp_bitmap_->ApproximateMemoryUsage();
1127
1286
  }
1287
+ usage += checksum_size_;
1128
1288
  return usage;
1129
1289
  }
1130
1290