@nxtedition/rocksdb 5.2.21 → 5.2.26

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 (909) hide show
  1. package/binding.cc +216 -252
  2. package/binding.gyp +78 -72
  3. package/deps/rocksdb/build_version.cc +70 -4
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  5. package/deps/rocksdb/rocksdb/Makefile +459 -469
  6. package/deps/rocksdb/rocksdb/README.md +4 -4
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  33. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  51. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  60. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  61. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  62. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  63. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  64. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  65. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  67. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  68. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  69. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  71. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  96. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  97. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  98. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  100. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  101. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  102. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  103. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  104. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  105. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  106. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  107. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  108. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  110. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  111. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  112. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  124. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  125. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  126. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  127. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  128. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  129. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  131. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  132. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  133. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  134. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  135. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  136. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  137. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  139. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  140. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  141. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  142. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  143. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  144. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  145. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  146. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  147. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  148. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  149. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  150. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  151. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  152. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  153. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  154. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  155. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  156. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  157. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  158. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  159. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  160. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  161. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  162. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  163. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  164. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  165. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  166. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  167. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  168. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  169. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  171. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  172. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  174. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  175. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  176. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  180. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  182. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  183. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  184. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  185. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  186. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  187. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  188. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  189. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  190. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  191. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  192. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  193. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  194. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  195. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  196. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  197. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  198. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  199. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  200. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  201. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  202. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  203. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  204. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  205. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  206. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  207. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  210. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  212. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  213. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  216. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  217. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  218. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  219. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  220. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  223. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  224. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  226. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  227. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  228. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  229. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  230. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  231. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  233. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  234. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  235. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  236. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  246. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  248. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  249. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  250. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  251. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  252. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  253. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  254. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  255. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  256. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  257. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  258. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  259. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  260. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  261. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  262. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  263. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  266. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  267. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  274. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  280. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  285. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  286. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  287. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  288. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  289. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  290. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  291. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  292. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  293. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  294. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  295. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  296. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  298. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  299. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  300. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  301. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  302. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  303. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  304. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  305. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  306. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  307. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  308. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  309. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  310. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  313. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  315. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  316. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  317. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  318. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  319. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  320. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  321. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  324. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  325. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  326. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  327. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  334. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  335. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  336. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  342. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  343. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  344. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  345. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  346. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  348. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  349. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  350. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  353. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  354. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  357. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  358. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  359. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  360. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  361. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  362. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  364. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  365. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  366. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  367. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  368. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  371. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  378. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  380. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  381. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  383. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  386. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  387. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  407. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  408. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  410. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  412. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  413. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  414. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  415. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  416. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  417. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  418. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  419. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  420. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  421. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  422. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  423. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  424. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  425. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  426. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  427. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  428. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  429. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  430. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  431. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  432. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  433. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  434. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  435. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  436. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  437. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  438. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  439. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  440. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  441. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  442. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  443. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  444. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  445. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  446. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  447. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  448. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  449. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  450. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  451. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  452. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  453. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  454. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  455. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  456. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  457. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  458. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  459. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  460. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  461. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  462. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  463. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  464. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  465. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  466. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  467. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  468. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  469. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  470. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  471. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  472. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  473. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  474. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  475. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  476. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  477. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  478. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  479. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  480. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  481. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  482. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  483. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  484. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  485. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  486. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  487. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  488. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  489. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  490. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  491. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  492. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  493. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  494. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  495. package/deps/rocksdb/rocksdb/python.mk +9 -0
  496. package/deps/rocksdb/rocksdb/src.mk +82 -34
  497. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  498. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  500. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  501. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  502. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  503. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  504. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  505. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  506. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  507. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  508. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  514. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  515. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  516. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  517. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  518. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  519. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  520. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  521. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  522. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  523. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  524. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  525. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  526. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  527. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  529. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  530. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  531. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  532. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  534. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  535. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  536. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  537. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  539. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  540. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  541. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  542. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  543. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  544. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  546. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  547. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  548. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  549. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  550. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  551. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  552. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  553. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  554. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  555. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  556. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  557. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  558. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  559. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  560. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  561. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  562. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  563. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  564. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  565. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  566. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  567. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  568. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  569. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  570. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  571. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  572. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  573. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  574. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  575. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  576. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  577. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  578. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  579. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  580. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  581. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  582. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  586. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  587. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  588. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  589. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  590. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  591. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  592. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  593. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  594. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  595. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  596. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  597. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  598. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  599. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  600. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  601. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  602. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  603. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  604. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  605. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  606. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  607. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  608. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  609. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  610. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  611. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  612. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  613. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  614. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  615. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  616. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  617. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  618. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  619. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  620. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  621. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  622. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  623. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  624. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  625. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  626. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  627. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  628. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  629. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  630. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  631. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  632. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  633. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  634. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  635. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  636. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  637. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  638. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  639. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  640. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  641. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  642. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  643. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  644. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  645. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  646. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  647. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  648. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  649. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  650. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  651. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  652. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  653. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  654. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  655. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  656. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  657. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  658. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  659. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  660. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  661. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  662. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  663. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  664. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  665. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  666. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  667. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  668. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  669. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  670. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  671. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  672. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  673. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  674. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  675. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  676. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  677. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  678. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  679. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  680. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  681. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  682. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  683. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  684. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  685. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  686. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  687. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  688. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  689. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  690. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  691. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  692. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  693. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  694. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  695. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  696. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  697. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  698. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  699. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  700. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  701. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  702. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  703. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  704. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  705. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  706. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  707. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  708. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  709. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  710. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  711. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  712. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  713. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  714. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  715. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  716. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  717. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  718. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  719. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  720. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  721. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  722. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  723. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  724. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  725. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  726. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  727. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  728. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  729. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  730. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  731. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  732. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  733. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  734. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  741. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  742. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  743. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  744. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  745. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  746. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  747. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  748. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  749. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  750. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  751. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  752. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  753. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  754. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  755. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  756. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  757. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  758. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  759. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  760. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  761. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  762. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  763. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  764. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  765. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  766. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  767. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  768. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  769. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  770. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  771. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  772. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  773. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  774. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  775. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  776. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  777. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  778. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  779. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  780. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  786. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  787. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  788. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  789. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  790. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  791. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  792. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  793. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  794. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  795. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  796. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  797. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  798. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  799. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  802. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  803. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  804. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  805. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  806. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  807. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  808. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  809. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  810. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  811. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  812. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  813. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  814. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  815. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  816. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  817. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  818. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  821. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  822. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  823. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  824. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  825. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  826. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  827. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  828. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  829. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  830. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  831. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  832. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  833. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  834. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  835. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  836. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  837. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  838. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  839. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  840. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  841. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  842. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  843. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  844. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  845. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  846. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  847. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  848. package/deps/rocksdb/rocksdb.gyp +425 -446
  849. package/package.json +8 -8
  850. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  851. package/prebuilds/darwin-x86/node.napi.node +0 -0
  852. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  853. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  854. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  855. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  856. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  857. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  858. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  859. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  860. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  861. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  862. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  863. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  864. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  865. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  866. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  867. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  868. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  869. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  870. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  871. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  872. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  873. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  874. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  904. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  905. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  906. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  907. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  908. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  909. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -7,53 +7,71 @@
7
7
  // Use of this source code is governed by a BSD-style license that can be
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
+ #include "rocksdb/table.h"
11
+
12
+ #include <gtest/gtest.h>
13
+ #include <stddef.h>
10
14
  #include <stdio.h>
15
+
11
16
  #include <algorithm>
12
17
  #include <iostream>
13
18
  #include <map>
14
19
  #include <memory>
15
20
  #include <string>
21
+ #include <unordered_set>
16
22
  #include <vector>
17
23
 
18
- #include "block_fetcher.h"
19
24
  #include "cache/lru_cache.h"
20
25
  #include "db/dbformat.h"
21
26
  #include "db/memtable.h"
22
27
  #include "db/write_batch_internal.h"
23
28
  #include "memtable/stl_wrappers.h"
24
- #include "meta_blocks.h"
25
29
  #include "monitoring/statistics.h"
30
+ #include "options/options_helper.h"
26
31
  #include "port/port.h"
32
+ #include "port/stack_trace.h"
27
33
  #include "rocksdb/cache.h"
34
+ #include "rocksdb/compression_type.h"
35
+ #include "rocksdb/convenience.h"
28
36
  #include "rocksdb/db.h"
29
37
  #include "rocksdb/env.h"
30
38
  #include "rocksdb/file_checksum.h"
31
39
  #include "rocksdb/file_system.h"
40
+ #include "rocksdb/filter_policy.h"
32
41
  #include "rocksdb/iterator.h"
33
42
  #include "rocksdb/memtablerep.h"
34
43
  #include "rocksdb/perf_context.h"
35
44
  #include "rocksdb/slice_transform.h"
36
45
  #include "rocksdb/statistics.h"
46
+ #include "rocksdb/table_properties.h"
47
+ #include "rocksdb/trace_record.h"
48
+ #include "rocksdb/unique_id.h"
37
49
  #include "rocksdb/write_buffer_manager.h"
38
50
  #include "table/block_based/block.h"
39
51
  #include "table/block_based/block_based_table_builder.h"
40
52
  #include "table/block_based/block_based_table_factory.h"
41
53
  #include "table/block_based/block_based_table_reader.h"
42
54
  #include "table/block_based/block_builder.h"
55
+ #include "table/block_based/filter_policy_internal.h"
43
56
  #include "table/block_based/flush_block_policy.h"
57
+ #include "table/block_fetcher.h"
44
58
  #include "table/format.h"
45
59
  #include "table/get_context.h"
46
60
  #include "table/internal_iterator.h"
61
+ #include "table/meta_blocks.h"
47
62
  #include "table/plain/plain_table_factory.h"
48
63
  #include "table/scoped_arena_iterator.h"
49
64
  #include "table/sst_file_writer_collectors.h"
65
+ #include "table/unique_id_impl.h"
50
66
  #include "test_util/sync_point.h"
51
67
  #include "test_util/testharness.h"
52
68
  #include "test_util/testutil.h"
69
+ #include "util/coding_lean.h"
53
70
  #include "util/compression.h"
54
71
  #include "util/file_checksum_helper.h"
55
72
  #include "util/random.h"
56
73
  #include "util/string_util.h"
74
+ #include "utilities/memory_allocators.h"
57
75
  #include "utilities/merge_operators.h"
58
76
 
59
77
  namespace ROCKSDB_NAMESPACE {
@@ -155,6 +173,9 @@ void Increment(const Comparator* cmp, std::string* key) {
155
173
  }
156
174
  }
157
175
 
176
+ const auto kUnknownColumnFamily =
177
+ TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
178
+
158
179
  } // namespace
159
180
 
160
181
  // Helper class for tests to unify the interface between
@@ -172,12 +193,12 @@ class Constructor {
172
193
  // Finish constructing the data structure with all the keys that have
173
194
  // been added so far. Returns the keys in sorted order in "*keys"
174
195
  // and stores the key/value pairs in "*kvmap"
175
- void Finish(const Options& options, const ImmutableCFOptions& ioptions,
196
+ void Finish(const Options& options, const ImmutableOptions& ioptions,
176
197
  const MutableCFOptions& moptions,
177
198
  const BlockBasedTableOptions& table_options,
178
199
  const InternalKeyComparator& internal_comparator,
179
200
  std::vector<std::string>* keys, stl_wrappers::KVMap* kvmap) {
180
- last_internal_key_ = &internal_comparator;
201
+ last_internal_comparator_ = &internal_comparator;
181
202
  *kvmap = data_;
182
203
  keys->clear();
183
204
  for (const auto& kv : data_) {
@@ -191,7 +212,7 @@ class Constructor {
191
212
 
192
213
  // Construct the data structure from the data in "data"
193
214
  virtual Status FinishImpl(const Options& options,
194
- const ImmutableCFOptions& ioptions,
215
+ const ImmutableOptions& ioptions,
195
216
  const MutableCFOptions& moptions,
196
217
  const BlockBasedTableOptions& table_options,
197
218
  const InternalKeyComparator& internal_comparator,
@@ -209,7 +230,7 @@ class Constructor {
209
230
  virtual bool AnywayDeleteIterator() const { return false; }
210
231
 
211
232
  protected:
212
- const InternalKeyComparator* last_internal_key_;
233
+ const InternalKeyComparator* last_internal_comparator_;
213
234
 
214
235
  private:
215
236
  stl_wrappers::KVMap data_;
@@ -283,7 +304,7 @@ class BlockConstructor : public Constructor {
283
304
  : Constructor(cmp), comparator_(cmp), block_(nullptr) {}
284
305
  ~BlockConstructor() override { delete block_; }
285
306
  Status FinishImpl(const Options& /*options*/,
286
- const ImmutableCFOptions& /*ioptions*/,
307
+ const ImmutableOptions& /*ioptions*/,
287
308
  const MutableCFOptions& /*moptions*/,
288
309
  const BlockBasedTableOptions& table_options,
289
310
  const InternalKeyComparator& /*internal_comparator*/,
@@ -338,7 +359,7 @@ class TableConstructor : public Constructor {
338
359
  }
339
360
  ~TableConstructor() override { Reset(); }
340
361
 
341
- Status FinishImpl(const Options& options, const ImmutableCFOptions& ioptions,
362
+ Status FinishImpl(const Options& options, const ImmutableOptions& ioptions,
342
363
  const MutableCFOptions& moptions,
343
364
  const BlockBasedTableOptions& /*table_options*/,
344
365
  const InternalKeyComparator& internal_comparator,
@@ -349,8 +370,7 @@ class TableConstructor : public Constructor {
349
370
  file_writer_.reset(new WritableFileWriter(
350
371
  std::move(sink), "" /* don't care */, FileOptions()));
351
372
  std::unique_ptr<TableBuilder> builder;
352
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
353
- int_tbl_prop_collector_factories;
373
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
354
374
 
355
375
  if (largest_seqno_ != 0) {
356
376
  // Pretend that it's an external file written by SstFileWriter.
@@ -363,10 +383,8 @@ class TableConstructor : public Constructor {
363
383
  builder.reset(ioptions.table_factory->NewTableBuilder(
364
384
  TableBuilderOptions(ioptions, moptions, internal_comparator,
365
385
  &int_tbl_prop_collector_factories,
366
- options.compression, options.sample_for_compression,
367
- options.compression_opts, false /* skip_filters */,
368
- column_family_name, level_),
369
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
386
+ options.compression, options.compression_opts,
387
+ kUnknownColumnFamily, column_family_name, level_),
370
388
  file_writer_.get()));
371
389
 
372
390
  for (const auto& kv : kv_map) {
@@ -388,19 +406,8 @@ class TableConstructor : public Constructor {
388
406
 
389
407
  // Open the table
390
408
  uniq_id_ = cur_uniq_id_++;
391
- std::unique_ptr<FSRandomAccessFile> source(new test::StringSource(
392
- TEST_GetSink()->contents(), uniq_id_, ioptions.allow_mmap_reads));
393
409
 
394
- file_reader_.reset(new RandomAccessFileReader(std::move(source), "test"));
395
- const bool kSkipFilters = true;
396
- const bool kImmortal = true;
397
- return ioptions.table_factory->NewTableReader(
398
- TableReaderOptions(ioptions, moptions.prefix_extractor.get(), soptions,
399
- internal_comparator, !kSkipFilters, !kImmortal,
400
- false, level_, largest_seqno_, &block_cache_tracer_,
401
- moptions.write_buffer_size),
402
- std::move(file_reader_), TEST_GetSink()->contents().size(),
403
- &table_reader_);
410
+ return Reopen(ioptions, moptions);
404
411
  }
405
412
 
406
413
  InternalIterator* NewIterator(
@@ -426,15 +433,18 @@ class TableConstructor : public Constructor {
426
433
  key, TableReaderCaller::kUncategorized);
427
434
  }
428
435
 
429
- virtual Status Reopen(const ImmutableCFOptions& ioptions,
436
+ virtual Status Reopen(const ImmutableOptions& ioptions,
430
437
  const MutableCFOptions& moptions) {
431
438
  std::unique_ptr<FSRandomAccessFile> source(new test::StringSource(
432
439
  TEST_GetSink()->contents(), uniq_id_, ioptions.allow_mmap_reads));
433
440
 
434
441
  file_reader_.reset(new RandomAccessFileReader(std::move(source), "test"));
435
442
  return ioptions.table_factory->NewTableReader(
436
- TableReaderOptions(ioptions, moptions.prefix_extractor.get(), soptions,
437
- *last_internal_key_),
443
+ TableReaderOptions(ioptions, moptions.prefix_extractor, soptions,
444
+ *last_internal_comparator_, /*skip_filters*/ false,
445
+ /*immortal*/ false, false, level_, largest_seqno_,
446
+ &block_cache_tracer_, moptions.write_buffer_size, "",
447
+ uniq_id_),
438
448
  std::move(file_reader_), TEST_GetSink()->contents().size(),
439
449
  &table_reader_);
440
450
  }
@@ -488,27 +498,28 @@ class MemTableConstructor: public Constructor {
488
498
  write_buffer_manager_(wb),
489
499
  table_factory_(new SkipListFactory) {
490
500
  options_.memtable_factory = table_factory_;
491
- ImmutableCFOptions ioptions(options_);
501
+ ImmutableOptions ioptions(options_);
492
502
  memtable_ =
493
503
  new MemTable(internal_comparator_, ioptions, MutableCFOptions(options_),
494
504
  wb, kMaxSequenceNumber, 0 /* column_family_id */);
495
505
  memtable_->Ref();
496
506
  }
497
507
  ~MemTableConstructor() override { delete memtable_->Unref(); }
498
- Status FinishImpl(const Options&, const ImmutableCFOptions& ioptions,
508
+ Status FinishImpl(const Options&, const ImmutableOptions& ioptions,
499
509
  const MutableCFOptions& /*moptions*/,
500
510
  const BlockBasedTableOptions& /*table_options*/,
501
511
  const InternalKeyComparator& /*internal_comparator*/,
502
512
  const stl_wrappers::KVMap& kv_map) override {
503
513
  delete memtable_->Unref();
504
- ImmutableCFOptions mem_ioptions(ioptions);
514
+ ImmutableOptions mem_ioptions(ioptions);
505
515
  memtable_ = new MemTable(internal_comparator_, mem_ioptions,
506
516
  MutableCFOptions(options_), write_buffer_manager_,
507
517
  kMaxSequenceNumber, 0 /* column_family_id */);
508
518
  memtable_->Ref();
509
519
  int seq = 1;
510
520
  for (const auto& kv : kv_map) {
511
- Status s = memtable_->Add(seq, kTypeValue, kv.first, kv.second);
521
+ Status s = memtable_->Add(seq, kTypeValue, kv.first, kv.second,
522
+ nullptr /* kv_prot_info */);
512
523
  if (!s.ok()) {
513
524
  return s;
514
525
  }
@@ -563,7 +574,7 @@ class DBConstructor: public Constructor {
563
574
  }
564
575
  ~DBConstructor() override { delete db_; }
565
576
  Status FinishImpl(const Options& /*options*/,
566
- const ImmutableCFOptions& /*ioptions*/,
577
+ const ImmutableOptions& /*ioptions*/,
567
578
  const MutableCFOptions& /*moptions*/,
568
579
  const BlockBasedTableOptions& /*table_options*/,
569
580
  const InternalKeyComparator& /*internal_comparator*/,
@@ -855,7 +866,7 @@ class HarnessTest : public testing::Test {
855
866
  constructor_.reset(new DBConstructor(options_.comparator));
856
867
  break;
857
868
  }
858
- ioptions_ = ImmutableCFOptions(options_);
869
+ ioptions_ = ImmutableOptions(options_);
859
870
  moptions_ = MutableCFOptions(options_);
860
871
  }
861
872
 
@@ -1058,7 +1069,7 @@ class HarnessTest : public testing::Test {
1058
1069
  private:
1059
1070
  TestArgs args_;
1060
1071
  Options options_;
1061
- ImmutableCFOptions ioptions_;
1072
+ ImmutableOptions ioptions_;
1062
1073
  MutableCFOptions moptions_;
1063
1074
  BlockBasedTableOptions table_options_;
1064
1075
  std::unique_ptr<Constructor> constructor_;
@@ -1139,7 +1150,8 @@ class BlockBasedTableTest
1139
1150
  &trace_writer));
1140
1151
  // Always return Status::OK().
1141
1152
  assert(c->block_cache_tracer_
1142
- .StartTrace(env_, trace_opt, std::move(trace_writer))
1153
+ .StartTrace(env_->GetSystemClock().get(), trace_opt,
1154
+ std::move(trace_writer))
1143
1155
  .ok());
1144
1156
  {
1145
1157
  std::string user_key = "k01";
@@ -1307,7 +1319,7 @@ class FileChecksumTestHelper {
1307
1319
  uint64_t offset = 0;
1308
1320
  Status s;
1309
1321
  s = file_reader_->Read(IOOptions(), offset, 2048, &result, scratch.get(),
1310
- nullptr, false);
1322
+ nullptr, Env::IO_TOTAL /* rate_limiter_priority */);
1311
1323
  if (!s.ok()) {
1312
1324
  return s;
1313
1325
  }
@@ -1315,7 +1327,8 @@ class FileChecksumTestHelper {
1315
1327
  file_checksum_generator->Update(scratch.get(), result.size());
1316
1328
  offset += static_cast<uint64_t>(result.size());
1317
1329
  s = file_reader_->Read(IOOptions(), offset, 2048, &result, scratch.get(),
1318
- nullptr, false);
1330
+ nullptr,
1331
+ Env::IO_TOTAL /* rate_limiter_priority */);
1319
1332
  if (!s.ok()) {
1320
1333
  return s;
1321
1334
  }
@@ -1340,10 +1353,8 @@ class FileChecksumTestHelper {
1340
1353
 
1341
1354
  uint64_t FileChecksumTestHelper::checksum_uniq_id_ = 1;
1342
1355
 
1343
- INSTANTIATE_TEST_CASE_P(FormatDef, BlockBasedTableTest,
1344
- testing::Values(test::kDefaultFormatVersion));
1345
- INSTANTIATE_TEST_CASE_P(FormatLatest, BlockBasedTableTest,
1346
- testing::Values(test::kLatestFormatVersion));
1356
+ INSTANTIATE_TEST_CASE_P(FormatVersions, BlockBasedTableTest,
1357
+ testing::ValuesIn(test::kFooterFormatVersionsToTest));
1347
1358
 
1348
1359
  // This test serves as the living tutorial for the prefix scan of user collected
1349
1360
  // properties.
@@ -1359,7 +1370,7 @@ TEST_F(TablePropertyTest, PrefixScanTest) {
1359
1370
  {"num.555.3", "3"}, };
1360
1371
 
1361
1372
  // prefixes that exist
1362
- for (const std::string& prefix : {"num.111", "num.333", "num.555"}) {
1373
+ for (const std::string prefix : {"num.111", "num.333", "num.555"}) {
1363
1374
  int num = 0;
1364
1375
  for (auto pos = props.lower_bound(prefix);
1365
1376
  pos != props.end() &&
@@ -1374,7 +1385,7 @@ TEST_F(TablePropertyTest, PrefixScanTest) {
1374
1385
  }
1375
1386
 
1376
1387
  // prefixes that don't exist
1377
- for (const std::string& prefix :
1388
+ for (const std::string prefix :
1378
1389
  {"num.000", "num.222", "num.444", "num.666"}) {
1379
1390
  auto pos = props.lower_bound(prefix);
1380
1391
  ASSERT_TRUE(pos == props.end() ||
@@ -1382,6 +1393,257 @@ TEST_F(TablePropertyTest, PrefixScanTest) {
1382
1393
  }
1383
1394
  }
1384
1395
 
1396
+ namespace {
1397
+ struct TestIds {
1398
+ UniqueId64x3 internal_id;
1399
+ UniqueId64x3 external_id;
1400
+ };
1401
+
1402
+ inline bool operator==(const TestIds& lhs, const TestIds& rhs) {
1403
+ return lhs.internal_id == rhs.internal_id &&
1404
+ lhs.external_id == rhs.external_id;
1405
+ }
1406
+
1407
+ std::ostream& operator<<(std::ostream& os, const TestIds& ids) {
1408
+ return os << std::hex << "{{{ 0x" << ids.internal_id[0] << "U, 0x"
1409
+ << ids.internal_id[1] << "U, 0x" << ids.internal_id[2]
1410
+ << "U }}, {{ 0x" << ids.external_id[0] << "U, 0x"
1411
+ << ids.external_id[1] << "U, 0x" << ids.external_id[2] << "U }}}";
1412
+ }
1413
+
1414
+ TestIds GetUniqueId(TableProperties* tp, std::unordered_set<uint64_t>* seen,
1415
+ const std::string& db_id, const std::string& db_session_id,
1416
+ uint64_t file_number) {
1417
+ // First test session id logic
1418
+ if (db_session_id.size() == 20) {
1419
+ uint64_t upper;
1420
+ uint64_t lower;
1421
+ EXPECT_OK(DecodeSessionId(db_session_id, &upper, &lower));
1422
+ EXPECT_EQ(EncodeSessionId(upper, lower), db_session_id);
1423
+ }
1424
+
1425
+ // Get external using public API
1426
+ tp->db_id = db_id;
1427
+ tp->db_session_id = db_session_id;
1428
+ tp->orig_file_number = file_number;
1429
+ TestIds t;
1430
+ {
1431
+ std::string uid;
1432
+ EXPECT_OK(GetUniqueIdFromTableProperties(*tp, &uid));
1433
+ EXPECT_EQ(uid.size(), 24U);
1434
+ t.external_id[0] = DecodeFixed64(&uid[0]);
1435
+ t.external_id[1] = DecodeFixed64(&uid[8]);
1436
+ t.external_id[2] = DecodeFixed64(&uid[16]);
1437
+ }
1438
+ // All these should be effectively random
1439
+ EXPECT_TRUE(seen->insert(t.external_id[0]).second);
1440
+ EXPECT_TRUE(seen->insert(t.external_id[1]).second);
1441
+ EXPECT_TRUE(seen->insert(t.external_id[2]).second);
1442
+
1443
+ // Get internal with internal API
1444
+ EXPECT_OK(GetSstInternalUniqueId(db_id, db_session_id, file_number,
1445
+ &t.internal_id));
1446
+
1447
+ // Verify relationship
1448
+ UniqueId64x3 tmp = t.internal_id;
1449
+ InternalUniqueIdToExternal(&tmp);
1450
+ EXPECT_EQ(tmp, t.external_id);
1451
+ ExternalUniqueIdToInternal(&tmp);
1452
+ EXPECT_EQ(tmp, t.internal_id);
1453
+ return t;
1454
+ }
1455
+ } // namespace
1456
+
1457
+ TEST_F(TablePropertyTest, UniqueIdsSchemaAndQuality) {
1458
+ // To ensure the computation only depends on the expected entries, we set
1459
+ // the rest randomly
1460
+ TableProperties tp;
1461
+ TEST_SetRandomTableProperties(&tp);
1462
+
1463
+ // DB id is normally RFC-4122
1464
+ const std::string db_id1 = "7265b6eb-4e42-4aec-86a4-0dc5e73a228d";
1465
+ // Allow other forms of DB id
1466
+ const std::string db_id2 = "1728000184588763620";
1467
+ const std::string db_id3 = "x";
1468
+
1469
+ // DB session id is normally 20 chars in base-36, but 13 to 24 chars
1470
+ // is ok, roughly 64 to 128 bits.
1471
+ const std::string ses_id1 = "ABCDEFGHIJ0123456789";
1472
+ // Same trailing 13 digits
1473
+ const std::string ses_id2 = "HIJ0123456789";
1474
+ const std::string ses_id3 = "0123ABCDEFGHIJ0123456789";
1475
+ // Different trailing 12 digits
1476
+ const std::string ses_id4 = "ABCDEFGH888888888888";
1477
+ // And change length
1478
+ const std::string ses_id5 = "ABCDEFGHIJ012";
1479
+ const std::string ses_id6 = "ABCDEFGHIJ0123456789ABCD";
1480
+
1481
+ using T = TestIds;
1482
+ std::unordered_set<uint64_t> seen;
1483
+ // Establish a stable schema for the unique IDs. These values must not
1484
+ // change for existing table files.
1485
+ // (Note: parens needed for macro parsing, extra braces needed for some
1486
+ // compilers.)
1487
+ EXPECT_EQ(
1488
+ GetUniqueId(&tp, &seen, db_id1, ses_id1, 1),
1489
+ T({{{0x61d7dcf415d9cf19U, 0x160d77aae90757fdU, 0x907f41dfd90724ffU}},
1490
+ {{0xf0bd230365df7464U, 0xca089303f3648eb4U, 0x4b44f7e7324b2817U}}}));
1491
+ // Only change internal_id[1] with file number
1492
+ EXPECT_EQ(
1493
+ GetUniqueId(&tp, &seen, db_id1, ses_id1, 2),
1494
+ T({{{0x61d7dcf415d9cf19U, 0x160d77aae90757feU, 0x907f41dfd90724ffU}},
1495
+ {{0xf13fdf7adcfebb6dU, 0x97cd2226cc033ea2U, 0x198c438182091f0eU}}}));
1496
+ EXPECT_EQ(
1497
+ GetUniqueId(&tp, &seen, db_id1, ses_id1, 123456789),
1498
+ T({{{0x61d7dcf415d9cf19U, 0x160d77aaee5c9ae9U, 0x907f41dfd90724ffU}},
1499
+ {{0x81fbcebe1ac6c4f0U, 0x6b14a64cfdc0f1c4U, 0x7d8fb6eaf18edbb3U}}}));
1500
+ // Change internal_id[1] and internal_id[2] with db_id
1501
+ EXPECT_EQ(
1502
+ GetUniqueId(&tp, &seen, db_id2, ses_id1, 1),
1503
+ T({{{0x61d7dcf415d9cf19U, 0xf89c471f572f0d25U, 0x1f0f2a5eb0e6257eU}},
1504
+ {{0x7f1d01d453616991U, 0x32ddf2afec804ab2U, 0xd10a1ee2f0c7d9c1U}}}));
1505
+ EXPECT_EQ(
1506
+ GetUniqueId(&tp, &seen, db_id3, ses_id1, 1),
1507
+ T({{{0x61d7dcf415d9cf19U, 0xfed297a8154a57d0U, 0x8b931b9cdebd9e8U}},
1508
+ {{0x62b2f43183f6894bU, 0x897ff2b460eefad1U, 0xf4ec189fb2d15e04U}}}));
1509
+ // Keeping same last 13 digits of ses_id keeps same internal_id[0]
1510
+ EXPECT_EQ(
1511
+ GetUniqueId(&tp, &seen, db_id1, ses_id2, 1),
1512
+ T({{{0x61d7dcf415d9cf19U, 0x5f6cc4fa2d528c8U, 0x7b70845d5bfb5446U}},
1513
+ {{0x96d1c83ffcc94266U, 0x82663eac0ec6e14aU, 0x94a88b49678b77f6U}}}));
1514
+ EXPECT_EQ(
1515
+ GetUniqueId(&tp, &seen, db_id1, ses_id3, 1),
1516
+ T({{{0x61d7dcf415d9cf19U, 0xfc7232879db37ea2U, 0xc0378d74ea4c89cdU}},
1517
+ {{0xdf2ef57e98776905U, 0xda5b31c987da833bU, 0x79c1b4bd0a9e760dU}}}));
1518
+ // Changing last 12 digits of ses_id only changes internal_id[0]
1519
+ // (vs. db_id1, ses_id1, 1)
1520
+ EXPECT_EQ(
1521
+ GetUniqueId(&tp, &seen, db_id1, ses_id4, 1),
1522
+ T({{{0x4f07cc0d003a83a8U, 0x160d77aae90757fdU, 0x907f41dfd90724ffU}},
1523
+ {{0xbcf85336a9f71f04U, 0x4f2949e2f3adb60dU, 0x9ca0def976abfa10U}}}));
1524
+ // ses_id can change everything.
1525
+ EXPECT_EQ(
1526
+ GetUniqueId(&tp, &seen, db_id1, ses_id5, 1),
1527
+ T({{{0x94b8768e43f87ce6U, 0xc2559653ac4e7c93U, 0xde6dff6bbb1223U}},
1528
+ {{0x5a9537af681817fbU, 0x1afcd1fecaead5eaU, 0x767077ad9ebe0008U}}}));
1529
+ EXPECT_EQ(
1530
+ GetUniqueId(&tp, &seen, db_id1, ses_id6, 1),
1531
+ T({{{0x43cfb0ffa3b710edU, 0x263c580426406a1bU, 0xfacc91379a80d29dU}},
1532
+ {{0xfa90547d84cb1cdbU, 0x2afe99c641992d4aU, 0x205b7f7b60e51cc2U}}}));
1533
+
1534
+ // Now verify more thoroughly that any small change in inputs completely
1535
+ // changes external unique id.
1536
+ // (Relying on 'seen' checks etc. in GetUniqueId)
1537
+ std::string db_id = "00000000-0000-0000-0000-000000000000";
1538
+ std::string ses_id = "000000000000000000000000";
1539
+ uint64_t file_num = 1;
1540
+ // change db_id
1541
+ for (size_t i = 0; i < db_id.size(); ++i) {
1542
+ if (db_id[i] == '-') {
1543
+ continue;
1544
+ }
1545
+ for (char alt : std::string("123456789abcdef")) {
1546
+ db_id[i] = alt;
1547
+ GetUniqueId(&tp, &seen, db_id, ses_id, file_num);
1548
+ }
1549
+ db_id[i] = '0';
1550
+ }
1551
+ // change ses_id
1552
+ for (size_t i = 0; i < ses_id.size(); ++i) {
1553
+ for (char alt : std::string("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")) {
1554
+ ses_id[i] = alt;
1555
+ GetUniqueId(&tp, &seen, db_id, ses_id, file_num);
1556
+ }
1557
+ ses_id[i] = '0';
1558
+ }
1559
+ // change file_num
1560
+ for (int i = 1; i < 64; ++i) {
1561
+ GetUniqueId(&tp, &seen, db_id, ses_id, file_num << i);
1562
+ }
1563
+
1564
+ // Verify that "all zeros" in first 128 bits is equivalent for internal and
1565
+ // external IDs. This way, as long as we avoid "all zeros" in internal IDs,
1566
+ // we avoid it in external IDs.
1567
+ {
1568
+ UniqueId64x3 id1{{0, 0, Random::GetTLSInstance()->Next64()}};
1569
+ UniqueId64x3 id2 = id1;
1570
+ InternalUniqueIdToExternal(&id1);
1571
+ EXPECT_EQ(id1, id2);
1572
+ ExternalUniqueIdToInternal(&id2);
1573
+ EXPECT_EQ(id1, id2);
1574
+ }
1575
+ }
1576
+
1577
+ namespace {
1578
+ void SetGoodTableProperties(TableProperties* tp) {
1579
+ // To ensure the computation only depends on the expected entries, we set
1580
+ // the rest randomly
1581
+ TEST_SetRandomTableProperties(tp);
1582
+ tp->db_id = "7265b6eb-4e42-4aec-86a4-0dc5e73a228d";
1583
+ tp->db_session_id = "ABCDEFGHIJ0123456789";
1584
+ tp->orig_file_number = 1;
1585
+ }
1586
+ } // namespace
1587
+
1588
+ TEST_F(TablePropertyTest, UniqueIdHumanStrings) {
1589
+ TableProperties tp;
1590
+ SetGoodTableProperties(&tp);
1591
+
1592
+ std::string tmp;
1593
+ EXPECT_OK(GetUniqueIdFromTableProperties(tp, &tmp));
1594
+ EXPECT_EQ(tmp,
1595
+ (std::string{{'\x64', '\x74', '\xdf', '\x65', '\x03', '\x23',
1596
+ '\xbd', '\xf0', '\xb4', '\x8e', '\x64', '\xf3',
1597
+ '\x03', '\x93', '\x08', '\xca', '\x17', '\x28',
1598
+ '\x4b', '\x32', '\xe7', '\xf7', '\x44', '\x4b'}}));
1599
+ EXPECT_EQ(UniqueIdToHumanString(tmp),
1600
+ "6474DF650323BDF0-B48E64F3039308CA-17284B32E7F7444B");
1601
+
1602
+ // including zero padding
1603
+ tmp = std::string(24U, '\0');
1604
+ tmp[15] = '\x12';
1605
+ tmp[23] = '\xAB';
1606
+ EXPECT_EQ(UniqueIdToHumanString(tmp),
1607
+ "0000000000000000-0000000000000012-00000000000000AB");
1608
+
1609
+ // And shortened
1610
+ tmp = std::string(20U, '\0');
1611
+ tmp[5] = '\x12';
1612
+ tmp[10] = '\xAB';
1613
+ tmp[17] = '\xEF';
1614
+ EXPECT_EQ(UniqueIdToHumanString(tmp),
1615
+ "0000000000120000-0000AB0000000000-00EF0000");
1616
+
1617
+ tmp.resize(16);
1618
+ EXPECT_EQ(UniqueIdToHumanString(tmp), "0000000000120000-0000AB0000000000");
1619
+
1620
+ tmp.resize(11);
1621
+ EXPECT_EQ(UniqueIdToHumanString(tmp), "0000000000120000-0000AB");
1622
+
1623
+ tmp.resize(6);
1624
+ EXPECT_EQ(UniqueIdToHumanString(tmp), "000000000012");
1625
+ }
1626
+
1627
+ TEST_F(TablePropertyTest, UniqueIdsFailure) {
1628
+ TableProperties tp;
1629
+ std::string tmp;
1630
+
1631
+ // Missing DB id
1632
+ SetGoodTableProperties(&tp);
1633
+ tp.db_id = "";
1634
+ EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1635
+
1636
+ // Missing session id
1637
+ SetGoodTableProperties(&tp);
1638
+ tp.db_session_id = "";
1639
+ EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1640
+
1641
+ // Missing file number
1642
+ SetGoodTableProperties(&tp);
1643
+ tp.orig_file_number = 0;
1644
+ EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1645
+ }
1646
+
1385
1647
  // This test include all the basic checks except those for index size and block
1386
1648
  // size, which will be conducted in separated unit tests.
1387
1649
  TEST_P(BlockBasedTableTest, BasicBlockBasedTableProperties) {
@@ -1408,9 +1670,8 @@ TEST_P(BlockBasedTableTest, BasicBlockBasedTableProperties) {
1408
1670
  table_options.block_restart_interval = 1;
1409
1671
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1410
1672
 
1411
- ImmutableCFOptions ioptions(options);
1673
+ ImmutableOptions ioptions(options);
1412
1674
  MutableCFOptions moptions(options);
1413
- ioptions.statistics = options.statistics.get();
1414
1675
  c.Finish(options, ioptions, moptions, table_options,
1415
1676
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
1416
1677
  ASSERT_EQ(options.statistics->getTickerCount(NUMBER_BLOCK_NOT_COMPRESSED), 0);
@@ -1432,7 +1693,8 @@ TEST_P(BlockBasedTableTest, BasicBlockBasedTableProperties) {
1432
1693
  block_builder.Add(item.first, item.second);
1433
1694
  }
1434
1695
  Slice content = block_builder.Finish();
1435
- ASSERT_EQ(content.size() + kBlockTrailerSize + diff_internal_user_bytes,
1696
+ ASSERT_EQ(content.size() + BlockBasedTable::kBlockTrailerSize +
1697
+ diff_internal_user_bytes,
1436
1698
  props.data_size);
1437
1699
  c.ResetTableReader();
1438
1700
  }
@@ -1457,9 +1719,8 @@ uint64_t BlockBasedTableTest::IndexUncompressedHelper(bool compressed) {
1457
1719
  table_options.enable_index_compression = compressed;
1458
1720
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1459
1721
 
1460
- ImmutableCFOptions ioptions(options);
1722
+ ImmutableOptions ioptions(options);
1461
1723
  MutableCFOptions moptions(options);
1462
- ioptions.statistics = options.statistics.get();
1463
1724
  c.Finish(options, ioptions, moptions, table_options,
1464
1725
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
1465
1726
  c.ResetTableReader();
@@ -1484,7 +1745,7 @@ TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
1484
1745
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1485
1746
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1486
1747
 
1487
- const ImmutableCFOptions ioptions(options);
1748
+ const ImmutableOptions ioptions(options);
1488
1749
  const MutableCFOptions moptions(options);
1489
1750
  c.Finish(options, ioptions, moptions, table_options,
1490
1751
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -1518,7 +1779,7 @@ TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
1518
1779
  options.table_properties_collector_factories.emplace_back(
1519
1780
  new DummyPropertiesCollectorFactory2());
1520
1781
 
1521
- const ImmutableCFOptions ioptions(options);
1782
+ const ImmutableOptions ioptions(options);
1522
1783
  const MutableCFOptions moptions(options);
1523
1784
  c.Finish(options, ioptions, moptions, table_options,
1524
1785
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -1562,7 +1823,7 @@ TEST_P(BlockBasedTableTest, RangeDelBlock) {
1562
1823
  table_options.block_restart_interval = 1;
1563
1824
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1564
1825
 
1565
- const ImmutableCFOptions ioptions(options);
1826
+ const ImmutableOptions ioptions(options);
1566
1827
  const MutableCFOptions moptions(options);
1567
1828
  std::unique_ptr<InternalKeyComparator> internal_cmp(
1568
1829
  new InternalKeyComparator(options.comparator));
@@ -1606,12 +1867,12 @@ TEST_P(BlockBasedTableTest, FilterPolicyNameProperties) {
1606
1867
  Options options;
1607
1868
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1608
1869
 
1609
- const ImmutableCFOptions ioptions(options);
1870
+ const ImmutableOptions ioptions(options);
1610
1871
  const MutableCFOptions moptions(options);
1611
1872
  c.Finish(options, ioptions, moptions, table_options,
1612
1873
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
1613
1874
  auto& props = *c.GetTableReader()->GetTableProperties();
1614
- ASSERT_EQ("rocksdb.BuiltinBloomFilter", props.filter_policy_name);
1875
+ ASSERT_EQ(table_options.filter_policy->Name(), props.filter_policy_name);
1615
1876
  c.ResetTableReader();
1616
1877
  }
1617
1878
 
@@ -1650,7 +1911,7 @@ void PrefetchRange(TableConstructor* c, Options* opt,
1650
1911
  // reset the cache and reopen the table
1651
1912
  table_options->block_cache = NewLRUCache(16 * 1024 * 1024, 4);
1652
1913
  opt->table_factory.reset(NewBlockBasedTableFactory(*table_options));
1653
- const ImmutableCFOptions ioptions2(*opt);
1914
+ const ImmutableOptions ioptions2(*opt);
1654
1915
  const MutableCFOptions moptions(*opt);
1655
1916
  ASSERT_OK(c->Reopen(ioptions2, moptions));
1656
1917
 
@@ -1708,7 +1969,7 @@ TEST_P(BlockBasedTableTest, PrefetchTest) {
1708
1969
  c.Add("k07", std::string(100000, 'x'));
1709
1970
  std::vector<std::string> keys;
1710
1971
  stl_wrappers::KVMap kvmap;
1711
- const ImmutableCFOptions ioptions(opt);
1972
+ const ImmutableOptions ioptions(opt);
1712
1973
  const MutableCFOptions moptions(opt);
1713
1974
  c.Finish(opt, ioptions, moptions, table_options, *ikc, &keys, &kvmap);
1714
1975
  c.ResetTableReader();
@@ -1755,7 +2016,7 @@ TEST_P(BlockBasedTableTest, PrefetchTest) {
1755
2016
 
1756
2017
  TEST_P(BlockBasedTableTest, TotalOrderSeekOnHashIndex) {
1757
2018
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1758
- for (int i = 0; i <= 5; ++i) {
2019
+ for (int i = 0; i <= 4; ++i) {
1759
2020
  Options options;
1760
2021
  // Make each key/value an individual block
1761
2022
  table_options.block_size = 64;
@@ -1772,25 +2033,18 @@ TEST_P(BlockBasedTableTest, TotalOrderSeekOnHashIndex) {
1772
2033
  options.prefix_extractor.reset(NewFixedPrefixTransform(4));
1773
2034
  break;
1774
2035
  case 2:
1775
- // Hash search index with hash_index_allow_collision
1776
- table_options.index_type = BlockBasedTableOptions::kHashSearch;
1777
- table_options.hash_index_allow_collision = true;
1778
- options.table_factory.reset(new BlockBasedTableFactory(table_options));
1779
- options.prefix_extractor.reset(NewFixedPrefixTransform(4));
1780
- break;
1781
- case 3:
1782
2036
  // Hash search index with filter policy
1783
2037
  table_options.index_type = BlockBasedTableOptions::kHashSearch;
1784
2038
  table_options.filter_policy.reset(NewBloomFilterPolicy(10));
1785
2039
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
1786
2040
  options.prefix_extractor.reset(NewFixedPrefixTransform(4));
1787
2041
  break;
1788
- case 4:
2042
+ case 3:
1789
2043
  // Two-level index
1790
2044
  table_options.index_type = BlockBasedTableOptions::kTwoLevelIndexSearch;
1791
2045
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
1792
2046
  break;
1793
- case 5:
2047
+ case 4:
1794
2048
  // Binary search with first key
1795
2049
  table_options.index_type =
1796
2050
  BlockBasedTableOptions::kBinarySearchWithFirstKey;
@@ -1809,7 +2063,7 @@ TEST_P(BlockBasedTableTest, TotalOrderSeekOnHashIndex) {
1809
2063
  c.Add("cccc2", std::string('a', 56));
1810
2064
  std::vector<std::string> keys;
1811
2065
  stl_wrappers::KVMap kvmap;
1812
- const ImmutableCFOptions ioptions(options);
2066
+ const ImmutableOptions ioptions(options);
1813
2067
  const MutableCFOptions moptions(options);
1814
2068
  c.Finish(options, ioptions, moptions, table_options,
1815
2069
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -1868,7 +2122,7 @@ TEST_P(BlockBasedTableTest, NoopTransformSeek) {
1868
2122
  c.Add(key.Encode().ToString(), "b");
1869
2123
  std::vector<std::string> keys;
1870
2124
  stl_wrappers::KVMap kvmap;
1871
- const ImmutableCFOptions ioptions(options);
2125
+ const ImmutableOptions ioptions(options);
1872
2126
  const MutableCFOptions moptions(options);
1873
2127
  const InternalKeyComparator internal_comparator(options.comparator);
1874
2128
  c.Finish(options, ioptions, moptions, table_options, internal_comparator,
@@ -1906,14 +2160,14 @@ TEST_P(BlockBasedTableTest, SkipPrefixBloomFilter) {
1906
2160
  c.Add(key.Encode().ToString(), "test");
1907
2161
  std::vector<std::string> keys;
1908
2162
  stl_wrappers::KVMap kvmap;
1909
- const ImmutableCFOptions ioptions(options);
2163
+ const ImmutableOptions ioptions(options);
1910
2164
  const MutableCFOptions moptions(options);
1911
2165
  const InternalKeyComparator internal_comparator(options.comparator);
1912
2166
  c.Finish(options, ioptions, moptions, table_options, internal_comparator,
1913
2167
  &keys, &kvmap);
1914
2168
  // TODO(Zhongyi): update test to use MutableCFOptions
1915
2169
  options.prefix_extractor.reset(NewFixedPrefixTransform(9));
1916
- const ImmutableCFOptions new_ioptions(options);
2170
+ const ImmutableOptions new_ioptions(options);
1917
2171
  const MutableCFOptions new_moptions(options);
1918
2172
  ASSERT_OK(c.Reopen(new_ioptions, new_moptions));
1919
2173
  auto reader = c.GetTableReader();
@@ -1933,6 +2187,152 @@ TEST_P(BlockBasedTableTest, SkipPrefixBloomFilter) {
1933
2187
  }
1934
2188
  }
1935
2189
 
2190
+ TEST_P(BlockBasedTableTest, BadChecksumType) {
2191
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
2192
+
2193
+ Options options;
2194
+ options.comparator = BytewiseComparator();
2195
+ options.table_factory.reset(new BlockBasedTableFactory(table_options));
2196
+
2197
+ TableConstructor c(options.comparator);
2198
+ InternalKey key("abc", 1, kTypeValue);
2199
+ c.Add(key.Encode().ToString(), "test");
2200
+ std::vector<std::string> keys;
2201
+ stl_wrappers::KVMap kvmap;
2202
+ const ImmutableOptions ioptions(options);
2203
+ const MutableCFOptions moptions(options);
2204
+ const InternalKeyComparator internal_comparator(options.comparator);
2205
+ c.Finish(options, ioptions, moptions, table_options, internal_comparator,
2206
+ &keys, &kvmap);
2207
+
2208
+ // Corrupt checksum type (123 is invalid)
2209
+ auto& sink = *c.TEST_GetSink();
2210
+ size_t len = sink.contents_.size();
2211
+ ASSERT_EQ(sink.contents_[len - Footer::kNewVersionsEncodedLength], kCRC32c);
2212
+ sink.contents_[len - Footer::kNewVersionsEncodedLength] = char{123};
2213
+
2214
+ // (Re-)Open table file with bad checksum type
2215
+ const ImmutableOptions new_ioptions(options);
2216
+ const MutableCFOptions new_moptions(options);
2217
+ Status s = c.Reopen(new_ioptions, new_moptions);
2218
+ ASSERT_NOK(s);
2219
+ ASSERT_EQ(s.ToString(),
2220
+ "Corruption: Corrupt or unsupported checksum type: 123");
2221
+ }
2222
+
2223
+ namespace {
2224
+ std::string ChecksumAsString(const std::string& data,
2225
+ ChecksumType checksum_type) {
2226
+ uint32_t v = ComputeBuiltinChecksum(checksum_type, data.data(), data.size());
2227
+
2228
+ // Verify consistency with other function
2229
+ if (data.size() >= 1) {
2230
+ EXPECT_EQ(v, ComputeBuiltinChecksumWithLastByte(
2231
+ checksum_type, data.data(), data.size() - 1, data.back()));
2232
+ }
2233
+ // Little endian as in file
2234
+ std::array<char, 4> raw_bytes;
2235
+ EncodeFixed32(raw_bytes.data(), v);
2236
+ return Slice(raw_bytes.data(), raw_bytes.size()).ToString(/*hex*/ true);
2237
+ }
2238
+
2239
+ std::string ChecksumAsString(std::string* data, char new_last_byte,
2240
+ ChecksumType checksum_type) {
2241
+ data->back() = new_last_byte;
2242
+ return ChecksumAsString(*data, checksum_type);
2243
+ }
2244
+ } // namespace
2245
+
2246
+ // Make sure that checksum values don't change in later versions, even if
2247
+ // consistent within current version.
2248
+ TEST_P(BlockBasedTableTest, ChecksumSchemas) {
2249
+ std::string b0 = "x";
2250
+ std::string b1 = "This is a short block!x";
2251
+ std::string b2;
2252
+ for (int i = 0; i < 100; ++i) {
2253
+ b2.append("This is a long block!");
2254
+ }
2255
+ b2.append("x");
2256
+ // Trailing 'x' will be replaced by compression type
2257
+
2258
+ std::string empty;
2259
+
2260
+ char ct1 = kNoCompression;
2261
+ char ct2 = kSnappyCompression;
2262
+ char ct3 = kZSTD;
2263
+
2264
+ // Note: first byte of trailer is compression type, last 4 are checksum
2265
+
2266
+ for (ChecksumType t : GetSupportedChecksums()) {
2267
+ switch (t) {
2268
+ case kNoChecksum:
2269
+ EXPECT_EQ(ChecksumAsString(empty, t), "00000000");
2270
+ EXPECT_EQ(ChecksumAsString(&b0, ct1, t), "00000000");
2271
+ EXPECT_EQ(ChecksumAsString(&b0, ct2, t), "00000000");
2272
+ EXPECT_EQ(ChecksumAsString(&b0, ct3, t), "00000000");
2273
+ EXPECT_EQ(ChecksumAsString(&b1, ct1, t), "00000000");
2274
+ EXPECT_EQ(ChecksumAsString(&b1, ct2, t), "00000000");
2275
+ EXPECT_EQ(ChecksumAsString(&b1, ct3, t), "00000000");
2276
+ EXPECT_EQ(ChecksumAsString(&b2, ct1, t), "00000000");
2277
+ EXPECT_EQ(ChecksumAsString(&b2, ct2, t), "00000000");
2278
+ EXPECT_EQ(ChecksumAsString(&b2, ct3, t), "00000000");
2279
+ break;
2280
+ case kCRC32c:
2281
+ EXPECT_EQ(ChecksumAsString(empty, t), "D8EA82A2");
2282
+ EXPECT_EQ(ChecksumAsString(&b0, ct1, t), "D28F2549");
2283
+ EXPECT_EQ(ChecksumAsString(&b0, ct2, t), "052B2843");
2284
+ EXPECT_EQ(ChecksumAsString(&b0, ct3, t), "46F8F711");
2285
+ EXPECT_EQ(ChecksumAsString(&b1, ct1, t), "583F0355");
2286
+ EXPECT_EQ(ChecksumAsString(&b1, ct2, t), "2F9B0A57");
2287
+ EXPECT_EQ(ChecksumAsString(&b1, ct3, t), "ECE7DA1D");
2288
+ EXPECT_EQ(ChecksumAsString(&b2, ct1, t), "943EF0AB");
2289
+ EXPECT_EQ(ChecksumAsString(&b2, ct2, t), "43A2EDB1");
2290
+ EXPECT_EQ(ChecksumAsString(&b2, ct3, t), "00E53D63");
2291
+ break;
2292
+ case kxxHash:
2293
+ EXPECT_EQ(ChecksumAsString(empty, t), "055DCC02");
2294
+ EXPECT_EQ(ChecksumAsString(&b0, ct1, t), "3EB065CF");
2295
+ EXPECT_EQ(ChecksumAsString(&b0, ct2, t), "31F79238");
2296
+ EXPECT_EQ(ChecksumAsString(&b0, ct3, t), "320D2E00");
2297
+ EXPECT_EQ(ChecksumAsString(&b1, ct1, t), "4A2E5FB0");
2298
+ EXPECT_EQ(ChecksumAsString(&b1, ct2, t), "0BD9F652");
2299
+ EXPECT_EQ(ChecksumAsString(&b1, ct3, t), "B4107E50");
2300
+ EXPECT_EQ(ChecksumAsString(&b2, ct1, t), "20F4D4BA");
2301
+ EXPECT_EQ(ChecksumAsString(&b2, ct2, t), "8F1A1F99");
2302
+ EXPECT_EQ(ChecksumAsString(&b2, ct3, t), "A191A338");
2303
+ break;
2304
+ case kxxHash64:
2305
+ EXPECT_EQ(ChecksumAsString(empty, t), "99E9D851");
2306
+ EXPECT_EQ(ChecksumAsString(&b0, ct1, t), "682705DB");
2307
+ EXPECT_EQ(ChecksumAsString(&b0, ct2, t), "30E7211B");
2308
+ EXPECT_EQ(ChecksumAsString(&b0, ct3, t), "B7BB58E8");
2309
+ EXPECT_EQ(ChecksumAsString(&b1, ct1, t), "B74655EF");
2310
+ EXPECT_EQ(ChecksumAsString(&b1, ct2, t), "B6C8BBBE");
2311
+ EXPECT_EQ(ChecksumAsString(&b1, ct3, t), "AED9E3B4");
2312
+ EXPECT_EQ(ChecksumAsString(&b2, ct1, t), "0D4999FE");
2313
+ EXPECT_EQ(ChecksumAsString(&b2, ct2, t), "F5932423");
2314
+ EXPECT_EQ(ChecksumAsString(&b2, ct3, t), "6B31BAB1");
2315
+ break;
2316
+ case kXXH3:
2317
+ EXPECT_EQ(ChecksumAsString(empty, t), "00000000");
2318
+ EXPECT_EQ(ChecksumAsString(&b0, ct1, t), "C294D338");
2319
+ EXPECT_EQ(ChecksumAsString(&b0, ct2, t), "1B174353");
2320
+ EXPECT_EQ(ChecksumAsString(&b0, ct3, t), "2D0E20C8");
2321
+ EXPECT_EQ(ChecksumAsString(&b1, ct1, t), "B37FB5E6");
2322
+ EXPECT_EQ(ChecksumAsString(&b1, ct2, t), "6AFC258D");
2323
+ EXPECT_EQ(ChecksumAsString(&b1, ct3, t), "5CE54616");
2324
+ EXPECT_EQ(ChecksumAsString(&b2, ct1, t), "FA2D482E");
2325
+ EXPECT_EQ(ChecksumAsString(&b2, ct2, t), "23AED845");
2326
+ EXPECT_EQ(ChecksumAsString(&b2, ct3, t), "15B7BBDE");
2327
+ break;
2328
+ default:
2329
+ // Force this test to be updated on new ChecksumTypes
2330
+ assert(false);
2331
+ break;
2332
+ }
2333
+ }
2334
+ }
2335
+
1936
2336
  void AddInternalKey(TableConstructor* c, const std::string& prefix,
1937
2337
  std::string value = "v", int /*suffix_len*/ = 800) {
1938
2338
  static Random rnd(1023);
@@ -1970,7 +2370,7 @@ void TableTest::IndexTest(BlockBasedTableOptions table_options) {
1970
2370
 
1971
2371
  std::unique_ptr<InternalKeyComparator> comparator(
1972
2372
  new InternalKeyComparator(BytewiseComparator()));
1973
- const ImmutableCFOptions ioptions(options);
2373
+ const ImmutableOptions ioptions(options);
1974
2374
  const MutableCFOptions moptions(options);
1975
2375
  c.Finish(options, ioptions, moptions, table_options, *comparator, &keys,
1976
2376
  &kvmap);
@@ -2173,7 +2573,7 @@ TEST_P(BlockBasedTableTest, IndexSeekOptimizationIncomplete) {
2173
2573
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
2174
2574
  Options options;
2175
2575
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2176
- const ImmutableCFOptions ioptions(options);
2576
+ const ImmutableOptions ioptions(options);
2177
2577
  const MutableCFOptions moptions(options);
2178
2578
 
2179
2579
  TableConstructor c(BytewiseComparator());
@@ -2260,7 +2660,7 @@ TEST_P(BlockBasedTableTest, BinaryIndexWithFirstKey2) {
2260
2660
  Statistics* stats = options.statistics.get();
2261
2661
  std::unique_ptr<InternalKeyComparator> comparator(
2262
2662
  new InternalKeyComparator(BytewiseComparator()));
2263
- const ImmutableCFOptions ioptions(options);
2663
+ const ImmutableOptions ioptions(options);
2264
2664
  const MutableCFOptions moptions(options);
2265
2665
 
2266
2666
  TableConstructor c(BytewiseComparator());
@@ -2458,7 +2858,7 @@ TEST_P(BlockBasedTableTest, BinaryIndexWithFirstKeyGlobalSeqno) {
2458
2858
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2459
2859
  std::unique_ptr<InternalKeyComparator> comparator(
2460
2860
  new InternalKeyComparator(BytewiseComparator()));
2461
- const ImmutableCFOptions ioptions(options);
2861
+ const ImmutableOptions ioptions(options);
2462
2862
  const MutableCFOptions moptions(options);
2463
2863
 
2464
2864
  TableConstructor c(BytewiseComparator(), /* convert_to_internal_key */ false,
@@ -2533,7 +2933,7 @@ TEST_P(BlockBasedTableTest, IndexSizeStat) {
2533
2933
  table_options.block_restart_interval = 1;
2534
2934
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2535
2935
 
2536
- const ImmutableCFOptions ioptions(options);
2936
+ const ImmutableOptions ioptions(options);
2537
2937
  const MutableCFOptions moptions(options);
2538
2938
  c.Finish(options, ioptions, moptions, table_options,
2539
2939
  GetPlainInternalComparator(options.comparator), &ks, &kvmap);
@@ -2562,7 +2962,7 @@ TEST_P(BlockBasedTableTest, NumBlockStat) {
2562
2962
 
2563
2963
  std::vector<std::string> ks;
2564
2964
  stl_wrappers::KVMap kvmap;
2565
- const ImmutableCFOptions ioptions(options);
2965
+ const ImmutableOptions ioptions(options);
2566
2966
  const MutableCFOptions moptions(options);
2567
2967
  c.Finish(options, ioptions, moptions, table_options,
2568
2968
  GetPlainInternalComparator(options.comparator), &ks, &kvmap);
@@ -2578,12 +2978,12 @@ TEST_P(BlockBasedTableTest, TracingGetTest) {
2578
2978
  options.create_if_missing = true;
2579
2979
  table_options.block_cache = NewLRUCache(1024 * 1024, 0);
2580
2980
  table_options.cache_index_and_filter_blocks = true;
2581
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
2981
+ table_options.filter_policy.reset(NewBloomFilterPolicy(10));
2582
2982
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
2583
2983
  SetupTracingTest(&c);
2584
2984
  std::vector<std::string> keys;
2585
2985
  stl_wrappers::KVMap kvmap;
2586
- ImmutableCFOptions ioptions(options);
2986
+ ImmutableOptions ioptions(options);
2587
2987
  MutableCFOptions moptions(options);
2588
2988
  c.Finish(options, ioptions, moptions, table_options,
2589
2989
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -2617,14 +3017,14 @@ TEST_P(BlockBasedTableTest, TracingGetTest) {
2617
3017
  // Then we should have three records for one index, one filter, and one data
2618
3018
  // block access.
2619
3019
  record.get_id = 1;
2620
- record.block_type = TraceType::kBlockTraceIndexBlock;
3020
+ record.block_type = TraceType::kBlockTraceFilterBlock;
2621
3021
  record.caller = TableReaderCaller::kUserGet;
2622
3022
  record.get_from_user_specified_snapshot = Boolean::kFalse;
2623
3023
  record.referenced_key = encoded_key;
2624
3024
  record.referenced_key_exist_in_block = Boolean::kTrue;
2625
3025
  record.is_cache_hit = Boolean::kTrue;
2626
3026
  expected_records.push_back(record);
2627
- record.block_type = TraceType::kBlockTraceFilterBlock;
3027
+ record.block_type = TraceType::kBlockTraceIndexBlock;
2628
3028
  expected_records.push_back(record);
2629
3029
  record.is_cache_hit = Boolean::kFalse;
2630
3030
  record.block_type = TraceType::kBlockTraceDataBlock;
@@ -2632,12 +3032,12 @@ TEST_P(BlockBasedTableTest, TracingGetTest) {
2632
3032
  // The second get should all observe cache hits.
2633
3033
  record.is_cache_hit = Boolean::kTrue;
2634
3034
  record.get_id = 2;
2635
- record.block_type = TraceType::kBlockTraceIndexBlock;
3035
+ record.block_type = TraceType::kBlockTraceFilterBlock;
2636
3036
  record.caller = TableReaderCaller::kUserGet;
2637
3037
  record.get_from_user_specified_snapshot = Boolean::kFalse;
2638
3038
  record.referenced_key = encoded_key;
2639
3039
  expected_records.push_back(record);
2640
- record.block_type = TraceType::kBlockTraceFilterBlock;
3040
+ record.block_type = TraceType::kBlockTraceIndexBlock;
2641
3041
  expected_records.push_back(record);
2642
3042
  record.block_type = TraceType::kBlockTraceDataBlock;
2643
3043
  expected_records.push_back(record);
@@ -2657,7 +3057,7 @@ TEST_P(BlockBasedTableTest, TracingApproximateOffsetOfTest) {
2657
3057
  SetupTracingTest(&c);
2658
3058
  std::vector<std::string> keys;
2659
3059
  stl_wrappers::KVMap kvmap;
2660
- ImmutableCFOptions ioptions(options);
3060
+ ImmutableOptions ioptions(options);
2661
3061
  MutableCFOptions moptions(options);
2662
3062
  c.Finish(options, ioptions, moptions, table_options,
2663
3063
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -2701,7 +3101,7 @@ TEST_P(BlockBasedTableTest, TracingIterator) {
2701
3101
  SetupTracingTest(&c);
2702
3102
  std::vector<std::string> keys;
2703
3103
  stl_wrappers::KVMap kvmap;
2704
- ImmutableCFOptions ioptions(options);
3104
+ ImmutableOptions ioptions(options);
2705
3105
  MutableCFOptions moptions(options);
2706
3106
  c.Finish(options, ioptions, moptions, table_options,
2707
3107
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -2831,7 +3231,7 @@ TEST_P(BlockBasedTableTest, BlockCacheDisabledTest) {
2831
3231
 
2832
3232
  TableConstructor c(BytewiseComparator(), true /* convert_to_internal_key_ */);
2833
3233
  c.Add("key", "value");
2834
- const ImmutableCFOptions ioptions(options);
3234
+ const ImmutableOptions ioptions(options);
2835
3235
  const MutableCFOptions moptions(options);
2836
3236
  c.Finish(options, ioptions, moptions, table_options,
2837
3237
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -2883,7 +3283,7 @@ TEST_P(BlockBasedTableTest, FilterBlockInBlockCache) {
2883
3283
 
2884
3284
  TableConstructor c(BytewiseComparator(), true /* convert_to_internal_key_ */);
2885
3285
  c.Add("key", "value");
2886
- const ImmutableCFOptions ioptions(options);
3286
+ const ImmutableOptions ioptions(options);
2887
3287
  const MutableCFOptions moptions(options);
2888
3288
  c.Finish(options, ioptions, moptions, table_options,
2889
3289
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
@@ -2963,7 +3363,7 @@ TEST_P(BlockBasedTableTest, FilterBlockInBlockCache) {
2963
3363
  table_options.block_cache = NewLRUCache(1, 4);
2964
3364
  options.statistics = CreateDBStatistics();
2965
3365
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
2966
- const ImmutableCFOptions ioptions2(options);
3366
+ const ImmutableOptions ioptions2(options);
2967
3367
  const MutableCFOptions moptions2(options);
2968
3368
  ASSERT_OK(c.Reopen(ioptions2, moptions2));
2969
3369
  {
@@ -3010,7 +3410,7 @@ TEST_P(BlockBasedTableTest, FilterBlockInBlockCache) {
3010
3410
  std::string user_key = "k01";
3011
3411
  InternalKey internal_key(user_key, 0, kTypeValue);
3012
3412
  c3.Add(internal_key.Encode().ToString(), "hello");
3013
- ImmutableCFOptions ioptions3(options);
3413
+ ImmutableOptions ioptions3(options);
3014
3414
  MutableCFOptions moptions3(options);
3015
3415
  // Generate table without filter policy
3016
3416
  c3.Finish(options, ioptions3, moptions3, table_options,
@@ -3021,7 +3421,7 @@ TEST_P(BlockBasedTableTest, FilterBlockInBlockCache) {
3021
3421
  table_options.filter_policy.reset(NewBloomFilterPolicy(1));
3022
3422
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
3023
3423
  options.statistics = CreateDBStatistics();
3024
- ImmutableCFOptions ioptions4(options);
3424
+ ImmutableOptions ioptions4(options);
3025
3425
  MutableCFOptions moptions4(options);
3026
3426
  ASSERT_OK(c3.Reopen(ioptions4, moptions4));
3027
3427
  reader = dynamic_cast<BlockBasedTable*>(c3.GetTableReader());
@@ -3083,9 +3483,11 @@ TEST_P(BlockBasedTableTest, InvalidOptions) {
3083
3483
  }
3084
3484
 
3085
3485
  TEST_P(BlockBasedTableTest, BlockReadCountTest) {
3086
- // bloom_filter_type = 0 -- block-based filter
3087
- // bloom_filter_type = 0 -- full filter
3088
- for (int bloom_filter_type = 0; bloom_filter_type < 2; ++bloom_filter_type) {
3486
+ // bloom_filter_type = 0 -- block-based filter (not available in public API)
3487
+ // bloom_filter_type = 1 -- full filter using use_block_based_builder=false
3488
+ // bloom_filter_type = 2 -- full filter using use_block_based_builder=true
3489
+ // because of API change to hide block-based filter
3490
+ for (int bloom_filter_type = 0; bloom_filter_type <= 2; ++bloom_filter_type) {
3089
3491
  for (int index_and_filter_in_cache = 0; index_and_filter_in_cache < 2;
3090
3492
  ++index_and_filter_in_cache) {
3091
3493
  Options options;
@@ -3094,8 +3496,22 @@ TEST_P(BlockBasedTableTest, BlockReadCountTest) {
3094
3496
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
3095
3497
  table_options.block_cache = NewLRUCache(1, 0);
3096
3498
  table_options.cache_index_and_filter_blocks = index_and_filter_in_cache;
3097
- table_options.filter_policy.reset(
3098
- NewBloomFilterPolicy(10, bloom_filter_type == 0));
3499
+ if (bloom_filter_type == 0) {
3500
+ #ifndef ROCKSDB_LITE
3501
+ // Use back-door way of enabling obsolete block-based Bloom
3502
+ ASSERT_OK(FilterPolicy::CreateFromString(
3503
+ ConfigOptions(),
3504
+ "rocksdb.internal.DeprecatedBlockBasedBloomFilter:10",
3505
+ &table_options.filter_policy));
3506
+ #else
3507
+ // Skip this case in LITE build
3508
+ continue;
3509
+ #endif
3510
+ } else {
3511
+ // Public API
3512
+ table_options.filter_policy.reset(
3513
+ NewBloomFilterPolicy(10, bloom_filter_type == 2));
3514
+ }
3099
3515
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
3100
3516
  std::vector<std::string> keys;
3101
3517
  stl_wrappers::KVMap kvmap;
@@ -3105,7 +3521,7 @@ TEST_P(BlockBasedTableTest, BlockReadCountTest) {
3105
3521
  InternalKey internal_key(user_key, 0, kTypeValue);
3106
3522
  std::string encoded_key = internal_key.Encode().ToString();
3107
3523
  c.Add(encoded_key, "hello");
3108
- ImmutableCFOptions ioptions(options);
3524
+ ImmutableOptions ioptions(options);
3109
3525
  MutableCFOptions moptions(options);
3110
3526
  // Generate table with filter policy
3111
3527
  c.Finish(options, ioptions, moptions, table_options,
@@ -3193,7 +3609,7 @@ TEST_P(BlockBasedTableTest, BlockCacheLeak) {
3193
3609
  c.Add("k07", std::string(100000, 'x'));
3194
3610
  std::vector<std::string> keys;
3195
3611
  stl_wrappers::KVMap kvmap;
3196
- const ImmutableCFOptions ioptions(opt);
3612
+ const ImmutableOptions ioptions(opt);
3197
3613
  const MutableCFOptions moptions(opt);
3198
3614
  c.Finish(opt, ioptions, moptions, table_options, *ikc, &keys, &kvmap);
3199
3615
 
@@ -3208,7 +3624,7 @@ TEST_P(BlockBasedTableTest, BlockCacheLeak) {
3208
3624
  ASSERT_OK(iter->status());
3209
3625
  iter.reset();
3210
3626
 
3211
- const ImmutableCFOptions ioptions1(opt);
3627
+ const ImmutableOptions ioptions1(opt);
3212
3628
  const MutableCFOptions moptions1(opt);
3213
3629
  ASSERT_OK(c.Reopen(ioptions1, moptions1));
3214
3630
  auto table_reader = dynamic_cast<BlockBasedTable*>(c.GetTableReader());
@@ -3221,7 +3637,7 @@ TEST_P(BlockBasedTableTest, BlockCacheLeak) {
3221
3637
  // rerun with different block cache
3222
3638
  table_options.block_cache = NewLRUCache(16 * 1024 * 1024, 4);
3223
3639
  opt.table_factory.reset(NewBlockBasedTableFactory(table_options));
3224
- const ImmutableCFOptions ioptions2(opt);
3640
+ const ImmutableOptions ioptions2(opt);
3225
3641
  const MutableCFOptions moptions2(opt);
3226
3642
  ASSERT_OK(c.Reopen(ioptions2, moptions2));
3227
3643
  table_reader = dynamic_cast<BlockBasedTable*>(c.GetTableReader());
@@ -3232,30 +3648,10 @@ TEST_P(BlockBasedTableTest, BlockCacheLeak) {
3232
3648
  c.ResetTableReader();
3233
3649
  }
3234
3650
 
3235
- namespace {
3236
- class CustomMemoryAllocator : public MemoryAllocator {
3237
- public:
3238
- const char* Name() const override { return "CustomMemoryAllocator"; }
3239
-
3240
- void* Allocate(size_t size) override {
3241
- ++numAllocations;
3242
- auto ptr = new char[size + 16];
3243
- memcpy(ptr, "memory_allocator_", 16); // mangle first 16 bytes
3244
- return reinterpret_cast<void*>(ptr + 16);
3245
- }
3246
- void Deallocate(void* p) override {
3247
- ++numDeallocations;
3248
- char* ptr = reinterpret_cast<char*>(p) - 16;
3249
- delete[] ptr;
3250
- }
3251
-
3252
- std::atomic<int> numAllocations;
3253
- std::atomic<int> numDeallocations;
3254
- };
3255
- } // namespace
3256
-
3257
3651
  TEST_P(BlockBasedTableTest, MemoryAllocator) {
3258
- auto custom_memory_allocator = std::make_shared<CustomMemoryAllocator>();
3652
+ auto default_memory_allocator = std::make_shared<DefaultMemoryAllocator>();
3653
+ auto custom_memory_allocator =
3654
+ std::make_shared<CountedMemoryAllocator>(default_memory_allocator);
3259
3655
  {
3260
3656
  Options opt;
3261
3657
  std::unique_ptr<InternalKeyComparator> ikc;
@@ -3281,7 +3677,7 @@ TEST_P(BlockBasedTableTest, MemoryAllocator) {
3281
3677
  c.Add("k07", std::string(100000, 'x'));
3282
3678
  std::vector<std::string> keys;
3283
3679
  stl_wrappers::KVMap kvmap;
3284
- const ImmutableCFOptions ioptions(opt);
3680
+ const ImmutableOptions ioptions(opt);
3285
3681
  const MutableCFOptions moptions(opt);
3286
3682
  c.Finish(opt, ioptions, moptions, table_options, *ikc, &keys, &kvmap);
3287
3683
 
@@ -3298,23 +3694,22 @@ TEST_P(BlockBasedTableTest, MemoryAllocator) {
3298
3694
 
3299
3695
  // out of scope, block cache should have been deleted, all allocations
3300
3696
  // deallocated
3301
- EXPECT_EQ(custom_memory_allocator->numAllocations.load(),
3302
- custom_memory_allocator->numDeallocations.load());
3697
+ EXPECT_EQ(custom_memory_allocator->GetNumAllocations(),
3698
+ custom_memory_allocator->GetNumDeallocations());
3303
3699
  // make sure that allocations actually happened through the cache allocator
3304
- EXPECT_GT(custom_memory_allocator->numAllocations.load(), 0);
3700
+ EXPECT_GT(custom_memory_allocator->GetNumAllocations(), 0);
3305
3701
  }
3306
3702
 
3307
3703
  // Test the file checksum of block based table
3308
3704
  TEST_P(BlockBasedTableTest, NoFileChecksum) {
3309
3705
  Options options;
3310
- ImmutableCFOptions ioptions(options);
3706
+ ImmutableOptions ioptions(options);
3311
3707
  MutableCFOptions moptions(options);
3312
3708
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
3313
3709
  std::unique_ptr<InternalKeyComparator> comparator(
3314
3710
  new InternalKeyComparator(BytewiseComparator()));
3315
3711
  int level = 0;
3316
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
3317
- int_tbl_prop_collector_factories;
3712
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
3318
3713
  std::string column_family_name;
3319
3714
 
3320
3715
  FileChecksumTestHelper f(true);
@@ -3323,10 +3718,8 @@ TEST_P(BlockBasedTableTest, NoFileChecksum) {
3323
3718
  builder.reset(ioptions.table_factory->NewTableBuilder(
3324
3719
  TableBuilderOptions(ioptions, moptions, *comparator,
3325
3720
  &int_tbl_prop_collector_factories,
3326
- options.compression, options.sample_for_compression,
3327
- options.compression_opts, false /* skip_filters */,
3328
- column_family_name, level),
3329
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
3721
+ options.compression, options.compression_opts,
3722
+ kUnknownColumnFamily, column_family_name, level),
3330
3723
  f.GetFileWriter()));
3331
3724
  ASSERT_OK(f.ResetTableBuilder(std::move(builder)));
3332
3725
  f.AddKVtoKVMap(1000);
@@ -3340,14 +3733,13 @@ TEST_P(BlockBasedTableTest, Crc32cFileChecksum) {
3340
3733
  new FileChecksumGenCrc32cFactory();
3341
3734
  Options options;
3342
3735
  options.file_checksum_gen_factory.reset(file_checksum_gen_factory);
3343
- ImmutableCFOptions ioptions(options);
3736
+ ImmutableOptions ioptions(options);
3344
3737
  MutableCFOptions moptions(options);
3345
3738
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
3346
3739
  std::unique_ptr<InternalKeyComparator> comparator(
3347
3740
  new InternalKeyComparator(BytewiseComparator()));
3348
3741
  int level = 0;
3349
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
3350
- int_tbl_prop_collector_factories;
3742
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
3351
3743
  std::string column_family_name;
3352
3744
 
3353
3745
  FileChecksumGenContext gen_context;
@@ -3362,10 +3754,8 @@ TEST_P(BlockBasedTableTest, Crc32cFileChecksum) {
3362
3754
  builder.reset(ioptions.table_factory->NewTableBuilder(
3363
3755
  TableBuilderOptions(ioptions, moptions, *comparator,
3364
3756
  &int_tbl_prop_collector_factories,
3365
- options.compression, options.sample_for_compression,
3366
- options.compression_opts, false /* skip_filters */,
3367
- column_family_name, level),
3368
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
3757
+ options.compression, options.compression_opts,
3758
+ kUnknownColumnFamily, column_family_name, level),
3369
3759
  f.GetFileWriter()));
3370
3760
  ASSERT_OK(f.ResetTableBuilder(std::move(builder)));
3371
3761
  f.AddKVtoKVMap(1000);
@@ -3403,19 +3793,17 @@ TEST_F(PlainTableTest, BasicPlainTableProperties) {
3403
3793
  std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
3404
3794
  std::move(sink), "" /* don't care */, FileOptions()));
3405
3795
  Options options;
3406
- const ImmutableCFOptions ioptions(options);
3796
+ const ImmutableOptions ioptions(options);
3407
3797
  const MutableCFOptions moptions(options);
3408
3798
  InternalKeyComparator ikc(options.comparator);
3409
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
3410
- int_tbl_prop_collector_factories;
3799
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
3411
3800
  std::string column_family_name;
3412
3801
  int unknown_level = -1;
3413
3802
  std::unique_ptr<TableBuilder> builder(factory.NewTableBuilder(
3414
- TableBuilderOptions(
3415
- ioptions, moptions, ikc, &int_tbl_prop_collector_factories,
3416
- kNoCompression, 0 /* sample_for_compression */, CompressionOptions(),
3417
- false /* skip_filters */, column_family_name, unknown_level),
3418
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
3803
+ TableBuilderOptions(ioptions, moptions, ikc,
3804
+ &int_tbl_prop_collector_factories, kNoCompression,
3805
+ CompressionOptions(), kUnknownColumnFamily,
3806
+ column_family_name, unknown_level),
3419
3807
  file_writer.get()));
3420
3808
 
3421
3809
  for (char c = 'a'; c <= 'z'; ++c) {
@@ -3434,11 +3822,9 @@ TEST_F(PlainTableTest, BasicPlainTableProperties) {
3434
3822
  std::unique_ptr<RandomAccessFileReader> file_reader(
3435
3823
  new RandomAccessFileReader(std::move(source), "test"));
3436
3824
 
3437
- TableProperties* props = nullptr;
3825
+ std::unique_ptr<TableProperties> props;
3438
3826
  auto s = ReadTableProperties(file_reader.get(), ss->contents().size(),
3439
- kPlainTableMagicNumber, ioptions,
3440
- &props, true /* compression_type_missing */);
3441
- std::unique_ptr<TableProperties> props_guard(props);
3827
+ kPlainTableMagicNumber, ioptions, &props);
3442
3828
  ASSERT_OK(s);
3443
3829
 
3444
3830
  ASSERT_EQ(0ul, props->index_size);
@@ -3457,22 +3843,20 @@ TEST_F(PlainTableTest, NoFileChecksum) {
3457
3843
  PlainTableFactory factory(plain_table_options);
3458
3844
 
3459
3845
  Options options;
3460
- const ImmutableCFOptions ioptions(options);
3846
+ const ImmutableOptions ioptions(options);
3461
3847
  const MutableCFOptions moptions(options);
3462
3848
  InternalKeyComparator ikc(options.comparator);
3463
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
3464
- int_tbl_prop_collector_factories;
3849
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
3465
3850
  std::string column_family_name;
3466
3851
  int unknown_level = -1;
3467
3852
  FileChecksumTestHelper f(true);
3468
3853
  f.CreateWriteableFile();
3469
3854
 
3470
3855
  std::unique_ptr<TableBuilder> builder(factory.NewTableBuilder(
3471
- TableBuilderOptions(
3472
- ioptions, moptions, ikc, &int_tbl_prop_collector_factories,
3473
- kNoCompression, 0 /* sample_for_compression */, CompressionOptions(),
3474
- false /* skip_filters */, column_family_name, unknown_level),
3475
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
3856
+ TableBuilderOptions(ioptions, moptions, ikc,
3857
+ &int_tbl_prop_collector_factories, kNoCompression,
3858
+ CompressionOptions(), kUnknownColumnFamily,
3859
+ column_family_name, unknown_level),
3476
3860
  f.GetFileWriter()));
3477
3861
  ASSERT_OK(f.ResetTableBuilder(std::move(builder)));
3478
3862
  f.AddKVtoKVMap(1000);
@@ -3492,11 +3876,10 @@ TEST_F(PlainTableTest, Crc32cFileChecksum) {
3492
3876
  new FileChecksumGenCrc32cFactory();
3493
3877
  Options options;
3494
3878
  options.file_checksum_gen_factory.reset(file_checksum_gen_factory);
3495
- const ImmutableCFOptions ioptions(options);
3879
+ const ImmutableOptions ioptions(options);
3496
3880
  const MutableCFOptions moptions(options);
3497
3881
  InternalKeyComparator ikc(options.comparator);
3498
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
3499
- int_tbl_prop_collector_factories;
3882
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
3500
3883
  std::string column_family_name;
3501
3884
  int unknown_level = -1;
3502
3885
 
@@ -3510,11 +3893,10 @@ TEST_F(PlainTableTest, Crc32cFileChecksum) {
3510
3893
  f.SetFileChecksumGenerator(checksum_crc32c_gen1.release());
3511
3894
 
3512
3895
  std::unique_ptr<TableBuilder> builder(factory.NewTableBuilder(
3513
- TableBuilderOptions(
3514
- ioptions, moptions, ikc, &int_tbl_prop_collector_factories,
3515
- kNoCompression, 0 /* sample_for_compression */, CompressionOptions(),
3516
- false /* skip_filters */, column_family_name, unknown_level),
3517
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
3896
+ TableBuilderOptions(ioptions, moptions, ikc,
3897
+ &int_tbl_prop_collector_factories, kNoCompression,
3898
+ CompressionOptions(), kUnknownColumnFamily,
3899
+ column_family_name, unknown_level),
3518
3900
  f.GetFileWriter()));
3519
3901
  ASSERT_OK(f.ResetTableBuilder(std::move(builder)));
3520
3902
  f.AddKVtoKVMap(1000);
@@ -3548,7 +3930,7 @@ TEST_F(GeneralTableTest, ApproximateOffsetOfPlain) {
3548
3930
  options.compression = kNoCompression;
3549
3931
  BlockBasedTableOptions table_options;
3550
3932
  table_options.block_size = 1024;
3551
- const ImmutableCFOptions ioptions(options);
3933
+ const ImmutableOptions ioptions(options);
3552
3934
  const MutableCFOptions moptions(options);
3553
3935
  c.Finish(options, ioptions, moptions, table_options, internal_comparator,
3554
3936
  &keys, &kvmap);
@@ -3584,16 +3966,16 @@ static void DoCompressionTest(CompressionType comp) {
3584
3966
  options.compression = comp;
3585
3967
  BlockBasedTableOptions table_options;
3586
3968
  table_options.block_size = 1024;
3587
- const ImmutableCFOptions ioptions(options);
3969
+ const ImmutableOptions ioptions(options);
3588
3970
  const MutableCFOptions moptions(options);
3589
3971
  c.Finish(options, ioptions, moptions, table_options, ikc, &keys, &kvmap);
3590
3972
 
3591
3973
  ASSERT_TRUE(Between(c.ApproximateOffsetOf("abc"), 0, 0));
3592
3974
  ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01"), 0, 0));
3593
3975
  ASSERT_TRUE(Between(c.ApproximateOffsetOf("k02"), 0, 0));
3594
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), 2000, 3500));
3595
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), 2000, 3500));
3596
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 4000, 7000));
3976
+ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), 2000, 3525));
3977
+ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), 2000, 3525));
3978
+ ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 4000, 7050));
3597
3979
  c.ResetTableReader();
3598
3980
  }
3599
3981
 
@@ -3639,7 +4021,7 @@ TEST_F(GeneralTableTest, ApproximateOffsetOfCompressed) {
3639
4021
  }
3640
4022
  }
3641
4023
 
3642
- #ifndef ROCKSDB_VALGRIND_RUN
4024
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
3643
4025
  TEST_P(ParameterizedHarnessTest, RandomizedHarnessTest) {
3644
4026
  Random rnd(test::RandomSeed() + 5);
3645
4027
  for (int num_entries = 0; num_entries < 2000;
@@ -3674,7 +4056,7 @@ TEST_F(DBHarnessTest, RandomizedLongDB) {
3674
4056
  ASSERT_GT(files, 0);
3675
4057
  }
3676
4058
  #endif // ROCKSDB_LITE
3677
- #endif // ROCKSDB_VALGRIND_RUN
4059
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
3678
4060
 
3679
4061
  class MemTableTest : public testing::Test {
3680
4062
  public:
@@ -3682,7 +4064,7 @@ class MemTableTest : public testing::Test {
3682
4064
  InternalKeyComparator cmp(BytewiseComparator());
3683
4065
  auto table_factory = std::make_shared<SkipListFactory>();
3684
4066
  options_.memtable_factory = table_factory;
3685
- ImmutableCFOptions ioptions(options_);
4067
+ ImmutableOptions ioptions(options_);
3686
4068
  wb_ = new WriteBufferManager(options_.db_write_buffer_size);
3687
4069
  memtable_ = new MemTable(cmp, ioptions, MutableCFOptions(options_), wb_,
3688
4070
  kMaxSequenceNumber, 0 /* column_family_id */);
@@ -3769,126 +4151,93 @@ TEST_P(ParameterizedHarnessTest, SimpleSpecialKey) {
3769
4151
  }
3770
4152
 
3771
4153
  TEST(TableTest, FooterTests) {
4154
+ Random* r = Random::GetTLSInstance();
4155
+ uint64_t data_size = (uint64_t{1} << r->Uniform(40)) + r->Uniform(100);
4156
+ uint64_t index_size = r->Uniform(1000000000);
4157
+ uint64_t metaindex_size = r->Uniform(1000000);
4158
+ // 5 == block trailer size
4159
+ BlockHandle index(data_size + 5, index_size);
4160
+ BlockHandle meta_index(data_size + index_size + 2 * 5, metaindex_size);
4161
+ uint64_t footer_offset = data_size + metaindex_size + index_size + 3 * 5;
3772
4162
  {
3773
- // upconvert legacy block based
3774
- std::string encoded;
3775
- Footer footer(kLegacyBlockBasedTableMagicNumber, 0);
3776
- BlockHandle meta_index(10, 5), index(20, 15);
3777
- footer.set_metaindex_handle(meta_index);
3778
- footer.set_index_handle(index);
3779
- footer.EncodeTo(&encoded);
4163
+ // legacy block based
4164
+ FooterBuilder footer;
4165
+ footer.Build(kBlockBasedTableMagicNumber, /* format_version */ 0,
4166
+ footer_offset, kCRC32c, meta_index, index);
3780
4167
  Footer decoded_footer;
3781
- Slice encoded_slice(encoded);
3782
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
4168
+ ASSERT_OK(decoded_footer.DecodeFrom(footer.GetSlice(), footer_offset));
3783
4169
  ASSERT_EQ(decoded_footer.table_magic_number(), kBlockBasedTableMagicNumber);
3784
- ASSERT_EQ(decoded_footer.checksum(), kCRC32c);
4170
+ ASSERT_EQ(decoded_footer.checksum_type(), kCRC32c);
3785
4171
  ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3786
4172
  ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3787
4173
  ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3788
4174
  ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3789
- ASSERT_EQ(decoded_footer.version(), 0U);
3790
- }
3791
- {
3792
- // xxhash block based
3793
- std::string encoded;
3794
- Footer footer(kBlockBasedTableMagicNumber, 1);
3795
- BlockHandle meta_index(10, 5), index(20, 15);
3796
- footer.set_metaindex_handle(meta_index);
3797
- footer.set_index_handle(index);
3798
- footer.set_checksum(kxxHash);
3799
- footer.EncodeTo(&encoded);
3800
- Footer decoded_footer;
3801
- Slice encoded_slice(encoded);
3802
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
3803
- ASSERT_EQ(decoded_footer.table_magic_number(), kBlockBasedTableMagicNumber);
3804
- ASSERT_EQ(decoded_footer.checksum(), kxxHash);
3805
- ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3806
- ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3807
- ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3808
- ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3809
- ASSERT_EQ(decoded_footer.version(), 1U);
3810
- }
3811
- {
3812
- // xxhash64 block based
3813
- std::string encoded;
3814
- Footer footer(kBlockBasedTableMagicNumber, 1);
3815
- BlockHandle meta_index(10, 5), index(20, 15);
3816
- footer.set_metaindex_handle(meta_index);
3817
- footer.set_index_handle(index);
3818
- footer.set_checksum(kxxHash64);
3819
- footer.EncodeTo(&encoded);
3820
- Footer decoded_footer;
3821
- Slice encoded_slice(encoded);
3822
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
3823
- ASSERT_EQ(decoded_footer.table_magic_number(), kBlockBasedTableMagicNumber);
3824
- ASSERT_EQ(decoded_footer.checksum(), kxxHash64);
3825
- ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3826
- ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3827
- ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3828
- ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3829
- ASSERT_EQ(decoded_footer.version(), 1U);
4175
+ ASSERT_EQ(decoded_footer.format_version(), 0U);
4176
+ ASSERT_EQ(decoded_footer.GetBlockTrailerSize(), 5U);
4177
+ // Ensure serialized with legacy magic
4178
+ ASSERT_EQ(
4179
+ DecodeFixed64(footer.GetSlice().data() + footer.GetSlice().size() - 8),
4180
+ kLegacyBlockBasedTableMagicNumber);
4181
+ }
4182
+ // block based, various checksums, various versions
4183
+ for (auto t : GetSupportedChecksums()) {
4184
+ for (uint32_t fv = 1; IsSupportedFormatVersion(fv); ++fv) {
4185
+ FooterBuilder footer;
4186
+ footer.Build(kBlockBasedTableMagicNumber, fv, footer_offset, t,
4187
+ meta_index, index);
4188
+ Footer decoded_footer;
4189
+ ASSERT_OK(decoded_footer.DecodeFrom(footer.GetSlice(), footer_offset));
4190
+ ASSERT_EQ(decoded_footer.table_magic_number(),
4191
+ kBlockBasedTableMagicNumber);
4192
+ ASSERT_EQ(decoded_footer.checksum_type(), t);
4193
+ ASSERT_EQ(decoded_footer.metaindex_handle().offset(),
4194
+ meta_index.offset());
4195
+ ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
4196
+ ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
4197
+ ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
4198
+ ASSERT_EQ(decoded_footer.format_version(), fv);
4199
+ ASSERT_EQ(decoded_footer.GetBlockTrailerSize(), 5U);
4200
+ }
3830
4201
  }
3831
4202
  // Plain table is not supported in ROCKSDB_LITE
3832
4203
  #ifndef ROCKSDB_LITE
3833
4204
  {
3834
- // upconvert legacy plain table
3835
- std::string encoded;
3836
- Footer footer(kLegacyPlainTableMagicNumber, 0);
3837
- BlockHandle meta_index(10, 5), index(20, 15);
3838
- footer.set_metaindex_handle(meta_index);
3839
- footer.set_index_handle(index);
3840
- footer.EncodeTo(&encoded);
4205
+ // legacy plain table
4206
+ FooterBuilder footer;
4207
+ footer.Build(kPlainTableMagicNumber, /* format_version */ 0, footer_offset,
4208
+ kNoChecksum, meta_index);
3841
4209
  Footer decoded_footer;
3842
- Slice encoded_slice(encoded);
3843
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
4210
+ ASSERT_OK(decoded_footer.DecodeFrom(footer.GetSlice(), footer_offset));
3844
4211
  ASSERT_EQ(decoded_footer.table_magic_number(), kPlainTableMagicNumber);
3845
- ASSERT_EQ(decoded_footer.checksum(), kCRC32c);
4212
+ ASSERT_EQ(decoded_footer.checksum_type(), kCRC32c);
3846
4213
  ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3847
4214
  ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3848
- ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3849
- ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3850
- ASSERT_EQ(decoded_footer.version(), 0U);
4215
+ ASSERT_EQ(decoded_footer.index_handle().offset(), 0U);
4216
+ ASSERT_EQ(decoded_footer.index_handle().size(), 0U);
4217
+ ASSERT_EQ(decoded_footer.format_version(), 0U);
4218
+ ASSERT_EQ(decoded_footer.GetBlockTrailerSize(), 0U);
4219
+ // Ensure serialized with legacy magic
4220
+ ASSERT_EQ(
4221
+ DecodeFixed64(footer.GetSlice().data() + footer.GetSlice().size() - 8),
4222
+ kLegacyPlainTableMagicNumber);
3851
4223
  }
3852
4224
  {
3853
- // xxhash block based
3854
- std::string encoded;
3855
- Footer footer(kPlainTableMagicNumber, 1);
3856
- BlockHandle meta_index(10, 5), index(20, 15);
3857
- footer.set_metaindex_handle(meta_index);
3858
- footer.set_index_handle(index);
3859
- footer.set_checksum(kxxHash);
3860
- footer.EncodeTo(&encoded);
4225
+ // xxhash plain table (not currently used)
4226
+ FooterBuilder footer;
4227
+ footer.Build(kPlainTableMagicNumber, /* format_version */ 1, footer_offset,
4228
+ kxxHash, meta_index);
3861
4229
  Footer decoded_footer;
3862
- Slice encoded_slice(encoded);
3863
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
4230
+ ASSERT_OK(decoded_footer.DecodeFrom(footer.GetSlice(), footer_offset));
3864
4231
  ASSERT_EQ(decoded_footer.table_magic_number(), kPlainTableMagicNumber);
3865
- ASSERT_EQ(decoded_footer.checksum(), kxxHash);
4232
+ ASSERT_EQ(decoded_footer.checksum_type(), kxxHash);
3866
4233
  ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3867
4234
  ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3868
- ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3869
- ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3870
- ASSERT_EQ(decoded_footer.version(), 1U);
4235
+ ASSERT_EQ(decoded_footer.index_handle().offset(), 0U);
4236
+ ASSERT_EQ(decoded_footer.index_handle().size(), 0U);
4237
+ ASSERT_EQ(decoded_footer.format_version(), 1U);
4238
+ ASSERT_EQ(decoded_footer.GetBlockTrailerSize(), 0U);
3871
4239
  }
3872
4240
  #endif // !ROCKSDB_LITE
3873
- {
3874
- // version == 2
3875
- std::string encoded;
3876
- Footer footer(kBlockBasedTableMagicNumber, 2);
3877
- BlockHandle meta_index(10, 5), index(20, 15);
3878
- footer.set_metaindex_handle(meta_index);
3879
- footer.set_index_handle(index);
3880
- footer.EncodeTo(&encoded);
3881
- Footer decoded_footer;
3882
- Slice encoded_slice(encoded);
3883
- ASSERT_OK(decoded_footer.DecodeFrom(&encoded_slice));
3884
- ASSERT_EQ(decoded_footer.table_magic_number(), kBlockBasedTableMagicNumber);
3885
- ASSERT_EQ(decoded_footer.checksum(), kCRC32c);
3886
- ASSERT_EQ(decoded_footer.metaindex_handle().offset(), meta_index.offset());
3887
- ASSERT_EQ(decoded_footer.metaindex_handle().size(), meta_index.size());
3888
- ASSERT_EQ(decoded_footer.index_handle().offset(), index.offset());
3889
- ASSERT_EQ(decoded_footer.index_handle().size(), index.size());
3890
- ASSERT_EQ(decoded_footer.version(), 2U);
3891
- }
3892
4241
  }
3893
4242
 
3894
4243
  class IndexBlockRestartIntervalTest
@@ -3920,6 +4269,8 @@ TEST_P(IndexBlockRestartIntervalTest, IndexBlockRestartInterval) {
3920
4269
  table_options.index_block_restart_interval = index_block_restart_interval;
3921
4270
  if (value_delta_encoding) {
3922
4271
  table_options.format_version = 4;
4272
+ } else {
4273
+ table_options.format_version = 3;
3923
4274
  }
3924
4275
  options.table_factory.reset(new BlockBasedTableFactory(table_options));
3925
4276
 
@@ -3934,7 +4285,7 @@ TEST_P(IndexBlockRestartIntervalTest, IndexBlockRestartInterval) {
3934
4285
  stl_wrappers::KVMap kvmap;
3935
4286
  std::unique_ptr<InternalKeyComparator> comparator(
3936
4287
  new InternalKeyComparator(BytewiseComparator()));
3937
- const ImmutableCFOptions ioptions(options);
4288
+ const ImmutableOptions ioptions(options);
3938
4289
  const MutableCFOptions moptions(options);
3939
4290
  c.Finish(options, ioptions, moptions, table_options, *comparator, &keys,
3940
4291
  &kvmap);
@@ -3986,8 +4337,7 @@ class TestPrefixExtractor : public ROCKSDB_NAMESPACE::SliceTransform {
3986
4337
  }
3987
4338
 
3988
4339
  bool InDomain(const ROCKSDB_NAMESPACE::Slice& src) const override {
3989
- assert(IsValid(src));
3990
- return true;
4340
+ return IsValid(src);
3991
4341
  }
3992
4342
 
3993
4343
  bool InRange(const ROCKSDB_NAMESPACE::Slice& /*dst*/) const override {
@@ -4065,11 +4415,10 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
4065
4415
  std::move(holder), "" /* don't care */, FileOptions()));
4066
4416
  Options options;
4067
4417
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
4068
- const ImmutableCFOptions ioptions(options);
4418
+ const ImmutableOptions ioptions(options);
4069
4419
  const MutableCFOptions moptions(options);
4070
4420
  InternalKeyComparator ikc(options.comparator);
4071
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
4072
- int_tbl_prop_collector_factories;
4421
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
4073
4422
  int_tbl_prop_collector_factories.emplace_back(
4074
4423
  new SstFileWriterPropertiesCollectorFactory(2 /* version */,
4075
4424
  0 /* global_seqno*/));
@@ -4077,9 +4426,8 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
4077
4426
  std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
4078
4427
  TableBuilderOptions(ioptions, moptions, ikc,
4079
4428
  &int_tbl_prop_collector_factories, kNoCompression,
4080
- 0 /* sample_for_compression */, CompressionOptions(),
4081
- false /* skip_filters */, column_family_name, -1),
4082
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
4429
+ CompressionOptions(), kUnknownColumnFamily,
4430
+ column_family_name, -1),
4083
4431
  file_writer.get()));
4084
4432
 
4085
4433
  for (char c = 'a'; c <= 'z'; ++c) {
@@ -4104,20 +4452,17 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
4104
4452
  std::unique_ptr<RandomAccessFileReader> file_reader(
4105
4453
  new RandomAccessFileReader(std::move(source), ""));
4106
4454
 
4107
- TableProperties* props = nullptr;
4455
+ std::unique_ptr<TableProperties> props;
4108
4456
  ASSERT_OK(ReadTableProperties(file_reader.get(), ss_rw.contents().size(),
4109
4457
  kBlockBasedTableMagicNumber, ioptions,
4110
- &props, true /* compression_type_missing */));
4458
+ &props));
4111
4459
 
4112
4460
  UserCollectedProperties user_props = props->user_collected_properties;
4113
4461
  version = DecodeFixed32(
4114
4462
  user_props[ExternalSstFilePropertyNames::kVersion].c_str());
4115
4463
  global_seqno = DecodeFixed64(
4116
4464
  user_props[ExternalSstFilePropertyNames::kGlobalSeqno].c_str());
4117
- global_seqno_offset =
4118
- props->properties_offsets[ExternalSstFilePropertyNames::kGlobalSeqno];
4119
-
4120
- delete props;
4465
+ global_seqno_offset = props->external_sst_file_global_seqno_offset;
4121
4466
  };
4122
4467
 
4123
4468
  // Helper function to update the value of the global seqno in the file
@@ -4139,8 +4484,8 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
4139
4484
  new RandomAccessFileReader(std::move(source), ""));
4140
4485
 
4141
4486
  options.table_factory->NewTableReader(
4142
- TableReaderOptions(ioptions, moptions.prefix_extractor.get(),
4143
- EnvOptions(), ikc),
4487
+ TableReaderOptions(ioptions, moptions.prefix_extractor, EnvOptions(),
4488
+ ikc),
4144
4489
  std::move(file_reader), ss_rw.contents().size(), &table_reader);
4145
4490
 
4146
4491
  return table_reader->NewIterator(
@@ -4254,18 +4599,16 @@ TEST_P(BlockBasedTableTest, BlockAlignTest) {
4254
4599
  Options options;
4255
4600
  options.compression = kNoCompression;
4256
4601
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
4257
- const ImmutableCFOptions ioptions(options);
4602
+ const ImmutableOptions ioptions(options);
4258
4603
  const MutableCFOptions moptions(options);
4259
4604
  InternalKeyComparator ikc(options.comparator);
4260
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
4261
- int_tbl_prop_collector_factories;
4605
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
4262
4606
  std::string column_family_name;
4263
4607
  std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
4264
4608
  TableBuilderOptions(ioptions, moptions, ikc,
4265
4609
  &int_tbl_prop_collector_factories, kNoCompression,
4266
- 0 /* sample_for_compression */, CompressionOptions(),
4267
- false /* skip_filters */, column_family_name, -1),
4268
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
4610
+ CompressionOptions(), kUnknownColumnFamily,
4611
+ column_family_name, -1),
4269
4612
  file_writer.get()));
4270
4613
 
4271
4614
  for (int i = 1; i <= 10000; ++i) {
@@ -4286,15 +4629,14 @@ TEST_P(BlockBasedTableTest, BlockAlignTest) {
4286
4629
  new RandomAccessFileReader(std::move(source), "test"));
4287
4630
  // Helper function to get version, global_seqno, global_seqno_offset
4288
4631
  std::function<void()> VerifyBlockAlignment = [&]() {
4289
- TableProperties* props = nullptr;
4632
+ std::unique_ptr<TableProperties> props;
4290
4633
  ASSERT_OK(ReadTableProperties(file_reader.get(), sink->contents().size(),
4291
- kBlockBasedTableMagicNumber, ioptions, &props,
4292
- true /* compression_type_missing */));
4634
+ kBlockBasedTableMagicNumber, ioptions,
4635
+ &props));
4293
4636
 
4294
4637
  uint64_t data_block_size = props->data_size / props->num_data_blocks;
4295
4638
  ASSERT_EQ(data_block_size, 4096);
4296
4639
  ASSERT_EQ(props->data_size, data_block_size * props->num_data_blocks);
4297
- delete props;
4298
4640
  };
4299
4641
 
4300
4642
  VerifyBlockAlignment();
@@ -4306,12 +4648,11 @@ TEST_P(BlockBasedTableTest, BlockAlignTest) {
4306
4648
  bbto.block_align = false;
4307
4649
  Options options2;
4308
4650
  options2.table_factory.reset(NewBlockBasedTableFactory(bbto));
4309
- ImmutableCFOptions ioptions2(options2);
4651
+ ImmutableOptions ioptions2(options2);
4310
4652
  const MutableCFOptions moptions2(options2);
4311
4653
 
4312
4654
  ASSERT_OK(ioptions.table_factory->NewTableReader(
4313
- TableReaderOptions(ioptions2, moptions2.prefix_extractor.get(),
4314
- EnvOptions(),
4655
+ TableReaderOptions(ioptions2, moptions2.prefix_extractor, EnvOptions(),
4315
4656
  GetPlainInternalComparator(options2.comparator)),
4316
4657
  std::move(file_reader), sink->contents().size(), &table_reader));
4317
4658
 
@@ -4348,19 +4689,17 @@ TEST_P(BlockBasedTableTest, PropertiesBlockRestartPointTest) {
4348
4689
  options.compression = kNoCompression;
4349
4690
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
4350
4691
 
4351
- const ImmutableCFOptions ioptions(options);
4692
+ const ImmutableOptions ioptions(options);
4352
4693
  const MutableCFOptions moptions(options);
4353
4694
  InternalKeyComparator ikc(options.comparator);
4354
- std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
4355
- int_tbl_prop_collector_factories;
4695
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
4356
4696
  std::string column_family_name;
4357
4697
 
4358
4698
  std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
4359
4699
  TableBuilderOptions(ioptions, moptions, ikc,
4360
4700
  &int_tbl_prop_collector_factories, kNoCompression,
4361
- 0 /* sample_for_compression */, CompressionOptions(),
4362
- false /* skip_filters */, column_family_name, -1),
4363
- TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
4701
+ CompressionOptions(), kUnknownColumnFamily,
4702
+ column_family_name, -1),
4364
4703
  file_writer.get()));
4365
4704
 
4366
4705
  for (int i = 1; i <= 10000; ++i) {
@@ -4415,16 +4754,13 @@ TEST_P(BlockBasedTableTest, PropertiesBlockRestartPointTest) {
4415
4754
 
4416
4755
  std::unique_ptr<InternalIterator> meta_iter(metaindex_block.NewDataIterator(
4417
4756
  BytewiseComparator(), kDisableGlobalSequenceNumber));
4418
- bool found_properties_block = true;
4419
- ASSERT_OK(SeekToPropertiesBlock(meta_iter.get(), &found_properties_block));
4420
- ASSERT_TRUE(found_properties_block);
4421
4757
 
4422
4758
  // -- Read properties block
4423
- Slice v = meta_iter->value();
4424
4759
  BlockHandle properties_handle;
4425
- ASSERT_OK(properties_handle.DecodeFrom(&v));
4760
+ ASSERT_OK(FindOptionalMetaBlock(meta_iter.get(), kPropertiesBlockName,
4761
+ &properties_handle));
4762
+ ASSERT_FALSE(properties_handle.IsNull());
4426
4763
  BlockContents properties_contents;
4427
-
4428
4764
  BlockFetchHelper(properties_handle, BlockType::kProperties,
4429
4765
  &properties_contents);
4430
4766
  Block properties_block(std::move(properties_contents));
@@ -4456,7 +4792,7 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
4456
4792
  table_options.filter_policy.reset(NewBloomFilterPolicy(
4457
4793
  8 /* bits_per_key */, false /* use_block_based_filter */));
4458
4794
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
4459
- ImmutableCFOptions ioptions(options);
4795
+ ImmutableOptions ioptions(options);
4460
4796
  MutableCFOptions moptions(options);
4461
4797
  std::vector<std::string> keys;
4462
4798
  stl_wrappers::KVMap kvmap;
@@ -4494,8 +4830,7 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
4494
4830
 
4495
4831
  // verify properties block comes last
4496
4832
  std::unique_ptr<InternalIterator> metaindex_iter{
4497
- metaindex_block.NewDataIterator(options.comparator,
4498
- kDisableGlobalSequenceNumber)};
4833
+ metaindex_block.NewMetaIterator()};
4499
4834
  uint64_t max_offset = 0;
4500
4835
  std::string key_at_max_offset;
4501
4836
  for (metaindex_iter->SeekToFirst(); metaindex_iter->Valid();
@@ -4508,13 +4843,97 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
4508
4843
  key_at_max_offset = metaindex_iter->key().ToString();
4509
4844
  }
4510
4845
  }
4511
- ASSERT_EQ(kPropertiesBlock, key_at_max_offset);
4846
+ ASSERT_EQ(kPropertiesBlockName, key_at_max_offset);
4512
4847
  // index handle is stored in footer rather than metaindex block, so need
4513
4848
  // separate logic to verify it comes before properties block.
4514
4849
  ASSERT_GT(max_offset, footer.index_handle().offset());
4515
4850
  c.ResetTableReader();
4516
4851
  }
4517
4852
 
4853
+ TEST_P(BlockBasedTableTest, SeekMetaBlocks) {
4854
+ TableConstructor c(BytewiseComparator(), true /* convert_to_internal_key_ */);
4855
+ c.Add("foo_a1", "val1");
4856
+ c.Add("foo_b2", "val2");
4857
+ c.Add("foo_c3", "val3");
4858
+ c.Add("foo_d4", "val4");
4859
+ c.Add("foo_e5", "val5");
4860
+ c.Add("foo_f6", "val6");
4861
+ c.Add("foo_g7", "val7");
4862
+ c.Add("foo_h8", "val8");
4863
+ c.Add("foo_j9", "val9");
4864
+
4865
+ // write an SST file
4866
+ Options options;
4867
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
4868
+ table_options.index_type = BlockBasedTableOptions::kHashSearch;
4869
+ table_options.filter_policy.reset(NewBloomFilterPolicy(
4870
+ 8 /* bits_per_key */, false /* use_block_based_filter */));
4871
+ options.prefix_extractor.reset(NewFixedPrefixTransform(4));
4872
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
4873
+ ImmutableOptions ioptions(options);
4874
+ MutableCFOptions moptions(options);
4875
+ std::vector<std::string> keys;
4876
+ stl_wrappers::KVMap kvmap;
4877
+ c.Finish(options, ioptions, moptions, table_options,
4878
+ GetPlainInternalComparator(options.comparator), &keys, &kvmap);
4879
+
4880
+ // get file reader
4881
+ test::StringSink* table_sink = c.TEST_GetSink();
4882
+ std::unique_ptr<FSRandomAccessFile> source(new test::StringSource(
4883
+ table_sink->contents(), 0 /* unique_id */, false /* allow_mmap_reads */));
4884
+
4885
+ std::unique_ptr<RandomAccessFileReader> table_reader(
4886
+ new RandomAccessFileReader(std::move(source), "test"));
4887
+ size_t table_size = table_sink->contents().size();
4888
+
4889
+ // read footer
4890
+ Footer footer;
4891
+ IOOptions opts;
4892
+ ASSERT_OK(ReadFooterFromFile(opts, table_reader.get(),
4893
+ nullptr /* prefetch_buffer */, table_size,
4894
+ &footer, kBlockBasedTableMagicNumber));
4895
+
4896
+ // read metaindex
4897
+ auto metaindex_handle = footer.metaindex_handle();
4898
+ BlockContents metaindex_contents;
4899
+ PersistentCacheOptions pcache_opts;
4900
+ BlockFetcher block_fetcher(
4901
+ table_reader.get(), nullptr /* prefetch_buffer */, footer, ReadOptions(),
4902
+ metaindex_handle, &metaindex_contents, ioptions, false /* decompress */,
4903
+ false /*maybe_compressed*/, BlockType::kMetaIndex,
4904
+ UncompressionDict::GetEmptyDict(), pcache_opts,
4905
+ nullptr /*memory_allocator*/);
4906
+ ASSERT_OK(block_fetcher.ReadBlockContents());
4907
+ Block metaindex_block(std::move(metaindex_contents));
4908
+
4909
+ // verify properties block comes last
4910
+ std::unique_ptr<MetaBlockIter> metaindex_iter(
4911
+ metaindex_block.NewMetaIterator());
4912
+ bool has_hash_prefixes = false;
4913
+ bool has_hash_metadata = false;
4914
+ for (metaindex_iter->SeekToFirst(); metaindex_iter->Valid();
4915
+ metaindex_iter->Next()) {
4916
+ if (metaindex_iter->key().ToString() == kHashIndexPrefixesBlock) {
4917
+ has_hash_prefixes = true;
4918
+ } else if (metaindex_iter->key().ToString() ==
4919
+ kHashIndexPrefixesMetadataBlock) {
4920
+ has_hash_metadata = true;
4921
+ }
4922
+ }
4923
+ if (has_hash_metadata) {
4924
+ metaindex_iter->Seek(kHashIndexPrefixesMetadataBlock);
4925
+ ASSERT_TRUE(metaindex_iter->Valid());
4926
+ ASSERT_EQ(kHashIndexPrefixesMetadataBlock,
4927
+ metaindex_iter->key().ToString());
4928
+ }
4929
+ if (has_hash_prefixes) {
4930
+ metaindex_iter->Seek(kHashIndexPrefixesBlock);
4931
+ ASSERT_TRUE(metaindex_iter->Valid());
4932
+ ASSERT_EQ(kHashIndexPrefixesBlock, metaindex_iter->key().ToString());
4933
+ }
4934
+ c.ResetTableReader();
4935
+ }
4936
+
4518
4937
  TEST_P(BlockBasedTableTest, BadOptions) {
4519
4938
  ROCKSDB_NAMESPACE::Options options;
4520
4939
  options.compression = kNoCompression;
@@ -4571,11 +4990,21 @@ TEST_F(BBTTailPrefetchTest, TestTailPrefetchStats) {
4571
4990
 
4572
4991
  TEST_F(BBTTailPrefetchTest, FilePrefetchBufferMinOffset) {
4573
4992
  TailPrefetchStats tpstats;
4574
- FilePrefetchBuffer buffer(nullptr, 0, 0, false, true);
4993
+ FilePrefetchBuffer buffer(0 /* readahead_size */, 0 /* max_readahead_size */,
4994
+ false /* enable */, true /* track_min_offset */);
4575
4995
  IOOptions opts;
4576
- buffer.TryReadFromCache(opts, 500, 10, nullptr, nullptr);
4577
- buffer.TryReadFromCache(opts, 480, 10, nullptr, nullptr);
4578
- buffer.TryReadFromCache(opts, 490, 10, nullptr, nullptr);
4996
+ buffer.TryReadFromCache(opts, nullptr /* reader */, 500 /* offset */,
4997
+ 10 /* n */, nullptr /* result */,
4998
+ nullptr /* status */,
4999
+ Env::IO_TOTAL /* rate_limiter_priority */);
5000
+ buffer.TryReadFromCache(opts, nullptr /* reader */, 480 /* offset */,
5001
+ 10 /* n */, nullptr /* result */,
5002
+ nullptr /* status */,
5003
+ Env::IO_TOTAL /* rate_limiter_priority */);
5004
+ buffer.TryReadFromCache(opts, nullptr /* reader */, 490 /* offset */,
5005
+ 10 /* n */, nullptr /* result */,
5006
+ nullptr /* status */,
5007
+ Env::IO_TOTAL /* rate_limiter_priority */);
4579
5008
  ASSERT_EQ(480, buffer.min_offset_read());
4580
5009
  }
4581
5010
 
@@ -4605,7 +5034,7 @@ TEST_P(BlockBasedTableTest, DataBlockHashIndex) {
4605
5034
 
4606
5035
  std::vector<std::string> keys;
4607
5036
  stl_wrappers::KVMap kvmap;
4608
- const ImmutableCFOptions ioptions(options);
5037
+ const ImmutableOptions ioptions(options);
4609
5038
  const MutableCFOptions moptions(options);
4610
5039
  const InternalKeyComparator internal_comparator(options.comparator);
4611
5040
  c.Finish(options, ioptions, moptions, table_options, internal_comparator,
@@ -4688,7 +5117,7 @@ TEST_P(BlockBasedTableTest, OutOfBoundOnSeek) {
4688
5117
  Options options;
4689
5118
  BlockBasedTableOptions table_opt(GetBlockBasedTableOptions());
4690
5119
  options.table_factory.reset(NewBlockBasedTableFactory(table_opt));
4691
- const ImmutableCFOptions ioptions(options);
5120
+ const ImmutableOptions ioptions(options);
4692
5121
  const MutableCFOptions moptions(options);
4693
5122
  c.Finish(options, ioptions, moptions, table_opt,
4694
5123
  GetPlainInternalComparator(BytewiseComparator()), &keys, &kvmap);
@@ -4728,7 +5157,7 @@ TEST_P(BlockBasedTableTest, OutOfBoundOnNext) {
4728
5157
  table_opt.flush_block_policy_factory =
4729
5158
  std::make_shared<FlushBlockEveryKeyPolicyFactory>();
4730
5159
  options.table_factory.reset(NewBlockBasedTableFactory(table_opt));
4731
- const ImmutableCFOptions ioptions(options);
5160
+ const ImmutableOptions ioptions(options);
4732
5161
  const MutableCFOptions moptions(options);
4733
5162
  c.Finish(options, ioptions, moptions, table_opt,
4734
5163
  GetPlainInternalComparator(BytewiseComparator()), &keys, &kvmap);
@@ -4761,9 +5190,243 @@ TEST_P(BlockBasedTableTest, OutOfBoundOnNext) {
4761
5190
  ASSERT_FALSE(iter->UpperBoundCheckResult() == IterBoundCheck::kOutOfBound);
4762
5191
  }
4763
5192
 
5193
+ TEST_P(
5194
+ BlockBasedTableTest,
5195
+ IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnBuilderFinish) {
5196
+ constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5197
+ constexpr std::size_t kMetaDataChargeOverhead = 10000;
5198
+ constexpr std::size_t kCacheCapacity = 8 * 1024 * 1024;
5199
+ constexpr std::size_t kMaxDictBytes = 1024;
5200
+ constexpr std::size_t kMaxDictBufferBytes = 1024;
5201
+
5202
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5203
+ LRUCacheOptions lo;
5204
+ lo.capacity = kCacheCapacity;
5205
+ lo.num_shard_bits = 0; // 2^0 shard
5206
+ lo.strict_capacity_limit = true;
5207
+ std::shared_ptr<Cache> cache(NewLRUCache(lo));
5208
+ table_options.block_cache = cache;
5209
+ table_options.flush_block_policy_factory =
5210
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5211
+
5212
+ Options options;
5213
+ options.compression = kSnappyCompression;
5214
+ options.compression_opts.max_dict_bytes = kMaxDictBytes;
5215
+ options.compression_opts.max_dict_buffer_bytes = kMaxDictBufferBytes;
5216
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5217
+
5218
+ test::StringSink* sink = new test::StringSink();
5219
+ std::unique_ptr<FSWritableFile> holder(sink);
5220
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
5221
+ std::move(holder), "test_file_name", FileOptions()));
5222
+
5223
+ ImmutableOptions ioptions(options);
5224
+ MutableCFOptions moptions(options);
5225
+ InternalKeyComparator ikc(options.comparator);
5226
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
5227
+
5228
+ std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
5229
+ TableBuilderOptions(ioptions, moptions, ikc,
5230
+ &int_tbl_prop_collector_factories, kSnappyCompression,
5231
+ options.compression_opts, kUnknownColumnFamily,
5232
+ "test_cf", -1 /* level */),
5233
+ file_writer.get()));
5234
+
5235
+ std::string key1 = "key1";
5236
+ std::string value1 = "val1";
5237
+ InternalKey ik1(key1, 0 /* sequnce number */, kTypeValue);
5238
+ // Adding the first key won't trigger a flush by FlushBlockEveryKeyPolicy
5239
+ // therefore won't trigger any data block's buffering
5240
+ builder->Add(ik1.Encode(), value1);
5241
+ ASSERT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5242
+
5243
+ std::string key2 = "key2";
5244
+ std::string value2 = "val2";
5245
+ InternalKey ik2(key2, 1 /* sequnce number */, kTypeValue);
5246
+ // Adding the second key will trigger a flush of the last data block (the one
5247
+ // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5248
+ // buffering of that data block.
5249
+ builder->Add(ik2.Encode(), value2);
5250
+ // Cache reservation will increase for last buffered data block (the one
5251
+ // containing key1 and value1) since the buffer limit is not exceeded after
5252
+ // that buffering and the cache will not be full after this reservation
5253
+ EXPECT_GE(cache->GetPinnedUsage(), 1 * kSizeDummyEntry);
5254
+ EXPECT_LT(cache->GetPinnedUsage(),
5255
+ 1 * kSizeDummyEntry + kMetaDataChargeOverhead);
5256
+
5257
+ ASSERT_OK(builder->Finish());
5258
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5259
+ }
5260
+
5261
+ TEST_P(
5262
+ BlockBasedTableTest,
5263
+ IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnBufferLimitExceed) {
5264
+ constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5265
+ constexpr std::size_t kMetaDataChargeOverhead = 10000;
5266
+ constexpr std::size_t kCacheCapacity = 8 * 1024 * 1024;
5267
+ constexpr std::size_t kMaxDictBytes = 1024;
5268
+ constexpr std::size_t kMaxDictBufferBytes = 2 * kSizeDummyEntry;
5269
+
5270
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5271
+ LRUCacheOptions lo;
5272
+ lo.capacity = kCacheCapacity;
5273
+ lo.num_shard_bits = 0; // 2^0 shard
5274
+ lo.strict_capacity_limit = true;
5275
+ std::shared_ptr<Cache> cache(NewLRUCache(lo));
5276
+ table_options.block_cache = cache;
5277
+ table_options.flush_block_policy_factory =
5278
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5279
+
5280
+ Options options;
5281
+ options.compression = kSnappyCompression;
5282
+ options.compression_opts.max_dict_bytes = kMaxDictBytes;
5283
+ options.compression_opts.max_dict_buffer_bytes = kMaxDictBufferBytes;
5284
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5285
+
5286
+ test::StringSink* sink = new test::StringSink();
5287
+ std::unique_ptr<FSWritableFile> holder(sink);
5288
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
5289
+ std::move(holder), "test_file_name", FileOptions()));
5290
+
5291
+ ImmutableOptions ioptions(options);
5292
+ MutableCFOptions moptions(options);
5293
+ InternalKeyComparator ikc(options.comparator);
5294
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
5295
+
5296
+ std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
5297
+ TableBuilderOptions(ioptions, moptions, ikc,
5298
+ &int_tbl_prop_collector_factories, kSnappyCompression,
5299
+ options.compression_opts, kUnknownColumnFamily,
5300
+ "test_cf", -1 /* level */),
5301
+ file_writer.get()));
5302
+
5303
+ std::string key1 = "key1";
5304
+ std::string value1(kSizeDummyEntry, '0');
5305
+ InternalKey ik1(key1, 0 /* sequnce number */, kTypeValue);
5306
+ // Adding the first key won't trigger a flush by FlushBlockEveryKeyPolicy
5307
+ // therefore won't trigger any data block's buffering
5308
+ builder->Add(ik1.Encode(), value1);
5309
+ ASSERT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5310
+
5311
+ std::string key2 = "key2";
5312
+ std::string value2(kSizeDummyEntry, '0');
5313
+ InternalKey ik2(key2, 1 /* sequnce number */, kTypeValue);
5314
+ // Adding the second key will trigger a flush of the last data block (the one
5315
+ // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5316
+ // buffering of the last data block.
5317
+ builder->Add(ik2.Encode(), value2);
5318
+ // Cache reservation will increase for last buffered data block (the one
5319
+ // containing key1 and value1) since the buffer limit is not exceeded after
5320
+ // the buffering and the cache will not be full after this reservation
5321
+ EXPECT_GE(cache->GetPinnedUsage(), 2 * kSizeDummyEntry);
5322
+ EXPECT_LT(cache->GetPinnedUsage(),
5323
+ 2 * kSizeDummyEntry + kMetaDataChargeOverhead);
5324
+
5325
+ std::string key3 = "key3";
5326
+ std::string value3 = "val3";
5327
+ InternalKey ik3(key3, 2 /* sequnce number */, kTypeValue);
5328
+ // Adding the third key will trigger a flush of the last data block (the one
5329
+ // containing key2 and value2) by FlushBlockEveryKeyPolicy and hence trigger
5330
+ // buffering of the last data block.
5331
+ builder->Add(ik3.Encode(), value3);
5332
+ // Cache reservation will decrease since the buffer limit is now exceeded
5333
+ // after the last buffering and EnterUnbuffered() is triggered
5334
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5335
+
5336
+ ASSERT_OK(builder->Finish());
5337
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5338
+ }
5339
+
5340
+ TEST_P(
5341
+ BlockBasedTableTest,
5342
+ IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnCacheFull) {
5343
+ constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5344
+ constexpr std::size_t kMetaDataChargeOverhead = 10000;
5345
+ // A small kCacheCapacity is chosen so that increase cache reservation for
5346
+ // buffering two data blocks, each containing key1/value1, key2/a big
5347
+ // value2, will cause cache full
5348
+ constexpr std::size_t kCacheCapacity =
5349
+ 1 * kSizeDummyEntry + kSizeDummyEntry / 2;
5350
+ constexpr std::size_t kMaxDictBytes = 1024;
5351
+ // A big kMaxDictBufferBytes is chosen so that adding a big key value pair
5352
+ // (key2, value2) won't exceed the buffer limit
5353
+ constexpr std::size_t kMaxDictBufferBytes = 1024 * 1024 * 1024;
5354
+
5355
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5356
+ LRUCacheOptions lo;
5357
+ lo.capacity = kCacheCapacity;
5358
+ lo.num_shard_bits = 0; // 2^0 shard
5359
+ lo.strict_capacity_limit = true;
5360
+ std::shared_ptr<Cache> cache(NewLRUCache(lo));
5361
+ table_options.block_cache = cache;
5362
+ table_options.flush_block_policy_factory =
5363
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5364
+
5365
+ Options options;
5366
+ options.compression = kSnappyCompression;
5367
+ options.compression_opts.max_dict_bytes = kMaxDictBytes;
5368
+ options.compression_opts.max_dict_buffer_bytes = kMaxDictBufferBytes;
5369
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5370
+
5371
+ test::StringSink* sink = new test::StringSink();
5372
+ std::unique_ptr<FSWritableFile> holder(sink);
5373
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
5374
+ std::move(holder), "test_file_name", FileOptions()));
5375
+
5376
+ ImmutableOptions ioptions(options);
5377
+ MutableCFOptions moptions(options);
5378
+ InternalKeyComparator ikc(options.comparator);
5379
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
5380
+
5381
+ std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
5382
+ TableBuilderOptions(ioptions, moptions, ikc,
5383
+ &int_tbl_prop_collector_factories, kSnappyCompression,
5384
+ options.compression_opts, kUnknownColumnFamily,
5385
+ "test_cf", -1 /* level */),
5386
+ file_writer.get()));
5387
+
5388
+ std::string key1 = "key1";
5389
+ std::string value1 = "val1";
5390
+ InternalKey ik1(key1, 0 /* sequnce number */, kTypeValue);
5391
+ // Adding the first key won't trigger a flush by FlushBlockEveryKeyPolicy
5392
+ // therefore won't trigger any data block's buffering
5393
+ builder->Add(ik1.Encode(), value1);
5394
+ ASSERT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5395
+
5396
+ std::string key2 = "key2";
5397
+ std::string value2(kSizeDummyEntry, '0');
5398
+ InternalKey ik2(key2, 1 /* sequnce number */, kTypeValue);
5399
+ // Adding the second key will trigger a flush of the last data block (the one
5400
+ // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5401
+ // buffering of the last data block.
5402
+ builder->Add(ik2.Encode(), value2);
5403
+ // Cache reservation will increase for the last buffered data block (the one
5404
+ // containing key1 and value1) since the buffer limit is not exceeded after
5405
+ // the buffering and the cache will not be full after this reservation
5406
+ EXPECT_GE(cache->GetPinnedUsage(), 1 * kSizeDummyEntry);
5407
+ EXPECT_LT(cache->GetPinnedUsage(),
5408
+ 1 * kSizeDummyEntry + kMetaDataChargeOverhead);
5409
+
5410
+ std::string key3 = "key3";
5411
+ std::string value3 = "value3";
5412
+ InternalKey ik3(key3, 2 /* sequnce number */, kTypeValue);
5413
+ // Adding the third key will trigger a flush of the last data block (the one
5414
+ // containing key2 and value2) by FlushBlockEveryKeyPolicy and hence trigger
5415
+ // buffering of the last data block.
5416
+ builder->Add(ik3.Encode(), value3);
5417
+ // Cache reservation will decrease since the cache is now full after
5418
+ // increasing reservation for the last buffered block and EnterUnbuffered() is
5419
+ // triggered
5420
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5421
+
5422
+ ASSERT_OK(builder->Finish());
5423
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5424
+ }
5425
+
4764
5426
  } // namespace ROCKSDB_NAMESPACE
4765
5427
 
4766
5428
  int main(int argc, char** argv) {
5429
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
4767
5430
  ::testing::InitGoogleTest(&argc, argv);
4768
5431
  return RUN_ALL_TESTS();
4769
5432
  }