@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
@@ -3,47 +3,71 @@
3
3
  // COPYING file in the root directory) and Apache 2.0 License
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
 
6
- #include <cmath>
7
-
6
+ #include "rocksdb/system_clock.h"
8
7
  #include "test_util/testharness.h"
9
8
  #include "util/bloom_impl.h"
10
9
  #include "util/coding.h"
11
10
  #include "util/hash.h"
11
+ #include "util/ribbon_config.h"
12
12
  #include "util/ribbon_impl.h"
13
13
  #include "util/stop_watch.h"
14
+ #include "util/string_util.h"
14
15
 
15
16
  #ifndef GFLAGS
16
17
  uint32_t FLAGS_thoroughness = 5;
18
+ uint32_t FLAGS_max_add = 0;
19
+ uint32_t FLAGS_min_check = 4000;
20
+ uint32_t FLAGS_max_check = 100000;
21
+ bool FLAGS_verbose = false;
22
+
17
23
  bool FLAGS_find_occ = false;
18
- double FLAGS_find_next_factor = 1.414;
19
- double FLAGS_find_success = 0.95;
20
- double FLAGS_find_delta_start = 0.01;
21
- double FLAGS_find_delta_end = 0.0001;
22
- double FLAGS_find_delta_shrink = 0.99;
24
+ bool FLAGS_find_slot_occ = false;
25
+ double FLAGS_find_next_factor = 1.618;
26
+ uint32_t FLAGS_find_iters = 10000;
23
27
  uint32_t FLAGS_find_min_slots = 128;
24
- uint32_t FLAGS_find_max_slots = 12800000;
28
+ uint32_t FLAGS_find_max_slots = 1000000;
29
+
30
+ bool FLAGS_optimize_homog = false;
31
+ uint32_t FLAGS_optimize_homog_slots = 30000000;
32
+ uint32_t FLAGS_optimize_homog_check = 200000;
33
+ double FLAGS_optimize_homog_granularity = 0.002;
25
34
  #else
26
35
  #include "util/gflags_compat.h"
27
36
  using GFLAGS_NAMESPACE::ParseCommandLineFlags;
28
37
  // Using 500 is a good test when you have time to be thorough.
29
38
  // Default is for general RocksDB regression test runs.
30
39
  DEFINE_uint32(thoroughness, 5, "iterations per configuration");
40
+ DEFINE_uint32(max_add, 0,
41
+ "Add up to this number of entries to a single filter in "
42
+ "CompactnessAndBacktrackAndFpRate; 0 == reasonable default");
43
+ DEFINE_uint32(min_check, 4000,
44
+ "Minimum number of novel entries for testing FP rate");
45
+ DEFINE_uint32(max_check, 10000,
46
+ "Maximum number of novel entries for testing FP rate");
47
+ DEFINE_bool(verbose, false, "Print extra details");
48
+
49
+ // Options for FindOccupancy, which is more of a tool than a test.
50
+ DEFINE_bool(find_occ, false, "whether to run the FindOccupancy tool");
51
+ DEFINE_bool(find_slot_occ, false,
52
+ "whether to show individual slot occupancies with "
53
+ "FindOccupancy tool");
54
+ DEFINE_double(find_next_factor, 1.618,
55
+ "factor to next num_slots for FindOccupancy");
56
+ DEFINE_uint32(find_iters, 10000, "number of samples for FindOccupancy");
57
+ DEFINE_uint32(find_min_slots, 128, "number of slots for FindOccupancy");
58
+ DEFINE_uint32(find_max_slots, 1000000, "number of slots for FindOccupancy");
59
+
60
+ // Options for OptimizeHomogAtScale, which is more of a tool than a test.
61
+ DEFINE_bool(optimize_homog, false,
62
+ "whether to run the OptimizeHomogAtScale tool");
63
+ DEFINE_uint32(optimize_homog_slots, 30000000,
64
+ "number of slots for OptimizeHomogAtScale");
65
+ DEFINE_uint32(optimize_homog_check, 200000,
66
+ "number of queries for checking FP rate in OptimizeHomogAtScale");
67
+ DEFINE_double(
68
+ optimize_homog_granularity, 0.002,
69
+ "overhead change between FP rate checking in OptimizeHomogAtScale");
31
70
 
32
- // Options for FindOccupancyForSuccessRate, which is more of a tool
33
- // than a test.
34
- DEFINE_bool(find_occ, false,
35
- "whether to run the FindOccupancyForSuccessRate tool");
36
- DEFINE_double(find_next_factor, 1.414,
37
- "target success rate for FindOccupancyForSuccessRate");
38
- DEFINE_double(find_success, 0.95,
39
- "target success rate for FindOccupancyForSuccessRate");
40
- DEFINE_double(find_delta_start, 0.01, " for FindOccupancyForSuccessRate");
41
- DEFINE_double(find_delta_end, 0.0001, " for FindOccupancyForSuccessRate");
42
- DEFINE_double(find_delta_shrink, 0.99, " for FindOccupancyForSuccessRate");
43
- DEFINE_uint32(find_min_slots, 128,
44
- "number of slots for FindOccupancyForSuccessRate");
45
- DEFINE_uint32(find_max_slots, 12800000,
46
- "number of slots for FindOccupancyForSuccessRate");
47
71
  #endif // GFLAGS
48
72
 
49
73
  template <typename TypesAndSettings>
@@ -149,6 +173,18 @@ struct Hash64KeyGenWrapper : public KeyGen {
149
173
  }
150
174
  };
151
175
 
176
+ using ROCKSDB_NAMESPACE::ribbon::ConstructionFailureChance;
177
+
178
+ const std::vector<ConstructionFailureChance> kFailureOnly50Pct = {
179
+ ROCKSDB_NAMESPACE::ribbon::kOneIn2};
180
+
181
+ const std::vector<ConstructionFailureChance> kFailureOnlyRare = {
182
+ ROCKSDB_NAMESPACE::ribbon::kOneIn1000};
183
+
184
+ const std::vector<ConstructionFailureChance> kFailureAll = {
185
+ ROCKSDB_NAMESPACE::ribbon::kOneIn2, ROCKSDB_NAMESPACE::ribbon::kOneIn20,
186
+ ROCKSDB_NAMESPACE::ribbon::kOneIn1000};
187
+
152
188
  } // namespace
153
189
 
154
190
  using ROCKSDB_NAMESPACE::ribbon::ExpectedCollisionFpRate;
@@ -163,17 +199,21 @@ struct DefaultTypesAndSettings {
163
199
  using Seed = uint32_t;
164
200
  using Key = ROCKSDB_NAMESPACE::Slice;
165
201
  static constexpr bool kIsFilter = true;
202
+ static constexpr bool kHomogeneous = false;
166
203
  static constexpr bool kFirstCoeffAlwaysOne = true;
167
204
  static constexpr bool kUseSmash = false;
168
205
  static constexpr bool kAllowZeroStarts = false;
169
206
  static Hash HashFn(const Key& key, uint64_t raw_seed) {
170
- // This version 0.7.2 preview of XXH3 (a.k.a. XXH3p) function does
207
+ // This version 0.7.2 preview of XXH3 (a.k.a. XXPH3) function does
171
208
  // not pass SmallKeyGen tests below without some seed premixing from
172
209
  // StandardHasher. See https://github.com/Cyan4973/xxHash/issues/469
173
210
  return ROCKSDB_NAMESPACE::Hash64(key.data(), key.size(), raw_seed);
174
211
  }
175
212
  // For testing
176
213
  using KeyGen = StandardKeyGen;
214
+ static const std::vector<ConstructionFailureChance>& FailureChanceToTest() {
215
+ return kFailureAll;
216
+ }
177
217
  };
178
218
 
179
219
  using TypesAndSettings_Coeff128 = DefaultTypesAndSettings;
@@ -183,23 +223,58 @@ struct TypesAndSettings_Coeff128Smash : public DefaultTypesAndSettings {
183
223
  struct TypesAndSettings_Coeff64 : public DefaultTypesAndSettings {
184
224
  using CoeffRow = uint64_t;
185
225
  };
186
- struct TypesAndSettings_Coeff64Smash1 : public DefaultTypesAndSettings {
187
- using CoeffRow = uint64_t;
226
+ struct TypesAndSettings_Coeff64Smash : public TypesAndSettings_Coeff64 {
188
227
  static constexpr bool kUseSmash = true;
189
228
  };
190
- struct TypesAndSettings_Coeff64Smash0 : public TypesAndSettings_Coeff64Smash1 {
229
+ struct TypesAndSettings_Coeff64Smash0 : public TypesAndSettings_Coeff64Smash {
191
230
  static constexpr bool kFirstCoeffAlwaysOne = false;
192
231
  };
193
- struct TypesAndSettings_Result16 : public DefaultTypesAndSettings {
232
+
233
+ // Homogeneous Ribbon configurations
234
+ struct TypesAndSettings_Coeff128_Homog : public DefaultTypesAndSettings {
235
+ static constexpr bool kHomogeneous = true;
236
+ // Since our best construction success setting still has 1/1000 failure
237
+ // rate, the best FP rate we test is 1/256
238
+ using ResultRow = uint8_t;
239
+ // Homogeneous only makes sense with sufficient slots for equivalent of
240
+ // almost sure construction success
241
+ static const std::vector<ConstructionFailureChance>& FailureChanceToTest() {
242
+ return kFailureOnlyRare;
243
+ }
244
+ };
245
+ struct TypesAndSettings_Coeff128Smash_Homog
246
+ : public TypesAndSettings_Coeff128_Homog {
247
+ // Smash (extra time to save space) + Homog (extra space to save time)
248
+ // doesn't make much sense in practice, but we minimally test it
249
+ static constexpr bool kUseSmash = true;
250
+ };
251
+ struct TypesAndSettings_Coeff64_Homog : public TypesAndSettings_Coeff128_Homog {
252
+ using CoeffRow = uint64_t;
253
+ };
254
+ struct TypesAndSettings_Coeff64Smash_Homog
255
+ : public TypesAndSettings_Coeff64_Homog {
256
+ // Smash (extra time to save space) + Homog (extra space to save time)
257
+ // doesn't make much sense in practice, but we minimally test it
258
+ static constexpr bool kUseSmash = true;
259
+ };
260
+
261
+ // Less exhaustive mix of coverage, but still covering the most stressful case
262
+ // (only 50% construction success)
263
+ struct AbridgedTypesAndSettings : public DefaultTypesAndSettings {
264
+ static const std::vector<ConstructionFailureChance>& FailureChanceToTest() {
265
+ return kFailureOnly50Pct;
266
+ }
267
+ };
268
+ struct TypesAndSettings_Result16 : public AbridgedTypesAndSettings {
194
269
  using ResultRow = uint16_t;
195
270
  };
196
- struct TypesAndSettings_Result32 : public DefaultTypesAndSettings {
271
+ struct TypesAndSettings_Result32 : public AbridgedTypesAndSettings {
197
272
  using ResultRow = uint32_t;
198
273
  };
199
- struct TypesAndSettings_IndexSizeT : public DefaultTypesAndSettings {
274
+ struct TypesAndSettings_IndexSizeT : public AbridgedTypesAndSettings {
200
275
  using Index = size_t;
201
276
  };
202
- struct TypesAndSettings_Hash32 : public DefaultTypesAndSettings {
277
+ struct TypesAndSettings_Hash32 : public AbridgedTypesAndSettings {
203
278
  using Hash = uint32_t;
204
279
  static Hash HashFn(const Key& key, Hash raw_seed) {
205
280
  // This MurmurHash1 function does not pass tests below without the
@@ -208,29 +283,29 @@ struct TypesAndSettings_Hash32 : public DefaultTypesAndSettings {
208
283
  return ROCKSDB_NAMESPACE::Hash(key.data(), key.size(), raw_seed);
209
284
  }
210
285
  };
211
- struct TypesAndSettings_Hash32_Result16 : public TypesAndSettings_Hash32 {
286
+ struct TypesAndSettings_Hash32_Result16 : public AbridgedTypesAndSettings {
212
287
  using ResultRow = uint16_t;
213
288
  };
214
- struct TypesAndSettings_KeyString : public DefaultTypesAndSettings {
289
+ struct TypesAndSettings_KeyString : public AbridgedTypesAndSettings {
215
290
  using Key = std::string;
216
291
  };
217
- struct TypesAndSettings_Seed8 : public DefaultTypesAndSettings {
292
+ struct TypesAndSettings_Seed8 : public AbridgedTypesAndSettings {
218
293
  // This is not a generally recommended configuration. With the configured
219
294
  // hash function, it would fail with SmallKeyGen due to insufficient
220
295
  // independence among the seeds.
221
296
  using Seed = uint8_t;
222
297
  };
223
- struct TypesAndSettings_NoAlwaysOne : public DefaultTypesAndSettings {
298
+ struct TypesAndSettings_NoAlwaysOne : public AbridgedTypesAndSettings {
224
299
  static constexpr bool kFirstCoeffAlwaysOne = false;
225
300
  };
226
- struct TypesAndSettings_AllowZeroStarts : public DefaultTypesAndSettings {
301
+ struct TypesAndSettings_AllowZeroStarts : public AbridgedTypesAndSettings {
227
302
  static constexpr bool kAllowZeroStarts = true;
228
303
  };
229
- struct TypesAndSettings_Seed64 : public DefaultTypesAndSettings {
304
+ struct TypesAndSettings_Seed64 : public AbridgedTypesAndSettings {
230
305
  using Seed = uint64_t;
231
306
  };
232
307
  struct TypesAndSettings_Rehasher
233
- : public StandardRehasherAdapter<DefaultTypesAndSettings> {
308
+ : public StandardRehasherAdapter<AbridgedTypesAndSettings> {
234
309
  using KeyGen = Hash64KeyGenWrapper<StandardKeyGen>;
235
310
  };
236
311
  struct TypesAndSettings_Rehasher_Result16 : public TypesAndSettings_Rehasher {
@@ -252,7 +327,7 @@ struct TypesAndSettings_Rehasher32_Coeff64
252
327
  : public TypesAndSettings_Rehasher32 {
253
328
  using CoeffRow = uint64_t;
254
329
  };
255
- struct TypesAndSettings_SmallKeyGen : public DefaultTypesAndSettings {
330
+ struct TypesAndSettings_SmallKeyGen : public AbridgedTypesAndSettings {
256
331
  // SmallKeyGen stresses the independence of different hash seeds
257
332
  using KeyGen = SmallKeyGen;
258
333
  };
@@ -260,11 +335,25 @@ struct TypesAndSettings_Hash32_SmallKeyGen : public TypesAndSettings_Hash32 {
260
335
  // SmallKeyGen stresses the independence of different hash seeds
261
336
  using KeyGen = SmallKeyGen;
262
337
  };
338
+ struct TypesAndSettings_Coeff32 : public DefaultTypesAndSettings {
339
+ using CoeffRow = uint32_t;
340
+ };
341
+ struct TypesAndSettings_Coeff32Smash : public TypesAndSettings_Coeff32 {
342
+ static constexpr bool kUseSmash = true;
343
+ };
344
+ struct TypesAndSettings_Coeff16 : public DefaultTypesAndSettings {
345
+ using CoeffRow = uint16_t;
346
+ };
347
+ struct TypesAndSettings_Coeff16Smash : public TypesAndSettings_Coeff16 {
348
+ static constexpr bool kUseSmash = true;
349
+ };
263
350
 
264
351
  using TestTypesAndSettings = ::testing::Types<
265
352
  TypesAndSettings_Coeff128, TypesAndSettings_Coeff128Smash,
266
- TypesAndSettings_Coeff64, TypesAndSettings_Coeff64Smash0,
267
- TypesAndSettings_Coeff64Smash1, TypesAndSettings_Result16,
353
+ TypesAndSettings_Coeff64, TypesAndSettings_Coeff64Smash,
354
+ TypesAndSettings_Coeff64Smash0, TypesAndSettings_Coeff128_Homog,
355
+ TypesAndSettings_Coeff128Smash_Homog, TypesAndSettings_Coeff64_Homog,
356
+ TypesAndSettings_Coeff64Smash_Homog, TypesAndSettings_Result16,
268
357
  TypesAndSettings_Result32, TypesAndSettings_IndexSizeT,
269
358
  TypesAndSettings_Hash32, TypesAndSettings_Hash32_Result16,
270
359
  TypesAndSettings_KeyString, TypesAndSettings_Seed8,
@@ -273,7 +362,9 @@ using TestTypesAndSettings = ::testing::Types<
273
362
  TypesAndSettings_Rehasher_Result16, TypesAndSettings_Rehasher_Result32,
274
363
  TypesAndSettings_Rehasher_Seed64, TypesAndSettings_Rehasher32,
275
364
  TypesAndSettings_Rehasher32_Coeff64, TypesAndSettings_SmallKeyGen,
276
- TypesAndSettings_Hash32_SmallKeyGen>;
365
+ TypesAndSettings_Hash32_SmallKeyGen, TypesAndSettings_Coeff32,
366
+ TypesAndSettings_Coeff32Smash, TypesAndSettings_Coeff16,
367
+ TypesAndSettings_Coeff16Smash>;
277
368
  TYPED_TEST_CASE(RibbonTypeParamTest, TestTypesAndSettings);
278
369
 
279
370
  namespace {
@@ -317,328 +408,476 @@ TYPED_TEST(RibbonTypeParamTest, CompactnessAndBacktrackAndFpRate) {
317
408
  IMPORT_RIBBON_TYPES_AND_SETTINGS(TypeParam);
318
409
  IMPORT_RIBBON_IMPL_TYPES(TypeParam);
319
410
  using KeyGen = typename TypeParam::KeyGen;
411
+ using ConfigHelper =
412
+ ROCKSDB_NAMESPACE::ribbon::BandingConfigHelper<TypeParam>;
320
413
 
321
- // For testing FP rate etc.
322
- constexpr Index kNumToCheck = 100000;
414
+ if (sizeof(CoeffRow) < 8) {
415
+ ROCKSDB_GTEST_BYPASS("Not fully supported");
416
+ return;
417
+ }
323
418
 
324
419
  const auto log2_thoroughness =
325
- static_cast<Hash>(ROCKSDB_NAMESPACE::FloorLog2(FLAGS_thoroughness));
326
-
327
- // With overhead of just 2%, expect ~50% encoding success per
328
- // seed with ~5k keys on 64-bit ribbon, or ~150k keys on 128-bit ribbon.
329
- const double kFactor = 1.02;
330
-
331
- uint64_t total_reseeds = 0;
332
- uint64_t total_single_failures = 0;
333
- uint64_t total_batch_successes = 0;
334
- uint64_t total_fp_count = 0;
335
- uint64_t total_added = 0;
336
-
337
- uint64_t soln_query_nanos = 0;
338
- uint64_t soln_query_count = 0;
339
- uint64_t bloom_query_nanos = 0;
340
- uint64_t isoln_query_nanos = 0;
341
- uint64_t isoln_query_count = 0;
342
-
343
- // Take different samples if you change thoroughness
344
- ROCKSDB_NAMESPACE::Random32 rnd(FLAGS_thoroughness);
345
-
346
- for (uint32_t i = 0; i < FLAGS_thoroughness; ++i) {
347
- uint32_t num_to_add =
348
- sizeof(CoeffRow) == 16 ? 130000 : TypeParam::kUseSmash ? 5500 : 2500;
349
-
350
- // Use different values between that number and 50% of that number
351
- num_to_add -= rnd.Uniformish(num_to_add / 2);
352
-
353
- total_added += num_to_add;
354
-
355
- // Most of the time, test the Interleaved solution storage, but when
356
- // we do we have to make num_slots a multiple of kCoeffBits. So
357
- // sometimes we want to test without that limitation.
358
- bool test_interleaved = (i % 7) != 6;
359
-
360
- Index num_slots = static_cast<Index>(num_to_add * kFactor);
361
- if (test_interleaved) {
362
- // Round to supported number of slots
363
- num_slots = InterleavedSoln::RoundUpNumSlots(num_slots);
364
- // Re-adjust num_to_add to get as close as possible to kFactor
365
- num_to_add = static_cast<uint32_t>(num_slots / kFactor);
420
+ static_cast<uint32_t>(ROCKSDB_NAMESPACE::FloorLog2(FLAGS_thoroughness));
421
+
422
+ // We are going to choose num_to_add using an exponential distribution,
423
+ // so that we have good representation of small-to-medium filters.
424
+ // Here we just pick some reasonable, practical upper bound based on
425
+ // kCoeffBits or option.
426
+ const double log_max_add = std::log(
427
+ FLAGS_max_add > 0 ? FLAGS_max_add
428
+ : static_cast<uint32_t>(kCoeffBits * kCoeffBits) *
429
+ std::max(FLAGS_thoroughness, uint32_t{32}));
430
+
431
+ // This needs to be enough below the minimum number of slots to get a
432
+ // reasonable number of samples with the minimum number of slots.
433
+ const double log_min_add = std::log(0.66 * SimpleSoln::RoundUpNumSlots(1));
434
+
435
+ ASSERT_GT(log_max_add, log_min_add);
436
+
437
+ const double diff_log_add = log_max_add - log_min_add;
438
+
439
+ for (ConstructionFailureChance cs : TypeParam::FailureChanceToTest()) {
440
+ double expected_reseeds;
441
+ switch (cs) {
442
+ default:
443
+ assert(false);
444
+ FALLTHROUGH_INTENDED;
445
+ case ROCKSDB_NAMESPACE::ribbon::kOneIn2:
446
+ fprintf(stderr, "== Failure: 50 percent\n");
447
+ expected_reseeds = 1.0;
448
+ break;
449
+ case ROCKSDB_NAMESPACE::ribbon::kOneIn20:
450
+ fprintf(stderr, "== Failure: 95 percent\n");
451
+ expected_reseeds = 0.053;
452
+ break;
453
+ case ROCKSDB_NAMESPACE::ribbon::kOneIn1000:
454
+ fprintf(stderr, "== Failure: 1/1000\n");
455
+ expected_reseeds = 0.001;
456
+ break;
366
457
  }
367
458
 
368
- std::string prefix;
369
- ROCKSDB_NAMESPACE::PutFixed32(&prefix, rnd.Next());
370
-
371
- // Batch that must be added
372
- std::string added_str = prefix + "added";
373
- KeyGen keys_begin(added_str, 0);
374
- KeyGen keys_end(added_str, num_to_add);
375
-
376
- // A couple more that will probably be added
377
- KeyGen one_more(prefix + "more", 1);
378
- KeyGen two_more(prefix + "more", 2);
379
-
380
- // Batch that may or may not be added
381
- const Index kBatchSize =
382
- sizeof(CoeffRow) == 16 ? 300 : TypeParam::kUseSmash ? 20 : 10;
383
- std::string batch_str = prefix + "batch";
384
- KeyGen batch_begin(batch_str, 0);
385
- KeyGen batch_end(batch_str, kBatchSize);
386
-
387
- // Batch never (successfully) added, but used for querying FP rate
388
- std::string not_str = prefix + "not";
389
- KeyGen other_keys_begin(not_str, 0);
390
- KeyGen other_keys_end(not_str, kNumToCheck);
391
-
392
- // Vary bytes for InterleavedSoln to use number of solution columns
393
- // from 0 to max allowed by ResultRow type (and used by SimpleSoln).
394
- // Specifically include 0 and max, and otherwise skew toward max.
395
- uint32_t max_ibytes = static_cast<uint32_t>(sizeof(ResultRow) * num_slots);
396
- size_t ibytes;
397
- if (i == 0) {
398
- ibytes = 0;
399
- } else if (i == 1) {
400
- ibytes = max_ibytes;
401
- } else {
402
- // Skewed
403
- ibytes = std::max(rnd.Uniformish(max_ibytes), rnd.Uniformish(max_ibytes));
404
- }
405
- std::unique_ptr<char[]> idata(new char[ibytes]);
406
- InterleavedSoln isoln(idata.get(), ibytes);
407
-
408
- SimpleSoln soln;
409
- Hasher hasher;
410
- bool first_single;
411
- bool second_single;
412
- bool batch_success;
413
- {
414
- Banding banding;
415
- // Traditional solve for a fixed set.
416
- ASSERT_TRUE(
417
- banding.ResetAndFindSeedToSolve(num_slots, keys_begin, keys_end));
418
-
419
- // Now to test backtracking, starting with guaranteed fail. By using
420
- // the keys that will be used to test FP rate, we are then doing an
421
- // extra check that after backtracking there are no remnants (e.g. in
422
- // result side of banding) of these entries.
423
- Index occupied_count = banding.GetOccupiedCount();
424
- banding.EnsureBacktrackSize(kNumToCheck);
425
- EXPECT_FALSE(
426
- banding.AddRangeOrRollBack(other_keys_begin, other_keys_end));
427
- EXPECT_EQ(occupied_count, banding.GetOccupiedCount());
428
-
429
- // Check that we still have a good chance of adding a couple more
430
- // individually
431
- first_single = banding.Add(*one_more);
432
- second_single = banding.Add(*two_more);
433
- Index more_added = (first_single ? 1 : 0) + (second_single ? 1 : 0);
434
- total_single_failures += 2U - more_added;
435
-
436
- // Or as a batch
437
- batch_success = banding.AddRangeOrRollBack(batch_begin, batch_end);
438
- if (batch_success) {
439
- more_added += kBatchSize;
440
- ++total_batch_successes;
459
+ uint64_t total_reseeds = 0;
460
+ uint64_t total_singles = 0;
461
+ uint64_t total_single_failures = 0;
462
+ uint64_t total_batch = 0;
463
+ uint64_t total_batch_successes = 0;
464
+ uint64_t total_fp_count = 0;
465
+ uint64_t total_added = 0;
466
+ uint64_t total_expand_trials = 0;
467
+ uint64_t total_expand_failures = 0;
468
+ double total_expand_overhead = 0.0;
469
+
470
+ uint64_t soln_query_nanos = 0;
471
+ uint64_t soln_query_count = 0;
472
+ uint64_t bloom_query_nanos = 0;
473
+ uint64_t isoln_query_nanos = 0;
474
+ uint64_t isoln_query_count = 0;
475
+
476
+ // Take different samples if you change thoroughness
477
+ ROCKSDB_NAMESPACE::Random32 rnd(FLAGS_thoroughness);
478
+
479
+ for (uint32_t i = 0; i < FLAGS_thoroughness; ++i) {
480
+ // We are going to choose num_to_add using an exponential distribution
481
+ // as noted above, but instead of randomly choosing them, we generate
482
+ // samples linearly using the golden ratio, which ensures a nice spread
483
+ // even for a small number of samples, and starting with the minimum
484
+ // number of slots to ensure it is tested.
485
+ double log_add =
486
+ std::fmod(0.6180339887498948482 * diff_log_add * i, diff_log_add) +
487
+ log_min_add;
488
+ uint32_t num_to_add = static_cast<uint32_t>(std::exp(log_add));
489
+
490
+ // Most of the time, test the Interleaved solution storage, but when
491
+ // we do we have to make num_slots a multiple of kCoeffBits. So
492
+ // sometimes we want to test without that limitation.
493
+ bool test_interleaved = (i % 7) != 6;
494
+
495
+ // Compute num_slots, and re-adjust num_to_add to get as close as possible
496
+ // to next num_slots, to stress that num_slots in terms of construction
497
+ // success. Ensure at least one iteration:
498
+ Index num_slots = Index{0} - 1;
499
+ --num_to_add;
500
+ for (;;) {
501
+ Index next_num_slots = SimpleSoln::RoundUpNumSlots(
502
+ ConfigHelper::GetNumSlots(num_to_add + 1, cs));
503
+ if (test_interleaved) {
504
+ next_num_slots = InterleavedSoln::RoundUpNumSlots(next_num_slots);
505
+ // assert idempotent
506
+ EXPECT_EQ(next_num_slots,
507
+ InterleavedSoln::RoundUpNumSlots(next_num_slots));
508
+ }
509
+ // assert idempotent with InterleavedSoln::RoundUpNumSlots
510
+ EXPECT_EQ(next_num_slots, SimpleSoln::RoundUpNumSlots(next_num_slots));
511
+
512
+ if (next_num_slots > num_slots) {
513
+ break;
514
+ }
515
+ num_slots = next_num_slots;
516
+ ++num_to_add;
441
517
  }
442
- EXPECT_LE(banding.GetOccupiedCount(), occupied_count + more_added);
518
+ assert(num_slots < Index{0} - 1);
443
519
 
444
- // Also verify that redundant adds are OK (no effect)
445
- ASSERT_TRUE(
446
- banding.AddRange(keys_begin, KeyGen(added_str, num_to_add / 8)));
447
- EXPECT_LE(banding.GetOccupiedCount(), occupied_count + more_added);
520
+ total_added += num_to_add;
448
521
 
449
- // Now back-substitution
450
- soln.BackSubstFrom(banding);
451
- if (test_interleaved) {
452
- isoln.BackSubstFrom(banding);
453
- }
522
+ std::string prefix;
523
+ ROCKSDB_NAMESPACE::PutFixed32(&prefix, rnd.Next());
524
+
525
+ // Batch that must be added
526
+ std::string added_str = prefix + "added";
527
+ KeyGen keys_begin(added_str, 0);
528
+ KeyGen keys_end(added_str, num_to_add);
454
529
 
455
- Seed reseeds = banding.GetOrdinalSeed();
456
- total_reseeds += reseeds;
530
+ // A couple more that will probably be added
531
+ KeyGen one_more(prefix + "more", 1);
532
+ KeyGen two_more(prefix + "more", 2);
457
533
 
458
- EXPECT_LE(reseeds, 8 + log2_thoroughness);
459
- if (reseeds > log2_thoroughness + 1) {
460
- fprintf(
461
- stderr, "%s high reseeds at %u, %u/%u: %u\n",
462
- reseeds > log2_thoroughness + 8 ? "ERROR Extremely" : "Somewhat",
463
- static_cast<unsigned>(i), static_cast<unsigned>(num_to_add),
464
- static_cast<unsigned>(num_slots), static_cast<unsigned>(reseeds));
534
+ // Batch that may or may not be added
535
+ uint32_t batch_size =
536
+ static_cast<uint32_t>(2.0 * std::sqrt(num_slots - num_to_add));
537
+ if (batch_size < 10U) {
538
+ batch_size = 0;
539
+ }
540
+ std::string batch_str = prefix + "batch";
541
+ KeyGen batch_begin(batch_str, 0);
542
+ KeyGen batch_end(batch_str, batch_size);
543
+
544
+ // Batch never (successfully) added, but used for querying FP rate
545
+ std::string not_str = prefix + "not";
546
+ KeyGen other_keys_begin(not_str, 0);
547
+ KeyGen other_keys_end(not_str, FLAGS_max_check);
548
+
549
+ double overhead_ratio = 1.0 * num_slots / num_to_add;
550
+ if (FLAGS_verbose) {
551
+ fprintf(stderr, "Adding(%s) %u / %u Overhead: %g Batch size: %u\n",
552
+ test_interleaved ? "i" : "s", (unsigned)num_to_add,
553
+ (unsigned)num_slots, overhead_ratio, (unsigned)batch_size);
465
554
  }
466
- hasher.SetOrdinalSeed(reseeds);
467
- }
468
- // soln and hasher now independent of Banding object
469
555
 
470
- // Verify keys added
471
- KeyGen cur = keys_begin;
472
- while (cur != keys_end) {
473
- ASSERT_TRUE(soln.FilterQuery(*cur, hasher));
474
- ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*cur, hasher));
475
- ++cur;
476
- }
477
- // We (maybe) snuck these in!
478
- if (first_single) {
479
- ASSERT_TRUE(soln.FilterQuery(*one_more, hasher));
480
- ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*one_more, hasher));
481
- }
482
- if (second_single) {
483
- ASSERT_TRUE(soln.FilterQuery(*two_more, hasher));
484
- ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*two_more, hasher));
485
- }
486
- if (batch_success) {
487
- cur = batch_begin;
488
- while (cur != batch_end) {
556
+ // Vary bytes for InterleavedSoln to use number of solution columns
557
+ // from 0 to max allowed by ResultRow type (and used by SimpleSoln).
558
+ // Specifically include 0 and max, and otherwise skew toward max.
559
+ uint32_t max_ibytes =
560
+ static_cast<uint32_t>(sizeof(ResultRow) * num_slots);
561
+ size_t ibytes;
562
+ if (i == 0) {
563
+ ibytes = 0;
564
+ } else if (i == 1) {
565
+ ibytes = max_ibytes;
566
+ } else {
567
+ // Skewed
568
+ ibytes =
569
+ std::max(rnd.Uniformish(max_ibytes), rnd.Uniformish(max_ibytes));
570
+ }
571
+ std::unique_ptr<char[]> idata(new char[ibytes]);
572
+ InterleavedSoln isoln(idata.get(), ibytes);
573
+
574
+ SimpleSoln soln;
575
+ Hasher hasher;
576
+ bool first_single;
577
+ bool second_single;
578
+ bool batch_success;
579
+ {
580
+ Banding banding;
581
+ // Traditional solve for a fixed set.
582
+ ASSERT_TRUE(
583
+ banding.ResetAndFindSeedToSolve(num_slots, keys_begin, keys_end));
584
+
585
+ Index occupied_count = banding.GetOccupiedCount();
586
+ Index more_added = 0;
587
+
588
+ if (TypeParam::kHomogeneous || overhead_ratio < 1.01 ||
589
+ batch_size == 0) {
590
+ // Homogeneous not compatible with backtracking because add
591
+ // doesn't fail. Small overhead ratio too packed to expect more
592
+ first_single = false;
593
+ second_single = false;
594
+ batch_success = false;
595
+ } else {
596
+ // Now to test backtracking, starting with guaranteed fail. By using
597
+ // the keys that will be used to test FP rate, we are then doing an
598
+ // extra check that after backtracking there are no remnants (e.g. in
599
+ // result side of banding) of these entries.
600
+ KeyGen other_keys_too_big_end = other_keys_begin;
601
+ other_keys_too_big_end += num_to_add;
602
+ banding.EnsureBacktrackSize(std::max(num_to_add, batch_size));
603
+ EXPECT_FALSE(banding.AddRangeOrRollBack(other_keys_begin,
604
+ other_keys_too_big_end));
605
+ EXPECT_EQ(occupied_count, banding.GetOccupiedCount());
606
+
607
+ // Check that we still have a good chance of adding a couple more
608
+ // individually
609
+ first_single = banding.Add(*one_more);
610
+ second_single = banding.Add(*two_more);
611
+ more_added += (first_single ? 1 : 0) + (second_single ? 1 : 0);
612
+ total_singles += 2U;
613
+ total_single_failures += 2U - more_added;
614
+
615
+ // Or as a batch
616
+ batch_success = banding.AddRangeOrRollBack(batch_begin, batch_end);
617
+ ++total_batch;
618
+ if (batch_success) {
619
+ more_added += batch_size;
620
+ ++total_batch_successes;
621
+ }
622
+ EXPECT_LE(banding.GetOccupiedCount(), occupied_count + more_added);
623
+ }
624
+
625
+ // Also verify that redundant adds are OK (no effect)
626
+ ASSERT_TRUE(
627
+ banding.AddRange(keys_begin, KeyGen(added_str, num_to_add / 8)));
628
+ EXPECT_LE(banding.GetOccupiedCount(), occupied_count + more_added);
629
+
630
+ // Now back-substitution
631
+ soln.BackSubstFrom(banding);
632
+ if (test_interleaved) {
633
+ isoln.BackSubstFrom(banding);
634
+ }
635
+
636
+ Seed reseeds = banding.GetOrdinalSeed();
637
+ total_reseeds += reseeds;
638
+
639
+ EXPECT_LE(reseeds, 8 + log2_thoroughness);
640
+ if (reseeds > log2_thoroughness + 1) {
641
+ fprintf(
642
+ stderr, "%s high reseeds at %u, %u/%u: %u\n",
643
+ reseeds > log2_thoroughness + 8 ? "ERROR Extremely" : "Somewhat",
644
+ static_cast<unsigned>(i), static_cast<unsigned>(num_to_add),
645
+ static_cast<unsigned>(num_slots), static_cast<unsigned>(reseeds));
646
+ }
647
+
648
+ if (reseeds > 0) {
649
+ // "Expand" test: given a failed construction, how likely is it to
650
+ // pass with same seed and more slots. At each step, we increase
651
+ // enough to ensure there is at least one shift within each coeff
652
+ // block.
653
+ ++total_expand_trials;
654
+ Index expand_count = 0;
655
+ Index ex_slots = num_slots;
656
+ banding.SetOrdinalSeed(0);
657
+ for (;; ++expand_count) {
658
+ ASSERT_LE(expand_count, log2_thoroughness);
659
+ ex_slots += ex_slots / kCoeffBits;
660
+ if (test_interleaved) {
661
+ ex_slots = InterleavedSoln::RoundUpNumSlots(ex_slots);
662
+ }
663
+ banding.Reset(ex_slots);
664
+ bool success = banding.AddRange(keys_begin, keys_end);
665
+ if (success) {
666
+ break;
667
+ }
668
+ }
669
+ total_expand_failures += expand_count;
670
+ total_expand_overhead += 1.0 * (ex_slots - num_slots) / num_slots;
671
+ }
672
+
673
+ hasher.SetOrdinalSeed(reseeds);
674
+ }
675
+ // soln and hasher now independent of Banding object
676
+
677
+ // Verify keys added
678
+ KeyGen cur = keys_begin;
679
+ while (cur != keys_end) {
489
680
  ASSERT_TRUE(soln.FilterQuery(*cur, hasher));
490
681
  ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*cur, hasher));
491
682
  ++cur;
492
683
  }
493
- }
494
-
495
- // Check FP rate (depends only on number of result bits == solution columns)
496
- Index fp_count = 0;
497
- cur = other_keys_begin;
498
- {
499
- ROCKSDB_NAMESPACE::StopWatchNano timer(ROCKSDB_NAMESPACE::Env::Default(),
500
- true);
501
- while (cur != other_keys_end) {
502
- bool fp = soln.FilterQuery(*cur, hasher);
503
- fp_count += fp ? 1 : 0;
504
- ++cur;
684
+ // We (maybe) snuck these in!
685
+ if (first_single) {
686
+ ASSERT_TRUE(soln.FilterQuery(*one_more, hasher));
687
+ ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*one_more, hasher));
688
+ }
689
+ if (second_single) {
690
+ ASSERT_TRUE(soln.FilterQuery(*two_more, hasher));
691
+ ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*two_more, hasher));
692
+ }
693
+ if (batch_success) {
694
+ cur = batch_begin;
695
+ while (cur != batch_end) {
696
+ ASSERT_TRUE(soln.FilterQuery(*cur, hasher));
697
+ ASSERT_TRUE(!test_interleaved || isoln.FilterQuery(*cur, hasher));
698
+ ++cur;
699
+ }
505
700
  }
506
- soln_query_nanos += timer.ElapsedNanos();
507
- soln_query_count += kNumToCheck;
508
- }
509
- {
510
- double expected_fp_count = soln.ExpectedFpRate() * kNumToCheck;
511
- // For expected FP rate, also include false positives due to collisions
512
- // in Hash value. (Negligible for 64-bit, can matter for 32-bit.)
513
- double correction =
514
- kNumToCheck * ExpectedCollisionFpRate(hasher, num_to_add);
515
- EXPECT_LE(fp_count,
516
- FrequentPoissonUpperBound(expected_fp_count + correction));
517
- EXPECT_GE(fp_count,
518
- FrequentPoissonLowerBound(expected_fp_count + correction));
519
- }
520
- total_fp_count += fp_count;
521
701
 
522
- // And also check FP rate for isoln
523
- if (test_interleaved) {
524
- Index ifp_count = 0;
702
+ // Check FP rate (depends only on number of result bits == solution
703
+ // columns)
704
+ Index fp_count = 0;
525
705
  cur = other_keys_begin;
526
- ROCKSDB_NAMESPACE::StopWatchNano timer(ROCKSDB_NAMESPACE::Env::Default(),
527
- true);
528
- while (cur != other_keys_end) {
529
- ifp_count += isoln.FilterQuery(*cur, hasher) ? 1 : 0;
530
- ++cur;
706
+ {
707
+ ROCKSDB_NAMESPACE::StopWatchNano timer(
708
+ ROCKSDB_NAMESPACE::SystemClock::Default().get(), true);
709
+ while (cur != other_keys_end) {
710
+ bool fp = soln.FilterQuery(*cur, hasher);
711
+ fp_count += fp ? 1 : 0;
712
+ ++cur;
713
+ }
714
+ soln_query_nanos += timer.ElapsedNanos();
715
+ soln_query_count += FLAGS_max_check;
531
716
  }
532
- isoln_query_nanos += timer.ElapsedNanos();
533
- isoln_query_count += kNumToCheck;
534
717
  {
535
- double expected_fp_count = isoln.ExpectedFpRate() * kNumToCheck;
718
+ double expected_fp_count = soln.ExpectedFpRate() * FLAGS_max_check;
536
719
  // For expected FP rate, also include false positives due to collisions
537
720
  // in Hash value. (Negligible for 64-bit, can matter for 32-bit.)
538
721
  double correction =
539
- kNumToCheck * ExpectedCollisionFpRate(hasher, num_to_add);
540
- EXPECT_LE(ifp_count,
722
+ FLAGS_max_check * ExpectedCollisionFpRate(hasher, num_to_add);
723
+
724
+ // NOTE: rare violations expected with kHomogeneous
725
+ EXPECT_LE(fp_count,
541
726
  FrequentPoissonUpperBound(expected_fp_count + correction));
542
- EXPECT_GE(ifp_count,
727
+ EXPECT_GE(fp_count,
543
728
  FrequentPoissonLowerBound(expected_fp_count + correction));
544
729
  }
545
- // Since the bits used in isoln are a subset of the bits used in soln,
546
- // it cannot have fewer FPs
547
- EXPECT_GE(ifp_count, fp_count);
548
- }
730
+ total_fp_count += fp_count;
549
731
 
550
- // And compare to Bloom time, for fun
551
- if (ibytes >= /* minimum Bloom impl bytes*/ 64) {
552
- Index bfp_count = 0;
553
- cur = other_keys_begin;
554
- ROCKSDB_NAMESPACE::StopWatchNano timer(ROCKSDB_NAMESPACE::Env::Default(),
555
- true);
556
- while (cur != other_keys_end) {
557
- uint64_t h = hasher.GetHash(*cur);
558
- uint32_t h1 = ROCKSDB_NAMESPACE::Lower32of64(h);
559
- uint32_t h2 = sizeof(Hash) >= 8 ? ROCKSDB_NAMESPACE::Upper32of64(h)
560
- : h1 * 0x9e3779b9;
561
- bfp_count += ROCKSDB_NAMESPACE::FastLocalBloomImpl::HashMayMatch(
562
- h1, h2, static_cast<uint32_t>(ibytes), 6, idata.get())
563
- ? 1
564
- : 0;
565
- ++cur;
732
+ // And also check FP rate for isoln
733
+ if (test_interleaved) {
734
+ Index ifp_count = 0;
735
+ cur = other_keys_begin;
736
+ ROCKSDB_NAMESPACE::StopWatchNano timer(
737
+ ROCKSDB_NAMESPACE::SystemClock::Default().get(), true);
738
+ while (cur != other_keys_end) {
739
+ ifp_count += isoln.FilterQuery(*cur, hasher) ? 1 : 0;
740
+ ++cur;
741
+ }
742
+ isoln_query_nanos += timer.ElapsedNanos();
743
+ isoln_query_count += FLAGS_max_check;
744
+ {
745
+ double expected_fp_count = isoln.ExpectedFpRate() * FLAGS_max_check;
746
+ // For expected FP rate, also include false positives due to
747
+ // collisions in Hash value. (Negligible for 64-bit, can matter for
748
+ // 32-bit.)
749
+ double correction =
750
+ FLAGS_max_check * ExpectedCollisionFpRate(hasher, num_to_add);
751
+
752
+ // NOTE: rare violations expected with kHomogeneous
753
+ EXPECT_LE(ifp_count,
754
+ FrequentPoissonUpperBound(expected_fp_count + correction));
755
+
756
+ // FIXME: why sometimes can we slightly "beat the odds"?
757
+ // (0.95 factor should not be needed)
758
+ EXPECT_GE(ifp_count, FrequentPoissonLowerBound(
759
+ 0.95 * expected_fp_count + correction));
760
+ }
761
+ // Since the bits used in isoln are a subset of the bits used in soln,
762
+ // it cannot have fewer FPs
763
+ EXPECT_GE(ifp_count, fp_count);
764
+ }
765
+
766
+ // And compare to Bloom time, for fun
767
+ if (ibytes >= /* minimum Bloom impl bytes*/ 64) {
768
+ Index bfp_count = 0;
769
+ cur = other_keys_begin;
770
+ ROCKSDB_NAMESPACE::StopWatchNano timer(
771
+ ROCKSDB_NAMESPACE::SystemClock::Default().get(), true);
772
+ while (cur != other_keys_end) {
773
+ uint64_t h = hasher.GetHash(*cur);
774
+ uint32_t h1 = ROCKSDB_NAMESPACE::Lower32of64(h);
775
+ uint32_t h2 = sizeof(Hash) >= 8 ? ROCKSDB_NAMESPACE::Upper32of64(h)
776
+ : h1 * 0x9e3779b9;
777
+ bfp_count +=
778
+ ROCKSDB_NAMESPACE::FastLocalBloomImpl::HashMayMatch(
779
+ h1, h2, static_cast<uint32_t>(ibytes), 6, idata.get())
780
+ ? 1
781
+ : 0;
782
+ ++cur;
783
+ }
784
+ bloom_query_nanos += timer.ElapsedNanos();
785
+ // ensure bfp_count is used
786
+ ASSERT_LT(bfp_count, FLAGS_max_check);
566
787
  }
567
- bloom_query_nanos += timer.ElapsedNanos();
568
- // ensure bfp_count is used
569
- ASSERT_LT(bfp_count, kNumToCheck);
570
788
  }
571
- }
572
789
 
573
- // "outside" == key not in original set so either negative or false positive
574
- fprintf(stderr, "Simple outside query, hot, incl hashing, ns/key: %g\n",
575
- 1.0 * soln_query_nanos / soln_query_count);
576
- fprintf(stderr, "Interleaved outside query, hot, incl hashing, ns/key: %g\n",
577
- 1.0 * isoln_query_nanos / isoln_query_count);
578
- fprintf(stderr, "Bloom outside query, hot, incl hashing, ns/key: %g\n",
579
- 1.0 * bloom_query_nanos / soln_query_count);
790
+ // "outside" == key not in original set so either negative or false positive
791
+ fprintf(stderr,
792
+ "Simple outside query, hot, incl hashing, ns/key: %g\n",
793
+ 1.0 * soln_query_nanos / soln_query_count);
794
+ fprintf(stderr,
795
+ "Interleaved outside query, hot, incl hashing, ns/key: %g\n",
796
+ 1.0 * isoln_query_nanos / isoln_query_count);
797
+ fprintf(stderr,
798
+ "Bloom outside query, hot, incl hashing, ns/key: %g\n",
799
+ 1.0 * bloom_query_nanos / soln_query_count);
800
+
801
+ if (TypeParam::kHomogeneous) {
802
+ EXPECT_EQ(total_reseeds, 0U);
803
+ } else {
804
+ double average_reseeds = 1.0 * total_reseeds / FLAGS_thoroughness;
805
+ fprintf(stderr, "Average re-seeds: %g\n", average_reseeds);
806
+ // Values above were chosen to target around 50% chance of encoding
807
+ // success rate (average of 1.0 re-seeds) or slightly better. But 1.15 is
808
+ // also close enough.
809
+ EXPECT_LE(total_reseeds,
810
+ InfrequentPoissonUpperBound(1.15 * expected_reseeds *
811
+ FLAGS_thoroughness));
812
+ // Would use 0.85 here instead of 0.75, but
813
+ // TypesAndSettings_Hash32_SmallKeyGen can "beat the odds" because of
814
+ // sequential keys with a small, cheap hash function. We accept that
815
+ // there are surely inputs that are somewhat bad for this setup, but
816
+ // these somewhat good inputs are probably more likely.
817
+ EXPECT_GE(total_reseeds,
818
+ InfrequentPoissonLowerBound(0.75 * expected_reseeds *
819
+ FLAGS_thoroughness));
820
+ }
580
821
 
581
- {
582
- double average_reseeds = 1.0 * total_reseeds / FLAGS_thoroughness;
583
- fprintf(stderr, "Average re-seeds: %g\n", average_reseeds);
584
- // Values above were chosen to target around 50% chance of encoding success
585
- // rate (average of 1.0 re-seeds) or slightly better. But 1.15 is also close
586
- // enough.
587
- EXPECT_LE(total_reseeds,
588
- InfrequentPoissonUpperBound(1.15 * FLAGS_thoroughness));
589
- // Would use 0.85 here instead of 0.75, but
590
- // TypesAndSettings_Hash32_SmallKeyGen can "beat the odds" because of
591
- // sequential keys with a small, cheap hash function. We accept that
592
- // there are surely inputs that are somewhat bad for this setup, but
593
- // these somewhat good inputs are probably more likely.
594
- EXPECT_GE(total_reseeds,
595
- InfrequentPoissonLowerBound(0.75 * FLAGS_thoroughness));
596
- }
822
+ if (total_expand_trials > 0) {
823
+ double average_expand_failures =
824
+ 1.0 * total_expand_failures / total_expand_trials;
825
+ fprintf(stderr, "Average expand failures, and overhead: %g, %g\n",
826
+ average_expand_failures,
827
+ total_expand_overhead / total_expand_trials);
828
+ // Seems to be a generous allowance
829
+ EXPECT_LE(total_expand_failures,
830
+ InfrequentPoissonUpperBound(1.0 * total_expand_trials));
831
+ } else {
832
+ fprintf(stderr, "Average expand failures: N/A\n");
833
+ }
597
834
 
598
- {
599
- uint64_t total_singles = 2 * FLAGS_thoroughness;
600
- double single_failure_rate = 1.0 * total_single_failures / total_singles;
601
- fprintf(stderr, "Add'l single, failure rate: %g\n", single_failure_rate);
602
- // A rough bound (one sided) based on nothing in particular
603
- double expected_single_failures =
604
- 1.0 * total_singles /
605
- (sizeof(CoeffRow) == 16 ? 128 : TypeParam::kUseSmash ? 64 : 32);
606
- EXPECT_LE(total_single_failures,
607
- InfrequentPoissonUpperBound(expected_single_failures));
608
- }
835
+ if (total_singles > 0) {
836
+ double single_failure_rate = 1.0 * total_single_failures / total_singles;
837
+ fprintf(stderr, "Add'l single, failure rate: %g\n", single_failure_rate);
838
+ // A rough bound (one sided) based on nothing in particular
839
+ double expected_single_failures =
840
+ 1.0 * total_singles /
841
+ (sizeof(CoeffRow) == 16 ? 128 : TypeParam::kUseSmash ? 64 : 32);
842
+ EXPECT_LE(total_single_failures,
843
+ InfrequentPoissonUpperBound(expected_single_failures));
844
+ }
609
845
 
610
- {
611
- // Counting successes here for Poisson to approximate the Binomial
612
- // distribution.
613
- // A rough bound (one sided) based on nothing in particular.
614
- double expected_batch_successes = 1.0 * FLAGS_thoroughness / 2;
615
- uint64_t lower_bound =
616
- InfrequentPoissonLowerBound(expected_batch_successes);
617
- fprintf(stderr, "Add'l batch, success rate: %g (>= %g)\n",
618
- 1.0 * total_batch_successes / FLAGS_thoroughness,
619
- 1.0 * lower_bound / FLAGS_thoroughness);
620
- EXPECT_GE(total_batch_successes, lower_bound);
621
- }
846
+ if (total_batch > 0) {
847
+ // Counting successes here for Poisson to approximate the Binomial
848
+ // distribution.
849
+ // A rough bound (one sided) based on nothing in particular.
850
+ double expected_batch_successes = 1.0 * total_batch / 2;
851
+ uint64_t lower_bound =
852
+ InfrequentPoissonLowerBound(expected_batch_successes);
853
+ fprintf(stderr, "Add'l batch, success rate: %g (>= %g)\n",
854
+ 1.0 * total_batch_successes / total_batch,
855
+ 1.0 * lower_bound / total_batch);
856
+ EXPECT_GE(total_batch_successes, lower_bound);
857
+ }
622
858
 
623
- {
624
- uint64_t total_checked = uint64_t{kNumToCheck} * FLAGS_thoroughness;
625
- double expected_total_fp_count =
626
- total_checked * std::pow(0.5, 8U * sizeof(ResultRow));
627
- // For expected FP rate, also include false positives due to collisions
628
- // in Hash value. (Negligible for 64-bit, can matter for 32-bit.)
629
- double average_added = 1.0 * total_added / FLAGS_thoroughness;
630
- expected_total_fp_count +=
631
- total_checked * ExpectedCollisionFpRate(Hasher(), average_added);
632
-
633
- uint64_t upper_bound = InfrequentPoissonUpperBound(expected_total_fp_count);
634
- uint64_t lower_bound = InfrequentPoissonLowerBound(expected_total_fp_count);
635
- fprintf(stderr, "Average FP rate: %g (~= %g, <= %g, >= %g)\n",
636
- 1.0 * total_fp_count / total_checked,
637
- expected_total_fp_count / total_checked,
638
- 1.0 * upper_bound / total_checked,
639
- 1.0 * lower_bound / total_checked);
640
- EXPECT_LE(total_fp_count, upper_bound);
641
- EXPECT_GE(total_fp_count, lower_bound);
859
+ {
860
+ uint64_t total_checked = uint64_t{FLAGS_max_check} * FLAGS_thoroughness;
861
+ double expected_total_fp_count =
862
+ total_checked * std::pow(0.5, 8U * sizeof(ResultRow));
863
+ // For expected FP rate, also include false positives due to collisions
864
+ // in Hash value. (Negligible for 64-bit, can matter for 32-bit.)
865
+ double average_added = 1.0 * total_added / FLAGS_thoroughness;
866
+ expected_total_fp_count +=
867
+ total_checked * ExpectedCollisionFpRate(Hasher(), average_added);
868
+
869
+ uint64_t upper_bound =
870
+ InfrequentPoissonUpperBound(expected_total_fp_count);
871
+ uint64_t lower_bound =
872
+ InfrequentPoissonLowerBound(expected_total_fp_count);
873
+ fprintf(stderr, "Average FP rate: %g (~= %g, <= %g, >= %g)\n",
874
+ 1.0 * total_fp_count / total_checked,
875
+ expected_total_fp_count / total_checked,
876
+ 1.0 * upper_bound / total_checked,
877
+ 1.0 * lower_bound / total_checked);
878
+ EXPECT_LE(total_fp_count, upper_bound);
879
+ EXPECT_GE(total_fp_count, lower_bound);
880
+ }
642
881
  }
643
882
  }
644
883
 
@@ -671,9 +910,8 @@ TYPED_TEST(RibbonTypeParamTest, Extremes) {
671
910
 
672
911
  // Somewhat oddly, we expect same FP rate as if we had essentially filled
673
912
  // up the slots.
674
- constexpr Index kNumToCheck = 100000;
675
913
  KeyGen other_keys_begin("not", 0);
676
- KeyGen other_keys_end("not", kNumToCheck);
914
+ KeyGen other_keys_end("not", FLAGS_max_check);
677
915
 
678
916
  Index fp_count = 0;
679
917
  KeyGen cur = other_keys_begin;
@@ -682,19 +920,25 @@ TYPED_TEST(RibbonTypeParamTest, Extremes) {
682
920
  bool soln_query_result = soln.FilterQuery(*cur, hasher);
683
921
  // Solutions are equivalent
684
922
  ASSERT_EQ(isoln_query_result, soln_query_result);
685
- // And in fact we only expect an FP when ResultRow is 0
686
- // CHANGE: no longer true because of filling some unused slots
687
- // with pseudorandom values.
688
- // ASSERT_EQ(soln_query_result, hasher.GetResultRowFromHash(
689
- // hasher.GetHash(*cur)) == ResultRow{0});
923
+ if (!TypeParam::kHomogeneous) {
924
+ // And in fact we only expect an FP when ResultRow is 0
925
+ // (except Homogeneous)
926
+ ASSERT_EQ(soln_query_result, hasher.GetResultRowFromHash(
927
+ hasher.GetHash(*cur)) == ResultRow{0});
928
+ }
690
929
  fp_count += soln_query_result ? 1 : 0;
691
930
  ++cur;
692
931
  }
693
932
  {
694
933
  ASSERT_EQ(isoln.ExpectedFpRate(), soln.ExpectedFpRate());
695
- double expected_fp_count = isoln.ExpectedFpRate() * kNumToCheck;
934
+ double expected_fp_count = isoln.ExpectedFpRate() * FLAGS_max_check;
696
935
  EXPECT_LE(fp_count, InfrequentPoissonUpperBound(expected_fp_count));
697
- EXPECT_GE(fp_count, InfrequentPoissonLowerBound(expected_fp_count));
936
+ if (TypeParam::kHomogeneous) {
937
+ // Pseudorandom garbage in Homogeneous filter can "beat the odds" if
938
+ // nothing added
939
+ } else {
940
+ EXPECT_GE(fp_count, InfrequentPoissonLowerBound(expected_fp_count));
941
+ }
698
942
  }
699
943
 
700
944
  // ######################################################
@@ -873,45 +1117,112 @@ TEST(RibbonTest, PhsfBasic) {
873
1117
  }
874
1118
  }
875
1119
 
876
- // Not a real test, but a tool used to build GetNumSlotsFor95PctSuccess
877
- TYPED_TEST(RibbonTypeParamTest, FindOccupancyForSuccessRate) {
1120
+ // Not a real test, but a tool used to build APIs in ribbon_config.h
1121
+ TYPED_TEST(RibbonTypeParamTest, FindOccupancy) {
878
1122
  IMPORT_RIBBON_TYPES_AND_SETTINGS(TypeParam);
879
1123
  IMPORT_RIBBON_IMPL_TYPES(TypeParam);
880
1124
  using KeyGen = typename TypeParam::KeyGen;
881
1125
 
882
1126
  if (!FLAGS_find_occ) {
883
- fprintf(stderr, "Tool disabled during unit test runs\n");
1127
+ ROCKSDB_GTEST_BYPASS("Tool disabled during unit test runs");
884
1128
  return;
885
1129
  }
886
1130
 
887
- KeyGen cur("blah", 0);
1131
+ KeyGen cur(ROCKSDB_NAMESPACE::ToString(
1132
+ testing::UnitTest::GetInstance()->random_seed()),
1133
+ 0);
888
1134
 
889
1135
  Banding banding;
890
1136
  Index num_slots = InterleavedSoln::RoundUpNumSlots(FLAGS_find_min_slots);
891
- while (num_slots < FLAGS_find_max_slots) {
892
- double factor = 0.95;
893
- double delta = FLAGS_find_delta_start;
894
- while (delta > FLAGS_find_delta_end) {
895
- Index num_to_add = static_cast<Index>(factor * num_slots);
1137
+ Index max_slots = InterleavedSoln::RoundUpNumSlots(FLAGS_find_max_slots);
1138
+ while (num_slots <= max_slots) {
1139
+ std::map<int32_t, uint32_t> rem_histogram;
1140
+ std::map<Index, uint32_t> slot_histogram;
1141
+ if (FLAGS_find_slot_occ) {
1142
+ for (Index i = 0; i < kCoeffBits; ++i) {
1143
+ slot_histogram[i] = 0;
1144
+ slot_histogram[num_slots - 1 - i] = 0;
1145
+ slot_histogram[num_slots / 2 - kCoeffBits / 2 + i] = 0;
1146
+ }
1147
+ }
1148
+ uint64_t total_added = 0;
1149
+ for (uint32_t i = 0; i < FLAGS_find_iters; ++i) {
1150
+ banding.Reset(num_slots);
1151
+ uint32_t j = 0;
896
1152
  KeyGen end = cur;
897
- end += num_to_add;
898
- bool success = banding.ResetAndFindSeedToSolve(num_slots, cur, end, 0, 0);
899
- cur = end; // fresh keys
900
- if (success) {
901
- factor += delta * (1.0 - FLAGS_find_success);
902
- factor = std::min(factor, 1.0);
903
- } else {
904
- factor -= delta * FLAGS_find_success;
905
- factor = std::max(factor, 0.0);
1153
+ end += num_slots + num_slots / 10;
1154
+ for (; cur != end; ++cur) {
1155
+ if (banding.Add(*cur)) {
1156
+ ++j;
1157
+ } else {
1158
+ break;
1159
+ }
1160
+ }
1161
+ total_added += j;
1162
+ for (auto& slot : slot_histogram) {
1163
+ slot.second += banding.IsOccupied(slot.first);
1164
+ }
1165
+
1166
+ int32_t bucket =
1167
+ static_cast<int32_t>(num_slots) - static_cast<int32_t>(j);
1168
+ rem_histogram[bucket]++;
1169
+ if (FLAGS_verbose) {
1170
+ fprintf(stderr, "num_slots: %u i: %u / %u avg_overhead: %g\r",
1171
+ static_cast<unsigned>(num_slots), static_cast<unsigned>(i),
1172
+ static_cast<unsigned>(FLAGS_find_iters),
1173
+ 1.0 * (i + 1) * num_slots / total_added);
906
1174
  }
907
- delta *= FLAGS_find_delta_shrink;
908
- fprintf(stderr,
909
- "slots: %u log2_slots: %g target_success: %g ->overhead: %g\r",
910
- static_cast<unsigned>(num_slots),
911
- std::log(num_slots * 1.0) / std::log(2.0), FLAGS_find_success,
912
- 1.0 / factor);
913
1175
  }
914
- fprintf(stderr, "\n");
1176
+ if (FLAGS_verbose) {
1177
+ fprintf(stderr, "\n");
1178
+ }
1179
+
1180
+ uint32_t cumulative = 0;
1181
+
1182
+ double p50_rem = 0;
1183
+ double p95_rem = 0;
1184
+ double p99_9_rem = 0;
1185
+
1186
+ for (auto& h : rem_histogram) {
1187
+ double before = 1.0 * cumulative / FLAGS_find_iters;
1188
+ double not_after = 1.0 * (cumulative + h.second) / FLAGS_find_iters;
1189
+ if (FLAGS_verbose) {
1190
+ fprintf(stderr, "overhead: %g before: %g not_after: %g\n",
1191
+ 1.0 * num_slots / (num_slots - h.first), before, not_after);
1192
+ }
1193
+ cumulative += h.second;
1194
+ if (before < 0.5 && 0.5 <= not_after) {
1195
+ // fake it with linear interpolation
1196
+ double portion = (0.5 - before) / (not_after - before);
1197
+ p50_rem = h.first + portion;
1198
+ } else if (before < 0.95 && 0.95 <= not_after) {
1199
+ // fake it with linear interpolation
1200
+ double portion = (0.95 - before) / (not_after - before);
1201
+ p95_rem = h.first + portion;
1202
+ } else if (before < 0.999 && 0.999 <= not_after) {
1203
+ // fake it with linear interpolation
1204
+ double portion = (0.999 - before) / (not_after - before);
1205
+ p99_9_rem = h.first + portion;
1206
+ }
1207
+ }
1208
+ for (auto& slot : slot_histogram) {
1209
+ fprintf(stderr, "slot[%u] occupied: %g\n", (unsigned)slot.first,
1210
+ 1.0 * slot.second / FLAGS_find_iters);
1211
+ }
1212
+
1213
+ double mean_rem =
1214
+ (1.0 * FLAGS_find_iters * num_slots - total_added) / FLAGS_find_iters;
1215
+ fprintf(
1216
+ stderr,
1217
+ "num_slots: %u iters: %u mean_ovr: %g p50_ovr: %g p95_ovr: %g "
1218
+ "p99.9_ovr: %g mean_rem: %g p50_rem: %g p95_rem: %g p99.9_rem: %g\n",
1219
+ static_cast<unsigned>(num_slots),
1220
+ static_cast<unsigned>(FLAGS_find_iters),
1221
+ 1.0 * num_slots / (num_slots - mean_rem),
1222
+ 1.0 * num_slots / (num_slots - p50_rem),
1223
+ 1.0 * num_slots / (num_slots - p95_rem),
1224
+ 1.0 * num_slots / (num_slots - p99_9_rem), mean_rem, p50_rem, p95_rem,
1225
+ p99_9_rem);
915
1226
 
916
1227
  num_slots = std::max(
917
1228
  num_slots + 1, static_cast<Index>(num_slots * FLAGS_find_next_factor));
@@ -919,8 +1230,74 @@ TYPED_TEST(RibbonTypeParamTest, FindOccupancyForSuccessRate) {
919
1230
  }
920
1231
  }
921
1232
 
922
- // TODO: unit tests for configuration APIs
923
- // TODO: unit tests for small filter FP rates
1233
+ // Not a real test, but a tool to understand Homogeneous Ribbon
1234
+ // behavior (TODO: configuration APIs & tests)
1235
+ TYPED_TEST(RibbonTypeParamTest, OptimizeHomogAtScale) {
1236
+ IMPORT_RIBBON_TYPES_AND_SETTINGS(TypeParam);
1237
+ IMPORT_RIBBON_IMPL_TYPES(TypeParam);
1238
+ using KeyGen = typename TypeParam::KeyGen;
1239
+
1240
+ if (!FLAGS_optimize_homog) {
1241
+ ROCKSDB_GTEST_BYPASS("Tool disabled during unit test runs");
1242
+ return;
1243
+ }
1244
+
1245
+ if (!TypeParam::kHomogeneous) {
1246
+ ROCKSDB_GTEST_BYPASS("Only for Homogeneous Ribbon");
1247
+ return;
1248
+ }
1249
+
1250
+ KeyGen cur(ROCKSDB_NAMESPACE::ToString(
1251
+ testing::UnitTest::GetInstance()->random_seed()),
1252
+ 0);
1253
+
1254
+ Banding banding;
1255
+ Index num_slots = SimpleSoln::RoundUpNumSlots(FLAGS_optimize_homog_slots);
1256
+ banding.Reset(num_slots);
1257
+
1258
+ // This and "band_ovr" is the "allocated overhead", or slots over added.
1259
+ // It does not take into account FP rates.
1260
+ double target_overhead = 1.20;
1261
+ uint32_t num_added = 0;
1262
+
1263
+ do {
1264
+ do {
1265
+ (void)banding.Add(*cur);
1266
+ ++cur;
1267
+ ++num_added;
1268
+ } while (1.0 * num_slots / num_added > target_overhead);
1269
+
1270
+ SimpleSoln soln;
1271
+ soln.BackSubstFrom(banding);
1272
+
1273
+ std::array<uint32_t, 8U * sizeof(ResultRow)> fp_counts_by_cols;
1274
+ fp_counts_by_cols.fill(0U);
1275
+ for (uint32_t i = 0; i < FLAGS_optimize_homog_check; ++i) {
1276
+ ResultRow r = soln.PhsfQuery(*cur, banding);
1277
+ ++cur;
1278
+ for (size_t j = 0; j < fp_counts_by_cols.size(); ++j) {
1279
+ if ((r & 1) == 1) {
1280
+ break;
1281
+ }
1282
+ fp_counts_by_cols[j]++;
1283
+ r /= 2;
1284
+ }
1285
+ }
1286
+ fprintf(stderr, "band_ovr: %g ", 1.0 * num_slots / num_added);
1287
+ for (unsigned j = 0; j < fp_counts_by_cols.size(); ++j) {
1288
+ double inv_fp_rate =
1289
+ 1.0 * FLAGS_optimize_homog_check / fp_counts_by_cols[j];
1290
+ double equiv_cols = std::log(inv_fp_rate) * 1.4426950409;
1291
+ // Overhead vs. information-theoretic minimum based on observed
1292
+ // FP rate (subject to sampling error, especially for low FP rates)
1293
+ double actual_overhead =
1294
+ 1.0 * (j + 1) * num_slots / (equiv_cols * num_added);
1295
+ fprintf(stderr, "ovr_%u: %g ", j + 1, actual_overhead);
1296
+ }
1297
+ fprintf(stderr, "\n");
1298
+ target_overhead -= FLAGS_optimize_homog_granularity;
1299
+ } while (target_overhead > 1.0);
1300
+ }
924
1301
 
925
1302
  int main(int argc, char** argv) {
926
1303
  ::testing::InitGoogleTest(&argc, argv);