@nxtedition/rocksdb 15.4.0 → 15.5.0

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 (402) hide show
  1. package/binding.cc +24 -19
  2. package/cache.js +1 -1
  3. package/chained-batch.js +12 -3
  4. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  5. package/deps/rocksdb/rocksdb/BUCK +42 -0
  6. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  7. package/deps/rocksdb/rocksdb/Makefile +59 -32
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  9. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  10. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  11. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  12. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  13. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  19. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  25. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  26. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  28. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  29. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  31. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  32. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  33. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  34. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  53. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  54. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  55. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  57. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  58. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  59. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  60. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  61. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  62. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  63. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  64. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  65. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  66. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  67. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  68. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  81. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  82. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  83. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  84. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  85. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  86. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  87. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  88. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  89. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  91. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  92. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  93. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  94. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  95. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  96. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  97. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  98. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  99. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  100. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  101. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  102. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  103. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  104. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  105. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  106. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  107. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  110. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  111. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  112. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  113. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  114. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  115. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  116. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  117. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  118. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  119. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  121. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  122. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  123. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  124. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  125. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  126. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  127. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  128. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  129. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  130. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  131. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  132. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  133. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  134. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  135. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  136. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  137. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  138. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  139. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  140. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  141. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  142. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  143. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  144. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  145. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  146. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  147. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  148. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  150. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  151. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  152. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  153. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  160. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  161. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  162. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  163. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  164. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  165. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  166. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  167. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  168. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  169. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  170. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  171. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  172. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  173. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  174. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  175. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  176. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  177. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  180. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  181. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  182. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  183. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  184. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  185. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  187. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  188. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  189. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  192. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  194. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  195. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  196. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  197. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  198. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  199. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  200. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  202. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  203. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  204. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  205. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  206. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  210. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  211. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  212. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  213. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  214. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  215. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  216. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  217. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  218. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  219. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  220. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  221. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  222. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  223. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  224. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  225. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  226. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  227. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  228. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  229. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  230. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  231. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  232. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  233. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  234. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  235. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  236. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  237. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  238. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  239. package/deps/rocksdb/rocksdb/src.mk +12 -0
  240. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  241. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  242. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  243. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  253. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  254. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  255. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  256. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  257. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  258. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  259. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  260. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  261. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  263. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  264. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  265. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  266. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  267. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  268. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  269. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  270. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  273. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  274. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  275. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  276. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  277. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  278. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  279. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  280. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  281. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  282. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  283. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  284. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  286. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  287. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  288. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  289. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  290. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  291. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  292. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  293. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  294. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  295. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  296. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  297. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  298. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  299. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  300. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  301. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  302. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  303. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  304. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  305. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  306. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  307. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  308. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  309. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  310. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  311. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  312. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  313. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  314. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  315. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  316. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  317. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  318. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  319. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  320. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  321. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  322. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  323. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  324. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  325. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  326. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  327. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  328. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  329. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  331. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  332. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  333. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  334. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  335. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  336. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  337. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  338. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  339. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  340. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  341. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  342. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  343. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  344. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  355. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  356. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  358. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  360. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  361. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  362. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  364. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  365. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  366. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  367. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  368. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  369. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  370. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  371. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  373. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  375. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  376. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  377. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  378. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  380. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  381. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  388. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  389. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  390. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  391. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  392. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  393. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  394. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  395. package/deps/rocksdb/rocksdb.gyp +7 -0
  396. package/index.js +11 -2
  397. package/iterator.js +15 -7
  398. package/package.json +1 -1
  399. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  400. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -16,6 +16,7 @@
16
16
  #include "db/db_test_util.h"
17
17
  #include "port/port.h"
18
18
  #include "port/stack_trace.h"
19
+ #include "rocksdb/io_dispatcher.h"
19
20
  #include "rocksdb/iostats_context.h"
20
21
  #include "rocksdb/perf_context.h"
21
22
  #include "table/block_based/flush_block_policy_impl.h"
@@ -1841,11 +1842,6 @@ class SliceTransformLimitedDomainGeneric : public SliceTransform {
1841
1842
  // prefix will be x????
1842
1843
  return src.size() >= 1;
1843
1844
  }
1844
-
1845
- bool InRange(const Slice& dst) const override {
1846
- // prefix will be x????
1847
- return dst.size() == 1;
1848
- }
1849
1845
  };
1850
1846
 
1851
1847
  TEST_P(DBIteratorTest, IterSeekForPrevCrossingFiles) {
@@ -2573,7 +2569,7 @@ TEST_P(DBIteratorTest, AutoRefreshIterator) {
2573
2569
  ReadOptions read_options;
2574
2570
  std::unique_ptr<ManagedSnapshot> snapshot = nullptr;
2575
2571
  if (explicit_snapshot) {
2576
- snapshot = std::make_unique<ManagedSnapshot>(db_);
2572
+ snapshot = std::make_unique<ManagedSnapshot>(db_.get());
2577
2573
  }
2578
2574
  read_options.snapshot =
2579
2575
  explicit_snapshot ? snapshot->snapshot() : nullptr;
@@ -5027,6 +5023,375 @@ TEST_P(DBMultiScanIteratorTest, AsyncPrefetchWithExternalFileIngestion) {
5027
5023
  ASSERT_EQ(total_keys, 400);
5028
5024
  iter.reset();
5029
5025
  }
5026
+
5027
+ TEST_P(DBMultiScanIteratorTest, IODispatcherStatsVerification) {
5028
+ // Test that verifies all IOs go through the IODispatcher by checking stats
5029
+ auto options = CurrentOptions();
5030
+ options.target_file_size_base = 1 << 15; // 32KiB
5031
+ options.compaction_style = kCompactionStyleUniversal;
5032
+ options.num_levels = 50;
5033
+ options.compression = kNoCompression;
5034
+ DestroyAndReopen(options);
5035
+
5036
+ Random rnd(307);
5037
+
5038
+ // Create data - enough to create multiple data blocks
5039
+ for (int i = 0; i < 500; ++i) {
5040
+ std::stringstream ss;
5041
+ ss << "k" << std::setw(5) << std::setfill('0') << i;
5042
+ ASSERT_OK(Put(ss.str(), rnd.RandomString(1 << 10))); // 1KiB values
5043
+ }
5044
+ ASSERT_OK(Flush());
5045
+ ASSERT_OK(db_->CompactRange({}, nullptr, nullptr));
5046
+
5047
+ // Set up scan ranges
5048
+ std::vector<std::string> key_ranges({"k00000", "k00200", "k00300", "k00400"});
5049
+ ReadOptions ro;
5050
+ ro.fill_cache = GetParam();
5051
+
5052
+ ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
5053
+
5054
+ // Create a tracking IODispatcher to verify IO statistics
5055
+ auto tracking_dispatcher = std::make_shared<TrackingIODispatcher>();
5056
+
5057
+ MultiScanArgs scan_options(BytewiseComparator());
5058
+ scan_options.use_async_io = false; // Use sync IO for predictable stats
5059
+ scan_options.io_dispatcher = tracking_dispatcher;
5060
+ scan_options.insert(key_ranges[0], key_ranges[1]);
5061
+ scan_options.insert(key_ranges[2], key_ranges[3]);
5062
+
5063
+ std::unique_ptr<MultiScan> iter =
5064
+ dbfull()->NewMultiScan(ro, cfh, scan_options);
5065
+ ASSERT_NE(iter, nullptr);
5066
+
5067
+ // Scan through all data
5068
+ int total_keys = 0;
5069
+ try {
5070
+ for (auto range : *iter) {
5071
+ for (auto it : range) {
5072
+ it.first.ToString();
5073
+ total_keys++;
5074
+ }
5075
+ }
5076
+ } catch (MultiScanException& ex) {
5077
+ ASSERT_NOK(ex.status());
5078
+ std::cerr << "Iterator returned status " << ex.what();
5079
+ abort();
5080
+ } catch (std::logic_error& ex) {
5081
+ std::cerr << "Iterator returned logic error " << ex.what();
5082
+ abort();
5083
+ }
5084
+
5085
+ // We scanned ~200 keys in range 1 and ~100 keys in range 2
5086
+ ASSERT_EQ(total_keys, 300);
5087
+
5088
+ // Verify that IO operations went through the IODispatcher
5089
+ // The total IO operations should be > 0 (either sync reads, async reads, or
5090
+ // cache hits)
5091
+ uint64_t total_ops = tracking_dispatcher->GetTotalIOOperations();
5092
+ ASSERT_GT(total_ops, 0) << "Expected some IO operations through IODispatcher";
5093
+
5094
+ // Verify that we have at least one ReadSet created
5095
+ ASSERT_GT(tracking_dispatcher->GetReadSets().size(), 0)
5096
+ << "Expected at least one ReadSet to be created";
5097
+
5098
+ // Since we used sync IO, we should have sync reads (or cache hits if cached)
5099
+ uint64_t sync_reads = tracking_dispatcher->GetTotalSyncReads();
5100
+ uint64_t cache_hits = tracking_dispatcher->GetTotalCacheHits();
5101
+ ASSERT_GT(sync_reads + cache_hits, 0)
5102
+ << "Expected sync reads or cache hits for sync IO mode";
5103
+
5104
+ iter.reset();
5105
+ }
5106
+
5107
+ TEST_P(DBMultiScanIteratorTest, IODispatcherPrefetchKnownBlocks) {
5108
+ // Test that verifies we prefetch a known/expected number of blocks.
5109
+ // Uses FlushBlockEveryKeyPolicyFactory to create exactly one block per key,
5110
+ // making the block count predictable and verifiable.
5111
+ auto options = CurrentOptions();
5112
+ options.compression = kNoCompression;
5113
+ options.disable_auto_compactions = true;
5114
+
5115
+ // Configure to create exactly one block per key
5116
+ BlockBasedTableOptions table_options;
5117
+ table_options.flush_block_policy_factory =
5118
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5119
+ // Use a block cache (required by IODispatcher), but use a fresh one
5120
+ // that won't have any cached data
5121
+ table_options.block_cache = NewLRUCache(10 * 1024 * 1024); // 10MB cache
5122
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5123
+ DestroyAndReopen(options);
5124
+
5125
+ // Create exactly 100 keys, each in its own block
5126
+ const int kNumKeys = 100;
5127
+ const int kValueSize = 100; // Fixed value size for predictability
5128
+ std::string value(kValueSize, 'v');
5129
+
5130
+ for (int i = 0; i < kNumKeys; ++i) {
5131
+ std::stringstream ss;
5132
+ ss << "k" << std::setw(3) << std::setfill('0') << i;
5133
+ ASSERT_OK(Put(ss.str(), value));
5134
+ }
5135
+ ASSERT_OK(Flush());
5136
+
5137
+ ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
5138
+
5139
+ // Create a tracking IODispatcher to verify IO statistics
5140
+ auto tracking_dispatcher = std::make_shared<TrackingIODispatcher>();
5141
+
5142
+ // Define scan ranges with known block counts:
5143
+ // Range 1: k000 to k020 (20 keys = 20 blocks)
5144
+ // Range 2: k050 to k060 (10 keys = 10 blocks)
5145
+ // Total expected blocks to read: 30
5146
+ MultiScanArgs scan_options(BytewiseComparator());
5147
+ scan_options.use_async_io = false; // Use sync IO for predictable stats
5148
+ scan_options.io_dispatcher = tracking_dispatcher;
5149
+ scan_options.insert("k000", "k020");
5150
+ scan_options.insert("k050", "k060");
5151
+
5152
+ ReadOptions ro;
5153
+ ro.fill_cache = false; // Don't fill cache, ensure fresh reads
5154
+
5155
+ std::unique_ptr<MultiScan> iter =
5156
+ dbfull()->NewMultiScan(ro, cfh, scan_options);
5157
+ ASSERT_NE(iter, nullptr);
5158
+
5159
+ // Scan through all data and count keys
5160
+ int total_keys = 0;
5161
+ try {
5162
+ for (auto range : *iter) {
5163
+ for (auto it : range) {
5164
+ it.first.ToString();
5165
+ total_keys++;
5166
+ }
5167
+ }
5168
+ } catch (MultiScanException& ex) {
5169
+ ASSERT_NOK(ex.status());
5170
+ std::cerr << "Iterator returned status " << ex.what();
5171
+ abort();
5172
+ } catch (std::logic_error& ex) {
5173
+ std::cerr << "Iterator returned logic error " << ex.what();
5174
+ abort();
5175
+ }
5176
+
5177
+ // Verify we scanned the expected number of keys
5178
+ // Range 1: k000-k019 = 20 keys, Range 2: k050-k059 = 10 keys
5179
+ ASSERT_EQ(total_keys, 30) << "Expected 30 keys from two ranges";
5180
+
5181
+ // Verify IODispatcher statistics
5182
+ uint64_t total_ops = tracking_dispatcher->GetTotalIOOperations();
5183
+ uint64_t sync_reads = tracking_dispatcher->GetTotalSyncReads();
5184
+
5185
+ // We should have at least as many IO operations as blocks we need to read
5186
+ // (could be more due to index/filter blocks)
5187
+ ASSERT_GE(total_ops, 30)
5188
+ << "Expected at least 30 IO operations for 30 data blocks";
5189
+
5190
+ // Since cache is fresh and fill_cache=false, all should be sync reads
5191
+ ASSERT_GE(sync_reads, 30)
5192
+ << "Expected at least 30 sync reads for 30 data blocks";
5193
+
5194
+ // Verify we created ReadSets (one per range)
5195
+ size_t num_readsets = tracking_dispatcher->GetReadSets().size();
5196
+ ASSERT_GE(num_readsets, 1) << "Expected at least one ReadSet";
5197
+
5198
+ // Log the stats for debugging
5199
+ std::cout << "IODispatcher Stats: total_ops=" << total_ops
5200
+ << ", sync_reads=" << sync_reads
5201
+ << ", async_reads=" << tracking_dispatcher->GetTotalAsyncReads()
5202
+ << ", cache_hits=" << tracking_dispatcher->GetTotalCacheHits()
5203
+ << ", readsets=" << num_readsets << std::endl;
5204
+
5205
+ iter.reset();
5206
+ }
5207
+
5208
+ TEST_P(DBMultiScanIteratorTest, IODispatcherCacheHitVerification) {
5209
+ // Test that verifies cache hits are properly tracked through IODispatcher.
5210
+ // First scan populates cache, second scan should show cache hits.
5211
+ auto options = CurrentOptions();
5212
+ options.compression = kNoCompression;
5213
+ options.disable_auto_compactions = true;
5214
+
5215
+ BlockBasedTableOptions table_options;
5216
+ table_options.flush_block_policy_factory =
5217
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5218
+ // Enable block cache with enough space for all blocks
5219
+ table_options.block_cache = NewLRUCache(10 * 1024 * 1024); // 10MB cache
5220
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5221
+ DestroyAndReopen(options);
5222
+
5223
+ // Create 50 keys, each in its own block
5224
+ const int kNumKeys = 50;
5225
+ std::string value(100, 'v');
5226
+
5227
+ for (int i = 0; i < kNumKeys; ++i) {
5228
+ std::stringstream ss;
5229
+ ss << "k" << std::setw(3) << std::setfill('0') << i;
5230
+ ASSERT_OK(Put(ss.str(), value));
5231
+ }
5232
+ ASSERT_OK(Flush());
5233
+
5234
+ ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
5235
+
5236
+ // First scan: populate the cache
5237
+ {
5238
+ auto dispatcher1 = std::make_shared<TrackingIODispatcher>();
5239
+ MultiScanArgs scan_options(BytewiseComparator());
5240
+ scan_options.use_async_io = false;
5241
+ scan_options.io_dispatcher = dispatcher1;
5242
+ scan_options.insert("k000", "k025"); // 25 keys
5243
+
5244
+ ReadOptions ro;
5245
+ ro.fill_cache = true; // Fill cache on first scan
5246
+
5247
+ std::unique_ptr<MultiScan> iter =
5248
+ dbfull()->NewMultiScan(ro, cfh, scan_options);
5249
+ ASSERT_NE(iter, nullptr);
5250
+
5251
+ int count = 0;
5252
+ try {
5253
+ for (auto range : *iter) {
5254
+ for (auto it : range) {
5255
+ it.first.ToString();
5256
+ count++;
5257
+ }
5258
+ }
5259
+ } catch (MultiScanException& ex) {
5260
+ FAIL() << "First scan failed: " << ex.what();
5261
+ }
5262
+ ASSERT_EQ(count, 25);
5263
+
5264
+ // First scan should have sync reads (cache was empty)
5265
+ uint64_t first_sync = dispatcher1->GetTotalSyncReads();
5266
+ ASSERT_GE(first_sync, 25) << "First scan should have sync reads";
5267
+
5268
+ std::cout << "First scan stats: sync_reads=" << first_sync
5269
+ << ", cache_hits=" << dispatcher1->GetTotalCacheHits()
5270
+ << std::endl;
5271
+ }
5272
+
5273
+ // Second scan: should get cache hits
5274
+ {
5275
+ auto dispatcher2 = std::make_shared<TrackingIODispatcher>();
5276
+ MultiScanArgs scan_options(BytewiseComparator());
5277
+ scan_options.use_async_io = false;
5278
+ scan_options.io_dispatcher = dispatcher2;
5279
+ scan_options.insert("k000", "k025"); // Same range as before
5280
+
5281
+ ReadOptions ro;
5282
+ ro.fill_cache = true;
5283
+
5284
+ std::unique_ptr<MultiScan> iter =
5285
+ dbfull()->NewMultiScan(ro, cfh, scan_options);
5286
+ ASSERT_NE(iter, nullptr);
5287
+
5288
+ int count = 0;
5289
+ try {
5290
+ for (auto range : *iter) {
5291
+ for (auto it : range) {
5292
+ it.first.ToString();
5293
+ count++;
5294
+ }
5295
+ }
5296
+ } catch (MultiScanException& ex) {
5297
+ FAIL() << "Second scan failed: " << ex.what();
5298
+ }
5299
+ ASSERT_EQ(count, 25);
5300
+
5301
+ // Second scan should have cache hits (blocks were cached in first scan)
5302
+ uint64_t second_cache_hits = dispatcher2->GetTotalCacheHits();
5303
+ uint64_t second_sync = dispatcher2->GetTotalSyncReads();
5304
+
5305
+ std::cout << "Second scan stats: sync_reads=" << second_sync
5306
+ << ", cache_hits=" << second_cache_hits << std::endl;
5307
+
5308
+ // We expect cache hits on the second scan for data blocks
5309
+ // Note: Some blocks might still need sync reads (e.g., if cache was
5310
+ // evicted)
5311
+ ASSERT_GE(second_cache_hits, 20)
5312
+ << "Second scan should have cache hits for most blocks";
5313
+ }
5314
+ }
5315
+
5316
+ TEST_P(DBMultiScanIteratorTest, WastedBlocksTracking) {
5317
+ // Test that verifies wasted prefetch blocks are properly tracked.
5318
+ // When blocks are prefetched but skipped (e.g., due to seek), they should
5319
+ // be counted as wasted and recorded to MULTISCAN_PREFETCH_BLOCKS_WASTED.
5320
+ auto options = CurrentOptions();
5321
+ options.compression = kNoCompression;
5322
+ options.disable_auto_compactions = true;
5323
+ options.statistics = CreateDBStatistics();
5324
+
5325
+ BlockBasedTableOptions table_options;
5326
+ table_options.flush_block_policy_factory =
5327
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5328
+ table_options.block_cache = NewLRUCache(10 * 1024 * 1024); // 10MB cache
5329
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5330
+ DestroyAndReopen(options);
5331
+
5332
+ // Create 100 keys, each in its own block
5333
+ const int kNumKeys = 100;
5334
+ std::string value(100, 'v');
5335
+
5336
+ for (int i = 0; i < kNumKeys; ++i) {
5337
+ std::stringstream ss;
5338
+ ss << "k" << std::setw(3) << std::setfill('0') << i;
5339
+ ASSERT_OK(Put(ss.str(), value));
5340
+ }
5341
+ ASSERT_OK(Flush());
5342
+ ASSERT_OK(db_->CompactRange({}, nullptr, nullptr));
5343
+
5344
+ ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
5345
+
5346
+ // Reset the wasted blocks counter before test
5347
+ options.statistics->setTickerCount(MULTISCAN_PREFETCH_BLOCKS_WASTED, 0);
5348
+
5349
+ // Set up MultiScan with two non-contiguous ranges:
5350
+ // Range 1: k000-k020 (20 keys/blocks)
5351
+ // Range 2: k050-k070 (20 keys/blocks)
5352
+ // The blocks between k020-k050 (30 blocks) should be wasted if prefetched
5353
+ MultiScanArgs scan_options(BytewiseComparator());
5354
+ scan_options.use_async_io = false;
5355
+ scan_options.insert("k000", "k020");
5356
+ scan_options.insert("k050", "k070");
5357
+
5358
+ ReadOptions ro;
5359
+ ro.fill_cache = GetParam();
5360
+
5361
+ {
5362
+ std::unique_ptr<MultiScan> iter =
5363
+ dbfull()->NewMultiScan(ro, cfh, scan_options);
5364
+ ASSERT_NE(iter, nullptr);
5365
+
5366
+ int count = 0;
5367
+ try {
5368
+ for (auto range : *iter) {
5369
+ for (auto it : range) {
5370
+ it.first.ToString();
5371
+ count++;
5372
+ }
5373
+ }
5374
+ } catch (MultiScanException& ex) {
5375
+ FAIL() << "Scan failed: " << ex.what();
5376
+ }
5377
+
5378
+ // We should have scanned 40 keys total (20 + 20)
5379
+ ASSERT_EQ(count, 40);
5380
+ } // Iterator destroyed here, wasted blocks recorded
5381
+
5382
+ // Check that wasted blocks were recorded
5383
+ // The exact count depends on how many blocks were prefetched between ranges
5384
+ uint64_t wasted =
5385
+ options.statistics->getTickerCount(MULTISCAN_PREFETCH_BLOCKS_WASTED);
5386
+
5387
+ // We expect some wasted blocks due to the gap between ranges
5388
+ // The exact number depends on prefetch behavior, but should be > 0
5389
+ // if blocks between k020-k050 were prefetched
5390
+ std::cout << "Wasted blocks: " << wasted << std::endl;
5391
+
5392
+ // Note: The test verifies the tracking mechanism works.
5393
+ // The actual count depends on prefetch heuristics which may vary.
5394
+ }
5030
5395
  } // namespace ROCKSDB_NAMESPACE
5031
5396
 
5032
5397
  int main(int argc, char** argv) {
@@ -180,13 +180,15 @@ TEST_F(DBTestXactLogIterator, TransactionLogIteratorCheckWhenArchive) {
180
180
 
181
181
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
182
182
  ASSERT_OK(dbfull()->Flush(FlushOptions(), cf));
183
+ // Try lots of things to ensure callback is triggered
184
+ ASSERT_OK(dbfull()->TEST_SwitchWAL());
185
+ ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
186
+ ASSERT_OK(dbfull()->TEST_WaitForPurge());
183
187
  delete cf;
184
- // Normally hit several times; WART: perhaps more in parallel after flush
185
- // FIXME: this test is flaky
186
- // ASSERT_TRUE(callback_hit.LoadRelaxed());
188
+ ASSERT_TRUE(callback_hit.LoadRelaxed());
189
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
190
+ Close();
187
191
  } while (ChangeCompactOptions());
188
- Close();
189
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
190
192
  }
191
193
  #endif
192
194
 
@@ -67,7 +67,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenClose) {
67
67
  options.db_paths = {{data_path_0_, 2048}, {data_path_1_, 2048}};
68
68
 
69
69
  for (int i = 0; i < 2; i++) {
70
- DB* db;
70
+ std::unique_ptr<DB> db;
71
71
  if (!i) {
72
72
  printf("Open\n");
73
73
  ASSERT_OK(DB::Open(options, dbname_, &db));
@@ -82,7 +82,6 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenClose) {
82
82
  ASSERT_EQ(1, cache_->GetRefCount(data_path_1_));
83
83
  ASSERT_OK(db->Close());
84
84
  ASSERT_EQ(0, cache_->Size());
85
- delete db;
86
85
  }
87
86
  ASSERT_OK(DestroyDB(dbname_, options, {}));
88
87
  }
@@ -95,7 +94,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenDelete) {
95
94
  options.env = env_.get();
96
95
 
97
96
  for (int i = 0; i < 2; i++) {
98
- DB* db;
97
+ std::unique_ptr<DB> db;
99
98
  if (!i) {
100
99
  printf("Open\n");
101
100
  ASSERT_OK(DB::Open(options, dbname_, &db));
@@ -106,7 +105,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenDelete) {
106
105
  ASSERT_EQ(1, cache_->Size());
107
106
  ASSERT_TRUE(cache_->Contains(dbname_));
108
107
  ASSERT_EQ(1, cache_->GetRefCount(dbname_));
109
- delete db;
108
+ db.reset();
110
109
  ASSERT_EQ(0, cache_->Size());
111
110
  }
112
111
  ASSERT_OK(DestroyDB(dbname_, options, {}));
@@ -122,7 +121,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, CreateColumnFamily) {
122
121
  ColumnFamilyOptions cf_options;
123
122
  cf_options.cf_paths = {{cf_path_0_, 1024}, {cf_path_1_, 2048}};
124
123
 
125
- DB* db;
124
+ std::unique_ptr<DB> db;
126
125
  ASSERT_OK(DB::Open(options, dbname_, &db));
127
126
  ASSERT_EQ(1, cache_->Size());
128
127
  ASSERT_TRUE(cache_->Contains(dbname_));
@@ -153,7 +152,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, CreateColumnFamily) {
153
152
  ASSERT_TRUE(cache_->Contains(dbname_));
154
153
  ASSERT_EQ(1, cache_->GetRefCount(dbname_));
155
154
 
156
- delete db;
155
+ db.reset();
157
156
  ASSERT_EQ(0, cache_->Size());
158
157
  ASSERT_OK(DestroyDB(dbname_, options, {{"cf", cf_options}}));
159
158
  }
@@ -173,7 +172,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, CreateColumnFamilies) {
173
172
  ColumnFamilyOptions cf_options;
174
173
  cf_options.cf_paths = {{cf_path_0_, 1024}};
175
174
 
176
- DB* db;
175
+ std::unique_ptr<DB> db;
177
176
  ASSERT_OK(DB::Open(options, dbname_, &db));
178
177
  ASSERT_EQ(1, cache_->Size());
179
178
  ASSERT_TRUE(cache_->Contains(dbname_));
@@ -211,7 +210,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, CreateColumnFamilies) {
211
210
  ASSERT_OK(db->DestroyColumnFamilyHandle(cfs[1]));
212
211
  ASSERT_TRUE(cache_->Contains(dbname_));
213
212
  ASSERT_EQ(1, cache_->GetRefCount(dbname_));
214
- delete db;
213
+ db.reset();
215
214
 
216
215
  // Now cf_path_0_ in cache_ has been properly decreased and cf_path_0_'s entry
217
216
  // is dropped from cache
@@ -233,15 +232,15 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenWithColumnFamilies) {
233
232
  cf_options.cf_paths = {{cf_path_0_, 1024}};
234
233
 
235
234
  for (int i = 0; i < 2; i++) {
236
- DB* db;
235
+ std::unique_ptr<DB> db;
236
+ ASSERT_OK(DB::Open(options, dbname_, &db));
237
237
  ColumnFamilyHandle* cf1 = nullptr;
238
238
  ColumnFamilyHandle* cf2 = nullptr;
239
- ASSERT_OK(DB::Open(options, dbname_, &db));
240
239
  ASSERT_OK(db->CreateColumnFamily(cf_options, "cf1", &cf1));
241
240
  ASSERT_OK(db->CreateColumnFamily(cf_options, "cf2", &cf2));
242
241
  ASSERT_OK(db->DestroyColumnFamilyHandle(cf1));
243
242
  ASSERT_OK(db->DestroyColumnFamilyHandle(cf2));
244
- delete db;
243
+ db.reset();
245
244
  ASSERT_EQ(0, cache_->Size());
246
245
 
247
246
  std::vector<ColumnFamilyHandle*> cfs;
@@ -298,7 +297,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, OpenWithColumnFamilies) {
298
297
  ASSERT_TRUE(cache_->Contains(dbname_));
299
298
  ASSERT_EQ(1, cache_->GetRefCount(dbname_));
300
299
 
301
- delete db;
300
+ db.reset();
302
301
  ASSERT_EQ(0, cache_->Size());
303
302
  }
304
303
  ASSERT_OK(
@@ -315,7 +314,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, DestroyColumnFamilyHandle) {
315
314
  ColumnFamilyOptions cf_options;
316
315
  cf_options.cf_paths = {{cf_path_0_, 1024}};
317
316
 
318
- DB* db;
317
+ std::unique_ptr<DB> db;
319
318
  ASSERT_OK(DB::Open(options, dbname_, &db));
320
319
  ASSERT_EQ(1, cache_->Size());
321
320
  ASSERT_TRUE(cache_->Contains(dbname_));
@@ -336,7 +335,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, DestroyColumnFamilyHandle) {
336
335
  ASSERT_TRUE(cache_->Contains(cf_path_0_));
337
336
  ASSERT_EQ(1, cache_->GetRefCount(cf_path_0_));
338
337
 
339
- delete db;
338
+ db.reset();
340
339
  ASSERT_EQ(0, cache_->Size());
341
340
 
342
341
  // Open with column families.
@@ -369,7 +368,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, DestroyColumnFamilyHandle) {
369
368
  ASSERT_TRUE(cache_->Contains(cf_path_0_));
370
369
  ASSERT_EQ(1, cache_->GetRefCount(cf_path_0_));
371
370
 
372
- delete db;
371
+ db.reset();
373
372
  ASSERT_EQ(0, cache_->Size());
374
373
  }
375
374
  ASSERT_OK(DestroyDB(dbname_, options, {{"cf", cf_options}}));
@@ -384,7 +383,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithDifferentPaths) {
384
383
 
385
384
  ASSERT_OK(env_->CreateDirIfMissing(dbname_));
386
385
 
387
- DB* db0;
386
+ std::unique_ptr<DB> db0;
388
387
  ASSERT_OK(DB::Open(options, data_path_0_, &db0));
389
388
  ASSERT_EQ(1, cache_->Size());
390
389
  ASSERT_TRUE(cache_->Contains(data_path_0_));
@@ -399,7 +398,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithDifferentPaths) {
399
398
  ASSERT_TRUE(cache_->Contains(cf_path_0_));
400
399
  ASSERT_EQ(1, cache_->GetRefCount(cf_path_0_));
401
400
 
402
- DB* db1;
401
+ std::unique_ptr<DB> db1;
403
402
  ASSERT_OK(DB::Open(options, data_path_1_, &db1));
404
403
  ASSERT_EQ(3, cache_->Size());
405
404
  ASSERT_TRUE(cache_->Contains(data_path_0_));
@@ -424,7 +423,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithDifferentPaths) {
424
423
  ASSERT_EQ(1, cache_->GetRefCount(cf_path_1_));
425
424
 
426
425
  ASSERT_OK(db0->DestroyColumnFamilyHandle(cf0));
427
- delete db0;
426
+ db0.reset();
428
427
  ASSERT_EQ(2, cache_->Size());
429
428
  ASSERT_TRUE(cache_->Contains(data_path_1_));
430
429
  ASSERT_EQ(1, cache_->GetRefCount(data_path_1_));
@@ -433,7 +432,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithDifferentPaths) {
433
432
  ASSERT_OK(DestroyDB(data_path_0_, options, {{"cf", cf_options0}}));
434
433
 
435
434
  ASSERT_OK(db1->DestroyColumnFamilyHandle(cf1));
436
- delete db1;
435
+ db1.reset();
437
436
  ASSERT_EQ(0, cache_->Size());
438
437
  ASSERT_OK(DestroyDB(data_path_1_, options, {{"cf", cf_options1}}));
439
438
  }
@@ -450,7 +449,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithSamePaths) {
450
449
 
451
450
  ASSERT_OK(env_->CreateDirIfMissing(dbname_));
452
451
 
453
- DB* db0;
452
+ std::unique_ptr<DB> db0;
454
453
  ASSERT_OK(DB::Open(options, dbname_ + "/db0", &db0));
455
454
  ASSERT_EQ(1, cache_->Size());
456
455
  ASSERT_TRUE(cache_->Contains(data_path_0_));
@@ -464,7 +463,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithSamePaths) {
464
463
  ASSERT_TRUE(cache_->Contains(cf_path_0_));
465
464
  ASSERT_EQ(1, cache_->GetRefCount(cf_path_0_));
466
465
 
467
- DB* db1;
466
+ std::unique_ptr<DB> db1;
468
467
  ASSERT_OK(DB::Open(options, dbname_ + "/db1", &db1));
469
468
  ASSERT_EQ(2, cache_->Size());
470
469
  ASSERT_TRUE(cache_->Contains(data_path_0_));
@@ -481,7 +480,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithSamePaths) {
481
480
  ASSERT_EQ(2, cache_->GetRefCount(cf_path_0_));
482
481
 
483
482
  ASSERT_OK(db0->DestroyColumnFamilyHandle(cf0));
484
- delete db0;
483
+ db0.reset();
485
484
  ASSERT_EQ(2, cache_->Size());
486
485
  ASSERT_TRUE(cache_->Contains(data_path_0_));
487
486
  ASSERT_EQ(1, cache_->GetRefCount(data_path_0_));
@@ -490,7 +489,7 @@ TEST_F(DBLogicalBlockSizeCacheTest, MultiDBWithSamePaths) {
490
489
  ASSERT_OK(DestroyDB(dbname_ + "/db0", options, {{"cf", cf_options}}));
491
490
 
492
491
  ASSERT_OK(db1->DestroyColumnFamilyHandle(cf1));
493
- delete db1;
492
+ db1.reset();
494
493
  ASSERT_EQ(0, cache_->Size());
495
494
  ASSERT_OK(DestroyDB(dbname_ + "/db1", options, {{"cf", cf_options}}));
496
495
  }
@@ -117,8 +117,6 @@ class TestPrefixExtractor : public SliceTransform {
117
117
  return separator(key) != nullptr;
118
118
  }
119
119
 
120
- bool InRange(const Slice& /*key*/) const override { return false; }
121
-
122
120
  private:
123
121
  const char* separator(const Slice& key) const {
124
122
  return static_cast<const char*>(memchr(key.data(), '_', key.size()));
@@ -386,7 +386,7 @@ TEST_F(DBMergeOperatorTest, MergeOperandThresholdExceeded) {
386
386
  snapshots.reserve(3);
387
387
 
388
388
  for (size_t i = 0; i < keys.size(); ++i) {
389
- snapshots.emplace_back(db_);
389
+ snapshots.emplace_back(db_.get());
390
390
 
391
391
  const std::string suffix = std::to_string(i + 1);
392
392
 
@@ -985,7 +985,7 @@ TEST_F(DBMergeOperatorTest, MaxSuccessiveMergesBaseValues) {
985
985
  // max_successive_merges.
986
986
  constexpr size_t max_key_versions = 8;
987
987
  std::vector<KeyVersion> key_versions;
988
- ASSERT_OK(GetAllKeyVersions(db_, db_->DefaultColumnFamily(), key, key,
988
+ ASSERT_OK(GetAllKeyVersions(db_.get(), db_->DefaultColumnFamily(), key, key,
989
989
  max_key_versions, &key_versions));
990
990
  ASSERT_EQ(key_versions.size(), 2);
991
991
  ASSERT_EQ(key_versions[0].type, kTypeValue);
@@ -1009,7 +1009,7 @@ TEST_F(DBMergeOperatorTest, MaxSuccessiveMergesBaseValues) {
1009
1009
  // max_successive_merges.
1010
1010
  constexpr size_t max_key_versions = 8;
1011
1011
  std::vector<KeyVersion> key_versions;
1012
- ASSERT_OK(GetAllKeyVersions(db_, db_->DefaultColumnFamily(), key, key,
1012
+ ASSERT_OK(GetAllKeyVersions(db_.get(), db_->DefaultColumnFamily(), key, key,
1013
1013
  max_key_versions, &key_versions));
1014
1014
  ASSERT_EQ(key_versions.size(), 3);
1015
1015
  ASSERT_EQ(key_versions[0].type, kTypeValue);
@@ -1038,7 +1038,7 @@ TEST_F(DBMergeOperatorTest, MaxSuccessiveMergesBaseValues) {
1038
1038
  // max_successive_merges.
1039
1039
  constexpr size_t max_key_versions = 8;
1040
1040
  std::vector<KeyVersion> key_versions;
1041
- ASSERT_OK(GetAllKeyVersions(db_, db_->DefaultColumnFamily(), key, key,
1041
+ ASSERT_OK(GetAllKeyVersions(db_.get(), db_->DefaultColumnFamily(), key, key,
1042
1042
  max_key_versions, &key_versions));
1043
1043
  ASSERT_EQ(key_versions.size(), 3);
1044
1044
  ASSERT_EQ(key_versions[0].type, kTypeWideColumnEntity);