@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  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/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -19,6 +19,7 @@
19
19
  #include "port/port.h"
20
20
  #include "rocksdb/cache.h"
21
21
  #include "rocksdb/convenience.h"
22
+ #include "rocksdb/file_checksum.h"
22
23
  #include "rocksdb/memtablerep.h"
23
24
  #include "rocksdb/utilities/leveldb_options.h"
24
25
  #include "rocksdb/utilities/object_registry.h"
@@ -30,6 +31,9 @@
30
31
  #include "util/stderr_logger.h"
31
32
  #include "util/string_util.h"
32
33
  #include "utilities/merge_operators/bytesxor.h"
34
+ #include "utilities/merge_operators/sortlist.h"
35
+ #include "utilities/merge_operators/string_append/stringappend.h"
36
+ #include "utilities/merge_operators/string_append/stringappend2.h"
33
37
 
34
38
  #ifndef GFLAGS
35
39
  bool FLAGS_enable_print = false;
@@ -76,8 +80,6 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
76
80
  {"max_bytes_for_level_multiplier", "15.0"},
77
81
  {"max_bytes_for_level_multiplier_additional", "16:17:18"},
78
82
  {"max_compaction_bytes", "21"},
79
- {"soft_rate_limit", "1.1"},
80
- {"hard_rate_limit", "2.1"},
81
83
  {"hard_pending_compaction_bytes_limit", "211"},
82
84
  {"arena_block_size", "22"},
83
85
  {"disable_auto_compactions", "true"},
@@ -89,6 +91,7 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
89
91
  {"inplace_update_support", "true"},
90
92
  {"report_bg_io_stats", "true"},
91
93
  {"compaction_measure_io_stats", "false"},
94
+ {"purge_redundant_kvs_while_flush", "false"},
92
95
  {"inplace_update_num_locks", "25"},
93
96
  {"memtable_prefix_bloom_size_ratio", "0.26"},
94
97
  {"memtable_whole_key_filtering", "true"},
@@ -104,6 +107,9 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
104
107
  {"blob_compression_type", "kZSTD"},
105
108
  {"enable_blob_garbage_collection", "true"},
106
109
  {"blob_garbage_collection_age_cutoff", "0.5"},
110
+ {"blob_garbage_collection_force_threshold", "0.75"},
111
+ {"blob_compaction_readahead_size", "256K"},
112
+ {"bottommost_temperature", "kWarm"},
107
113
  };
108
114
 
109
115
  std::unordered_map<std::string, std::string> db_options_map = {
@@ -140,14 +146,15 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
140
146
  {"persist_stats_to_disk", "false"},
141
147
  {"stats_history_buffer_size", "69"},
142
148
  {"advise_random_on_open", "true"},
149
+ {"experimental_mempurge_threshold", "0.0"},
143
150
  {"use_adaptive_mutex", "false"},
144
- {"new_table_reader_for_compaction_inputs", "true"},
145
151
  {"compaction_readahead_size", "100"},
146
152
  {"random_access_max_buffer_size", "3145728"},
147
153
  {"writable_file_max_buffer_size", "314159"},
148
154
  {"bytes_per_sync", "47"},
149
155
  {"wal_bytes_per_sync", "48"},
150
156
  {"strict_bytes_per_sync", "true"},
157
+ {"preserve_deletes", "false"},
151
158
  };
152
159
 
153
160
  ColumnFamilyOptions base_cf_opt;
@@ -227,14 +234,16 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
227
234
  ASSERT_EQ(new_cf_opt.max_successive_merges, 30U);
228
235
  ASSERT_TRUE(new_cf_opt.prefix_extractor != nullptr);
229
236
  ASSERT_EQ(new_cf_opt.optimize_filters_for_hits, true);
230
- ASSERT_EQ(std::string(new_cf_opt.prefix_extractor->Name()),
231
- "rocksdb.FixedPrefix.31");
237
+ ASSERT_EQ(new_cf_opt.prefix_extractor->AsString(), "rocksdb.FixedPrefix.31");
232
238
  ASSERT_EQ(new_cf_opt.enable_blob_files, true);
233
239
  ASSERT_EQ(new_cf_opt.min_blob_size, 1ULL << 10);
234
240
  ASSERT_EQ(new_cf_opt.blob_file_size, 1ULL << 30);
235
241
  ASSERT_EQ(new_cf_opt.blob_compression_type, kZSTD);
236
242
  ASSERT_EQ(new_cf_opt.enable_blob_garbage_collection, true);
237
243
  ASSERT_EQ(new_cf_opt.blob_garbage_collection_age_cutoff, 0.5);
244
+ ASSERT_EQ(new_cf_opt.blob_garbage_collection_force_threshold, 0.75);
245
+ ASSERT_EQ(new_cf_opt.blob_compaction_readahead_size, 262144);
246
+ ASSERT_EQ(new_cf_opt.bottommost_temperature, Temperature::kWarm);
238
247
 
239
248
  cf_options_map["write_buffer_size"] = "hello";
240
249
  ASSERT_NOK(GetColumnFamilyOptionsFromMap(exact, base_cf_opt, cf_options_map,
@@ -292,14 +301,13 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
292
301
  ASSERT_EQ(new_db_opt.use_direct_reads, false);
293
302
  ASSERT_EQ(new_db_opt.use_direct_io_for_flush_and_compaction, false);
294
303
  ASSERT_EQ(new_db_opt.is_fd_close_on_exec, true);
295
- ASSERT_EQ(new_db_opt.skip_log_error_on_recovery, false);
296
304
  ASSERT_EQ(new_db_opt.stats_dump_period_sec, 46U);
297
305
  ASSERT_EQ(new_db_opt.stats_persist_period_sec, 57U);
298
306
  ASSERT_EQ(new_db_opt.persist_stats_to_disk, false);
299
307
  ASSERT_EQ(new_db_opt.stats_history_buffer_size, 69U);
300
308
  ASSERT_EQ(new_db_opt.advise_random_on_open, true);
309
+ ASSERT_EQ(new_db_opt.experimental_mempurge_threshold, 0.0);
301
310
  ASSERT_EQ(new_db_opt.use_adaptive_mutex, false);
302
- ASSERT_EQ(new_db_opt.new_table_reader_for_compaction_inputs, true);
303
311
  ASSERT_EQ(new_db_opt.compaction_readahead_size, 100);
304
312
  ASSERT_EQ(new_db_opt.random_access_max_buffer_size, 3145728);
305
313
  ASSERT_EQ(new_db_opt.writable_file_max_buffer_size, 314159);
@@ -379,7 +387,7 @@ TEST_F(OptionsTest, GetColumnFamilyOptionsFromStringTest) {
379
387
 
380
388
  // Comparator from object registry
381
389
  std::string kCompName = "reverse_comp";
382
- ObjectLibrary::Default()->Register<const Comparator>(
390
+ ObjectLibrary::Default()->AddFactory<const Comparator>(
383
391
  kCompName,
384
392
  [](const std::string& /*name*/,
385
393
  std::unique_ptr<const Comparator>* /*guard*/,
@@ -393,13 +401,6 @@ TEST_F(OptionsTest, GetColumnFamilyOptionsFromStringTest) {
393
401
  // MergeOperator from object registry
394
402
  std::unique_ptr<BytesXOROperator> bxo(new BytesXOROperator());
395
403
  std::string kMoName = bxo->Name();
396
- ObjectLibrary::Default()->Register<MergeOperator>(
397
- kMoName,
398
- [](const std::string& /*name*/, std::unique_ptr<MergeOperator>* guard,
399
- std::string* /* errmsg */) {
400
- guard->reset(new BytesXOROperator());
401
- return guard->get();
402
- });
403
404
 
404
405
  ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
405
406
  "merge_operator=" + kMoName + ";",
@@ -458,8 +459,7 @@ TEST_F(OptionsTest, GetColumnFamilyOptionsFromStringTest) {
458
459
  ASSERT_EQ(new_cf_opt.write_buffer_size, 18 * giga);
459
460
  ASSERT_EQ(new_cf_opt.arena_block_size, 19 * giga);
460
461
  ASSERT_TRUE(new_cf_opt.prefix_extractor.get() != nullptr);
461
- std::string prefix_name(new_cf_opt.prefix_extractor->Name());
462
- ASSERT_EQ(prefix_name, "rocksdb.CappedPrefix.8");
462
+ ASSERT_EQ(new_cf_opt.prefix_extractor->AsString(), "rocksdb.CappedPrefix.8");
463
463
 
464
464
  // Units (t)
465
465
  ASSERT_OK(GetColumnFamilyOptionsFromString(
@@ -577,6 +577,7 @@ TEST_F(OptionsTest, GetColumnFamilyOptionsFromStringTest) {
577
577
  &new_cf_opt));
578
578
  ASSERT_TRUE(new_cf_opt.memtable_factory != nullptr);
579
579
  ASSERT_EQ(std::string(new_cf_opt.memtable_factory->Name()), "SkipListFactory");
580
+ ASSERT_TRUE(new_cf_opt.memtable_factory->IsInstanceOf("SkipListFactory"));
580
581
  }
581
582
 
582
583
  TEST_F(OptionsTest, CompressionOptionsFromString) {
@@ -725,12 +726,18 @@ TEST_F(OptionsTest, CompressionOptionsFromString) {
725
726
  ASSERT_OK(GetColumnFamilyOptionsFromString(
726
727
  ignore, ColumnFamilyOptions(), "compression_opts=5:6:7:8:9:x:false",
727
728
  &base_cf_opt));
728
- ASSERT_NOK(GetColumnFamilyOptionsFromString(
729
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
729
730
  config_options, ColumnFamilyOptions(),
730
731
  "compression_opts=1:2:3:4:5:6:true:8", &base_cf_opt));
731
732
  ASSERT_OK(GetColumnFamilyOptionsFromString(
732
733
  ignore, ColumnFamilyOptions(), "compression_opts=1:2:3:4:5:6:true:8",
733
734
  &base_cf_opt));
735
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
736
+ config_options, ColumnFamilyOptions(),
737
+ "compression_opts=1:2:3:4:5:6:true:8:9", &base_cf_opt));
738
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
739
+ ignore, ColumnFamilyOptions(), "compression_opts=1:2:3:4:5:6:true:8:9",
740
+ &base_cf_opt));
734
741
  ASSERT_NOK(GetColumnFamilyOptionsFromString(
735
742
  config_options, ColumnFamilyOptions(), "compression_opts={unknown=bad;}",
736
743
  &base_cf_opt));
@@ -837,16 +844,20 @@ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
837
844
  ConfigOptions config_options;
838
845
  config_options.input_strings_escaped = false;
839
846
  config_options.ignore_unknown_options = false;
847
+ config_options.ignore_unsupported_options = false;
840
848
 
841
849
  // make sure default values are overwritten by something else
842
850
  ASSERT_OK(GetBlockBasedTableOptionsFromString(
843
851
  config_options, table_opt,
844
852
  "cache_index_and_filter_blocks=1;index_type=kHashSearch;"
845
- "checksum=kxxHash;hash_index_allow_collision=1;"
853
+ "checksum=kxxHash;"
846
854
  "block_cache=1M;block_cache_compressed=1k;block_size=1024;"
847
855
  "block_size_deviation=8;block_restart_interval=4;"
848
856
  "format_version=5;whole_key_filtering=1;"
849
- "filter_policy=bloomfilter:4.567:false;"
857
+ "reserve_table_builder_memory=true;"
858
+ "reserve_table_reader_memory=true;"
859
+ "filter_policy=bloomfilter:4.567:false;detect_filter_construct_"
860
+ "corruption=true;"
850
861
  // A bug caused read_amp_bytes_per_bit to be a large integer in OPTIONS
851
862
  // file generated by 6.10 to 6.14. Though bug is fixed in these releases,
852
863
  // we need to handle the case of loading OPTIONS file generated before the
@@ -856,7 +867,6 @@ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
856
867
  ASSERT_TRUE(new_opt.cache_index_and_filter_blocks);
857
868
  ASSERT_EQ(new_opt.index_type, BlockBasedTableOptions::kHashSearch);
858
869
  ASSERT_EQ(new_opt.checksum, ChecksumType::kxxHash);
859
- ASSERT_TRUE(new_opt.hash_index_allow_collision);
860
870
  ASSERT_TRUE(new_opt.block_cache != nullptr);
861
871
  ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
862
872
  ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
@@ -866,12 +876,14 @@ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
866
876
  ASSERT_EQ(new_opt.block_restart_interval, 4);
867
877
  ASSERT_EQ(new_opt.format_version, 5U);
868
878
  ASSERT_EQ(new_opt.whole_key_filtering, true);
879
+ ASSERT_EQ(new_opt.detect_filter_construct_corruption, true);
880
+ ASSERT_EQ(new_opt.reserve_table_builder_memory, true);
881
+ ASSERT_EQ(new_opt.reserve_table_reader_memory, true);
869
882
  ASSERT_TRUE(new_opt.filter_policy != nullptr);
870
- const BloomFilterPolicy* bfp =
871
- dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
883
+ auto bfp = new_opt.filter_policy->CheckedCast<BloomFilterPolicy>();
884
+ ASSERT_NE(bfp, nullptr);
872
885
  EXPECT_EQ(bfp->GetMillibitsPerKey(), 4567);
873
886
  EXPECT_EQ(bfp->GetWholeBitsPerKey(), 5);
874
- EXPECT_EQ(bfp->GetMode(), BloomFilterPolicy::kAutoBloom);
875
887
  // Verify that only the lower 32bits are stored in
876
888
  // new_opt.read_amp_bytes_per_bit.
877
889
  EXPECT_EQ(1U, new_opt.read_amp_bytes_per_bit);
@@ -908,34 +920,91 @@ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
908
920
 
909
921
  // unrecognized filter policy name
910
922
  s = GetBlockBasedTableOptionsFromString(config_options, table_opt,
911
- "cache_index_and_filter_blocks=1;"
912
923
  "filter_policy=bloomfilterxx:4:true",
913
924
  &new_opt);
914
925
  ASSERT_NOK(s);
915
926
  ASSERT_TRUE(s.IsInvalidArgument());
916
- ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
917
- new_opt.cache_index_and_filter_blocks);
918
- ASSERT_EQ(table_opt.filter_policy, new_opt.filter_policy);
919
927
 
920
- // unrecognized filter policy config
921
- s = GetBlockBasedTableOptionsFromString(config_options, table_opt,
922
- "cache_index_and_filter_blocks=1;"
923
- "filter_policy=bloomfilter:4",
924
- &new_opt);
928
+ // missing bits per key
929
+ s = GetBlockBasedTableOptionsFromString(
930
+ config_options, table_opt, "filter_policy=bloomfilter", &new_opt);
925
931
  ASSERT_NOK(s);
926
932
  ASSERT_TRUE(s.IsInvalidArgument());
927
- ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
928
- new_opt.cache_index_and_filter_blocks);
929
- ASSERT_EQ(table_opt.filter_policy, new_opt.filter_policy);
930
933
 
931
- // Experimental Ribbon filter policy
934
+ // Used to be rejected, now accepted
932
935
  ASSERT_OK(GetBlockBasedTableOptionsFromString(
933
- config_options, table_opt, "filter_policy=experimental_ribbon:5.678;",
936
+ config_options, table_opt, "filter_policy=bloomfilter:4", &new_opt));
937
+ bfp = dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
938
+ EXPECT_EQ(bfp->GetMillibitsPerKey(), 4000);
939
+ EXPECT_EQ(bfp->GetWholeBitsPerKey(), 4);
940
+
941
+ // use_block_based_builder=true now ignored in public API (same as false)
942
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
943
+ config_options, table_opt, "filter_policy=bloomfilter:4:true", &new_opt));
944
+ bfp = dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
945
+ EXPECT_EQ(bfp->GetMillibitsPerKey(), 4000);
946
+ EXPECT_EQ(bfp->GetWholeBitsPerKey(), 4);
947
+
948
+ // Back door way of enabling deprecated block-based Bloom
949
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
950
+ config_options, table_opt,
951
+ "filter_policy=rocksdb.internal.DeprecatedBlockBasedBloomFilter:4",
952
+ &new_opt));
953
+ auto builtin =
954
+ dynamic_cast<const BuiltinFilterPolicy*>(new_opt.filter_policy.get());
955
+ EXPECT_EQ(builtin->GetId(),
956
+ "rocksdb.internal.DeprecatedBlockBasedBloomFilter:4");
957
+
958
+ // Test configuring using other internal names
959
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
960
+ config_options, table_opt,
961
+ "filter_policy=rocksdb.internal.LegacyBloomFilter:3", &new_opt));
962
+ builtin =
963
+ dynamic_cast<const BuiltinFilterPolicy*>(new_opt.filter_policy.get());
964
+ EXPECT_EQ(builtin->GetId(), "rocksdb.internal.LegacyBloomFilter:3");
965
+
966
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
967
+ config_options, table_opt,
968
+ "filter_policy=rocksdb.internal.FastLocalBloomFilter:1.234", &new_opt));
969
+ builtin =
970
+ dynamic_cast<const BuiltinFilterPolicy*>(new_opt.filter_policy.get());
971
+ EXPECT_EQ(builtin->GetId(), "rocksdb.internal.FastLocalBloomFilter:1.234");
972
+
973
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
974
+ config_options, table_opt,
975
+ "filter_policy=rocksdb.internal.Standard128RibbonFilter:1.234",
976
+ &new_opt));
977
+ builtin =
978
+ dynamic_cast<const BuiltinFilterPolicy*>(new_opt.filter_policy.get());
979
+ EXPECT_EQ(builtin->GetId(), "rocksdb.internal.Standard128RibbonFilter:1.234");
980
+
981
+ // Ribbon filter policy (no Bloom hybrid)
982
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
983
+ config_options, table_opt, "filter_policy=ribbonfilter:5.678:-1;",
934
984
  &new_opt));
935
985
  ASSERT_TRUE(new_opt.filter_policy != nullptr);
936
- bfp = dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
937
- EXPECT_EQ(bfp->GetMillibitsPerKey(), 5678);
938
- EXPECT_EQ(bfp->GetMode(), BloomFilterPolicy::kStandard128Ribbon);
986
+ auto rfp =
987
+ dynamic_cast<const RibbonFilterPolicy*>(new_opt.filter_policy.get());
988
+ EXPECT_EQ(rfp->GetMillibitsPerKey(), 5678);
989
+ EXPECT_EQ(rfp->GetBloomBeforeLevel(), -1);
990
+
991
+ // Ribbon filter policy (default Bloom hybrid)
992
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
993
+ config_options, table_opt, "filter_policy=ribbonfilter:6.789;",
994
+ &new_opt));
995
+ ASSERT_TRUE(new_opt.filter_policy != nullptr);
996
+ rfp = dynamic_cast<const RibbonFilterPolicy*>(new_opt.filter_policy.get());
997
+ EXPECT_EQ(rfp->GetMillibitsPerKey(), 6789);
998
+ EXPECT_EQ(rfp->GetBloomBeforeLevel(), 0);
999
+
1000
+ // Ribbon filter policy (custom Bloom hybrid)
1001
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
1002
+ config_options, table_opt, "filter_policy=ribbonfilter:6.789:5;",
1003
+ &new_opt));
1004
+ ASSERT_TRUE(new_opt.filter_policy != nullptr);
1005
+ rfp = dynamic_cast<const RibbonFilterPolicy*>(new_opt.filter_policy.get());
1006
+ EXPECT_EQ(rfp->GetMillibitsPerKey(), 6789);
1007
+ EXPECT_EQ(rfp->GetBloomBeforeLevel(), 5);
939
1008
 
940
1009
  // Check block cache options are overwritten when specified
941
1010
  // in new format as a struct.
@@ -1037,6 +1106,25 @@ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
1037
1106
  ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
1038
1107
  ->GetHighPriPoolRatio(),
1039
1108
  0.5);
1109
+
1110
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
1111
+ config_options, table_opt, "filter_policy=rocksdb.BloomFilter:1.234",
1112
+ &new_opt));
1113
+ ASSERT_TRUE(new_opt.filter_policy != nullptr);
1114
+ ASSERT_TRUE(
1115
+ new_opt.filter_policy->IsInstanceOf(BloomFilterPolicy::kClassName()));
1116
+ ASSERT_TRUE(
1117
+ new_opt.filter_policy->IsInstanceOf(BloomFilterPolicy::kNickName()));
1118
+
1119
+ // Ribbon filter policy alternative name
1120
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
1121
+ config_options, table_opt, "filter_policy=rocksdb.RibbonFilter:6.789:5;",
1122
+ &new_opt));
1123
+ ASSERT_TRUE(new_opt.filter_policy != nullptr);
1124
+ ASSERT_TRUE(
1125
+ new_opt.filter_policy->IsInstanceOf(RibbonFilterPolicy::kClassName()));
1126
+ ASSERT_TRUE(
1127
+ new_opt.filter_policy->IsInstanceOf(RibbonFilterPolicy::kNickName()));
1040
1128
  }
1041
1129
  #endif // !ROCKSDB_LITE
1042
1130
 
@@ -1090,14 +1178,14 @@ TEST_F(OptionsTest, GetMemTableRepFactoryFromString) {
1090
1178
 
1091
1179
  ASSERT_OK(GetMemTableRepFactoryFromString("skip_list", &new_mem_factory));
1092
1180
  ASSERT_OK(GetMemTableRepFactoryFromString("skip_list:16", &new_mem_factory));
1093
- ASSERT_EQ(std::string(new_mem_factory->Name()), "SkipListFactory");
1181
+ ASSERT_STREQ(new_mem_factory->Name(), "SkipListFactory");
1094
1182
  ASSERT_NOK(GetMemTableRepFactoryFromString("skip_list:16:invalid_opt",
1095
1183
  &new_mem_factory));
1096
1184
 
1097
1185
  ASSERT_OK(GetMemTableRepFactoryFromString("prefix_hash", &new_mem_factory));
1098
1186
  ASSERT_OK(GetMemTableRepFactoryFromString("prefix_hash:1000",
1099
1187
  &new_mem_factory));
1100
- ASSERT_EQ(std::string(new_mem_factory->Name()), "HashSkipListRepFactory");
1188
+ ASSERT_STREQ(new_mem_factory->Name(), "HashSkipListRepFactory");
1101
1189
  ASSERT_NOK(GetMemTableRepFactoryFromString("prefix_hash:1000:invalid_opt",
1102
1190
  &new_mem_factory));
1103
1191
 
@@ -1123,7 +1211,107 @@ TEST_F(OptionsTest, GetMemTableRepFactoryFromString) {
1123
1211
  }
1124
1212
  #endif // !ROCKSDB_LITE
1125
1213
 
1214
+ TEST_F(OptionsTest, MemTableRepFactoryCreateFromString) {
1215
+ std::unique_ptr<MemTableRepFactory> new_mem_factory = nullptr;
1216
+ ConfigOptions config_options;
1217
+ config_options.ignore_unsupported_options = false;
1218
+ config_options.ignore_unknown_options = false;
1219
+
1220
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "skip_list",
1221
+ &new_mem_factory));
1222
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "skip_list:16",
1223
+ &new_mem_factory));
1224
+ ASSERT_STREQ(new_mem_factory->Name(), "SkipListFactory");
1225
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("skip_list"));
1226
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("SkipListFactory"));
1227
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1228
+ config_options, "skip_list:16:invalid_opt", &new_mem_factory));
1229
+
1230
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1231
+ config_options, "invalid_opt=10", &new_mem_factory));
1232
+
1233
+ // Test a reset
1234
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "",
1235
+ &new_mem_factory));
1236
+ ASSERT_EQ(new_mem_factory, nullptr);
1237
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1238
+ config_options, "invalid_opt=10", &new_mem_factory));
1239
+
1240
+ #ifndef ROCKSDB_LITE
1241
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1242
+ config_options, "id=skip_list; lookahead=32", &new_mem_factory));
1243
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "prefix_hash",
1244
+ &new_mem_factory));
1245
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1246
+ config_options, "prefix_hash:1000", &new_mem_factory));
1247
+ ASSERT_STREQ(new_mem_factory->Name(), "HashSkipListRepFactory");
1248
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("prefix_hash"));
1249
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("HashSkipListRepFactory"));
1250
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1251
+ config_options, "prefix_hash:1000:invalid_opt", &new_mem_factory));
1252
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1253
+ config_options,
1254
+ "id=prefix_hash; bucket_count=32; skiplist_height=64; "
1255
+ "branching_factor=16",
1256
+ &new_mem_factory));
1257
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1258
+ config_options,
1259
+ "id=prefix_hash; bucket_count=32; skiplist_height=64; "
1260
+ "branching_factor=16; invalid=unknown",
1261
+ &new_mem_factory));
1262
+
1263
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1264
+ config_options, "hash_linkedlist", &new_mem_factory));
1265
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1266
+ config_options, "hash_linkedlist:1000", &new_mem_factory));
1267
+ ASSERT_STREQ(new_mem_factory->Name(), "HashLinkListRepFactory");
1268
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("hash_linkedlist"));
1269
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("HashLinkListRepFactory"));
1270
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1271
+ config_options, "hash_linkedlist:1000:invalid_opt", &new_mem_factory));
1272
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1273
+ config_options,
1274
+ "id=hash_linkedlist; bucket_count=32; threshold=64; huge_page_size=16; "
1275
+ "logging_threshold=12; log_when_flash=true",
1276
+ &new_mem_factory));
1277
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1278
+ config_options,
1279
+ "id=hash_linkedlist; bucket_count=32; threshold=64; huge_page_size=16; "
1280
+ "logging_threshold=12; log_when_flash=true; invalid=unknown",
1281
+ &new_mem_factory));
1282
+
1283
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "vector",
1284
+ &new_mem_factory));
1285
+ ASSERT_OK(MemTableRepFactory::CreateFromString(config_options, "vector:1024",
1286
+ &new_mem_factory));
1287
+ ASSERT_STREQ(new_mem_factory->Name(), "VectorRepFactory");
1288
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("vector"));
1289
+ ASSERT_TRUE(new_mem_factory->IsInstanceOf("VectorRepFactory"));
1290
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1291
+ config_options, "vector:1024:invalid_opt", &new_mem_factory));
1292
+ ASSERT_OK(MemTableRepFactory::CreateFromString(
1293
+ config_options, "id=vector; count=42", &new_mem_factory));
1294
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(
1295
+ config_options, "id=vector; invalid=unknown", &new_mem_factory));
1296
+ #endif // ROCKSDB_LITE
1297
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(config_options, "cuckoo",
1298
+ &new_mem_factory));
1299
+ // CuckooHash memtable is already removed.
1300
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(config_options, "cuckoo:1024",
1301
+ &new_mem_factory));
1302
+
1303
+ ASSERT_NOK(MemTableRepFactory::CreateFromString(config_options, "bad_factory",
1304
+ &new_mem_factory));
1305
+ }
1306
+
1126
1307
  #ifndef ROCKSDB_LITE // GetOptionsFromString is not supported in RocksDB Lite
1308
+ class CustomEnv : public EnvWrapper {
1309
+ public:
1310
+ explicit CustomEnv(Env* _target) : EnvWrapper(_target) {}
1311
+ static const char* kClassName() { return "CustomEnv"; }
1312
+ const char* Name() const override { return kClassName(); }
1313
+ };
1314
+
1127
1315
  TEST_F(OptionsTest, GetOptionsFromStringTest) {
1128
1316
  Options base_options, new_options;
1129
1317
  ConfigOptions config_options;
@@ -1138,14 +1326,8 @@ TEST_F(OptionsTest, GetOptionsFromStringTest) {
1138
1326
  NewBlockBasedTableFactory(block_based_table_options));
1139
1327
 
1140
1328
  // Register an Env with object registry.
1141
- const static char* kCustomEnvName = "CustomEnv";
1142
- class CustomEnv : public EnvWrapper {
1143
- public:
1144
- explicit CustomEnv(Env* _target) : EnvWrapper(_target) {}
1145
- };
1146
-
1147
- ObjectLibrary::Default()->Register<Env>(
1148
- kCustomEnvName,
1329
+ ObjectLibrary::Default()->AddFactory<Env>(
1330
+ CustomEnv::kClassName(),
1149
1331
  [](const std::string& /*name*/, std::unique_ptr<Env>* /*env_guard*/,
1150
1332
  std::string* /* errmsg */) {
1151
1333
  static CustomEnv env(Env::Default());
@@ -1191,7 +1373,7 @@ TEST_F(OptionsTest, GetOptionsFromStringTest) {
1191
1373
  ASSERT_EQ(new_options.max_open_files, 1);
1192
1374
  ASSERT_TRUE(new_options.rate_limiter.get() != nullptr);
1193
1375
  Env* newEnv = new_options.env;
1194
- ASSERT_OK(Env::LoadEnv(kCustomEnvName, &newEnv));
1376
+ ASSERT_OK(Env::LoadEnv(CustomEnv::kClassName(), &newEnv));
1195
1377
  ASSERT_EQ(newEnv, new_options.env);
1196
1378
 
1197
1379
  config_options.ignore_unknown_options = false;
@@ -1292,6 +1474,77 @@ TEST_F(OptionsTest, OptionsComposeDecompose) {
1292
1474
  delete new_cf_opts.compaction_filter;
1293
1475
  }
1294
1476
 
1477
+ TEST_F(OptionsTest, DBOptionsComposeImmutable) {
1478
+ // Build a DBOptions from an Immutable/Mutable one and verify that
1479
+ // we get same constituent options.
1480
+ ConfigOptions config_options;
1481
+ Random rnd(301);
1482
+ DBOptions base_opts, new_opts;
1483
+ test::RandomInitDBOptions(&base_opts, &rnd);
1484
+ MutableDBOptions m_opts(base_opts);
1485
+ ImmutableDBOptions i_opts(base_opts);
1486
+ new_opts = BuildDBOptions(i_opts, m_opts);
1487
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(config_options, base_opts,
1488
+ new_opts));
1489
+ }
1490
+
1491
+ TEST_F(OptionsTest, GetMutableDBOptions) {
1492
+ Random rnd(228);
1493
+ DBOptions base_opts;
1494
+ std::string opts_str;
1495
+ std::unordered_map<std::string, std::string> opts_map;
1496
+ ConfigOptions config_options;
1497
+
1498
+ test::RandomInitDBOptions(&base_opts, &rnd);
1499
+ ImmutableDBOptions i_opts(base_opts);
1500
+ MutableDBOptions m_opts(base_opts);
1501
+ MutableDBOptions new_opts;
1502
+ ASSERT_OK(GetStringFromMutableDBOptions(config_options, m_opts, &opts_str));
1503
+ ASSERT_OK(StringToMap(opts_str, &opts_map));
1504
+ ASSERT_OK(GetMutableDBOptionsFromStrings(m_opts, opts_map, &new_opts));
1505
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(
1506
+ config_options, base_opts, BuildDBOptions(i_opts, new_opts)));
1507
+ }
1508
+
1509
+ TEST_F(OptionsTest, CFOptionsComposeImmutable) {
1510
+ // Build a DBOptions from an Immutable/Mutable one and verify that
1511
+ // we get same constituent options.
1512
+ ConfigOptions config_options;
1513
+ Random rnd(301);
1514
+ ColumnFamilyOptions base_opts, new_opts;
1515
+ DBOptions dummy; // Needed to create ImmutableCFOptions
1516
+ test::RandomInitCFOptions(&base_opts, dummy, &rnd);
1517
+ MutableCFOptions m_opts(base_opts);
1518
+ ImmutableCFOptions i_opts(base_opts);
1519
+ UpdateColumnFamilyOptions(i_opts, &new_opts);
1520
+ UpdateColumnFamilyOptions(m_opts, &new_opts);
1521
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_opts,
1522
+ new_opts));
1523
+ delete new_opts.compaction_filter;
1524
+ }
1525
+
1526
+ TEST_F(OptionsTest, GetMutableCFOptions) {
1527
+ Random rnd(228);
1528
+ ColumnFamilyOptions base, copy;
1529
+ std::string opts_str;
1530
+ std::unordered_map<std::string, std::string> opts_map;
1531
+ ConfigOptions config_options;
1532
+ DBOptions dummy; // Needed to create ImmutableCFOptions
1533
+
1534
+ test::RandomInitCFOptions(&base, dummy, &rnd);
1535
+ ColumnFamilyOptions result;
1536
+ MutableCFOptions m_opts(base), new_opts;
1537
+
1538
+ ASSERT_OK(GetStringFromMutableCFOptions(config_options, m_opts, &opts_str));
1539
+ ASSERT_OK(StringToMap(opts_str, &opts_map));
1540
+ ASSERT_OK(GetMutableOptionsFromStrings(m_opts, opts_map, nullptr, &new_opts));
1541
+ UpdateColumnFamilyOptions(ImmutableCFOptions(base), &copy);
1542
+ UpdateColumnFamilyOptions(new_opts, &copy);
1543
+
1544
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base, copy));
1545
+ delete copy.compaction_filter;
1546
+ }
1547
+
1295
1548
  TEST_F(OptionsTest, ColumnFamilyOptionsSerialization) {
1296
1549
  Options options;
1297
1550
  ColumnFamilyOptions base_opt, new_opt;
@@ -1364,13 +1617,12 @@ TEST_F(OptionsTest, MutableTableOptions) {
1364
1617
  bbtf.reset(NewBlockBasedTableFactory());
1365
1618
  auto bbto = bbtf->GetOptions<BlockBasedTableOptions>();
1366
1619
  ASSERT_NE(bbto, nullptr);
1367
- ASSERT_FALSE(bbtf->IsPrepared());
1368
1620
  ASSERT_OK(bbtf->ConfigureOption(config_options, "block_align", "true"));
1369
1621
  ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1370
1622
  ASSERT_EQ(bbto->block_align, true);
1371
1623
  ASSERT_EQ(bbto->block_size, 1024);
1372
1624
  ASSERT_OK(bbtf->PrepareOptions(config_options));
1373
- ASSERT_TRUE(bbtf->IsPrepared());
1625
+ config_options.mutable_options_only = true;
1374
1626
  ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1375
1627
  ASSERT_EQ(bbto->block_align, true);
1376
1628
  ASSERT_NOK(bbtf->ConfigureOption(config_options, "block_align", "false"));
@@ -1390,6 +1642,79 @@ TEST_F(OptionsTest, MutableTableOptions) {
1390
1642
  ASSERT_EQ(bbto->block_size, 8192);
1391
1643
  }
1392
1644
 
1645
+ TEST_F(OptionsTest, MutableCFOptions) {
1646
+ ConfigOptions config_options;
1647
+ ColumnFamilyOptions cf_opts;
1648
+
1649
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1650
+ config_options, cf_opts,
1651
+ "paranoid_file_checks=true; block_based_table_factory.block_align=false; "
1652
+ "block_based_table_factory.block_size=8192;",
1653
+ &cf_opts));
1654
+ ASSERT_TRUE(cf_opts.paranoid_file_checks);
1655
+ ASSERT_NE(cf_opts.table_factory.get(), nullptr);
1656
+ const auto bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1657
+ ASSERT_NE(bbto, nullptr);
1658
+ ASSERT_EQ(bbto->block_size, 8192);
1659
+ ASSERT_EQ(bbto->block_align, false);
1660
+ std::unordered_map<std::string, std::string> unused_opts;
1661
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1662
+ config_options, cf_opts, {{"paranoid_file_checks", "false"}}, &cf_opts));
1663
+ ASSERT_EQ(cf_opts.paranoid_file_checks, false);
1664
+
1665
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1666
+ config_options, cf_opts,
1667
+ {{"block_based_table_factory.block_size", "16384"}}, &cf_opts));
1668
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1669
+ ASSERT_EQ(bbto->block_size, 16384);
1670
+
1671
+ config_options.mutable_options_only = true;
1672
+ // Force consistency checks is not mutable
1673
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1674
+ config_options, cf_opts, {{"force_consistency_checks", "true"}},
1675
+ &cf_opts));
1676
+
1677
+ // Attempt to change the table. It is not mutable, so this should fail and
1678
+ // leave the original intact
1679
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1680
+ config_options, cf_opts, {{"table_factory", "PlainTable"}}, &cf_opts));
1681
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1682
+ config_options, cf_opts, {{"table_factory.id", "PlainTable"}}, &cf_opts));
1683
+ ASSERT_NE(cf_opts.table_factory.get(), nullptr);
1684
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1685
+
1686
+ // Change the block size. Should update the value in the current table
1687
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1688
+ config_options, cf_opts,
1689
+ {{"block_based_table_factory.block_size", "8192"}}, &cf_opts));
1690
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1691
+ ASSERT_EQ(bbto->block_size, 8192);
1692
+
1693
+ // Attempt to turn off block cache fails, as this option is not mutable
1694
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1695
+ config_options, cf_opts,
1696
+ {{"block_based_table_factory.no_block_cache", "true"}}, &cf_opts));
1697
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1698
+
1699
+ // Attempt to change the block size via a config string/map. Should update
1700
+ // the current value
1701
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1702
+ config_options, cf_opts,
1703
+ {{"block_based_table_factory", "{block_size=32768}"}}, &cf_opts));
1704
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1705
+ ASSERT_EQ(bbto->block_size, 32768);
1706
+
1707
+ // Attempt to change the block size and no cache through the map. Should
1708
+ // fail, leaving the old values intact
1709
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1710
+ config_options, cf_opts,
1711
+ {{"block_based_table_factory",
1712
+ "{block_size=16384; no_block_cache=true}"}},
1713
+ &cf_opts));
1714
+ ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1715
+ ASSERT_EQ(bbto->block_size, 32768);
1716
+ }
1717
+
1393
1718
  #endif // !ROCKSDB_LITE
1394
1719
 
1395
1720
  Status StringToMap(
@@ -1582,6 +1907,230 @@ TEST_F(OptionsTest, GetStringFromCompressionType) {
1582
1907
  ASSERT_NOK(
1583
1908
  GetStringFromCompressionType(&res, static_cast<CompressionType>(-10)));
1584
1909
  }
1910
+
1911
+ TEST_F(OptionsTest, OnlyMutableDBOptions) {
1912
+ std::string opt_str;
1913
+ Random rnd(302);
1914
+ ConfigOptions cfg_opts;
1915
+ DBOptions db_opts;
1916
+ DBOptions mdb_opts;
1917
+ std::unordered_set<std::string> m_names;
1918
+ std::unordered_set<std::string> a_names;
1919
+
1920
+ test::RandomInitDBOptions(&db_opts, &rnd);
1921
+ auto db_config = DBOptionsAsConfigurable(db_opts);
1922
+
1923
+ // Get all of the DB Option names (mutable or not)
1924
+ ASSERT_OK(db_config->GetOptionNames(cfg_opts, &a_names));
1925
+
1926
+ // Get only the mutable options from db_opts and set those in mdb_opts
1927
+ cfg_opts.mutable_options_only = true;
1928
+
1929
+ // Get only the Mutable DB Option names
1930
+ ASSERT_OK(db_config->GetOptionNames(cfg_opts, &m_names));
1931
+ ASSERT_OK(GetStringFromDBOptions(cfg_opts, db_opts, &opt_str));
1932
+ ASSERT_OK(GetDBOptionsFromString(cfg_opts, mdb_opts, opt_str, &mdb_opts));
1933
+ std::string mismatch;
1934
+ // Comparing only the mutable options, the two are equivalent
1935
+ auto mdb_config = DBOptionsAsConfigurable(mdb_opts);
1936
+ ASSERT_TRUE(mdb_config->AreEquivalent(cfg_opts, db_config.get(), &mismatch));
1937
+ ASSERT_TRUE(db_config->AreEquivalent(cfg_opts, mdb_config.get(), &mismatch));
1938
+
1939
+ ASSERT_GT(a_names.size(), m_names.size());
1940
+ for (const auto& n : m_names) {
1941
+ std::string m, d;
1942
+ ASSERT_OK(mdb_config->GetOption(cfg_opts, n, &m));
1943
+ ASSERT_OK(db_config->GetOption(cfg_opts, n, &d));
1944
+ ASSERT_EQ(m, d);
1945
+ }
1946
+
1947
+ cfg_opts.mutable_options_only = false;
1948
+ // Comparing all of the options, the two are not equivalent
1949
+ ASSERT_FALSE(mdb_config->AreEquivalent(cfg_opts, db_config.get(), &mismatch));
1950
+ ASSERT_FALSE(db_config->AreEquivalent(cfg_opts, mdb_config.get(), &mismatch));
1951
+
1952
+ // Make sure there are only mutable options being configured
1953
+ ASSERT_OK(GetDBOptionsFromString(cfg_opts, DBOptions(), opt_str, &db_opts));
1954
+ }
1955
+
1956
+ TEST_F(OptionsTest, OnlyMutableCFOptions) {
1957
+ std::string opt_str;
1958
+ Random rnd(302);
1959
+ ConfigOptions cfg_opts;
1960
+ DBOptions db_opts;
1961
+ ColumnFamilyOptions mcf_opts;
1962
+ ColumnFamilyOptions cf_opts;
1963
+ std::unordered_set<std::string> m_names;
1964
+ std::unordered_set<std::string> a_names;
1965
+
1966
+ test::RandomInitCFOptions(&cf_opts, db_opts, &rnd);
1967
+ cf_opts.comparator = ReverseBytewiseComparator();
1968
+ auto cf_config = CFOptionsAsConfigurable(cf_opts);
1969
+
1970
+ // Get all of the CF Option names (mutable or not)
1971
+ ASSERT_OK(cf_config->GetOptionNames(cfg_opts, &a_names));
1972
+
1973
+ // Get only the mutable options from cf_opts and set those in mcf_opts
1974
+ cfg_opts.mutable_options_only = true;
1975
+ // Get only the Mutable CF Option names
1976
+ ASSERT_OK(cf_config->GetOptionNames(cfg_opts, &m_names));
1977
+ ASSERT_OK(GetStringFromColumnFamilyOptions(cfg_opts, cf_opts, &opt_str));
1978
+ ASSERT_OK(
1979
+ GetColumnFamilyOptionsFromString(cfg_opts, mcf_opts, opt_str, &mcf_opts));
1980
+ std::string mismatch;
1981
+
1982
+ auto mcf_config = CFOptionsAsConfigurable(mcf_opts);
1983
+ // Comparing only the mutable options, the two are equivalent
1984
+ ASSERT_TRUE(mcf_config->AreEquivalent(cfg_opts, cf_config.get(), &mismatch));
1985
+ ASSERT_TRUE(cf_config->AreEquivalent(cfg_opts, mcf_config.get(), &mismatch));
1986
+
1987
+ ASSERT_GT(a_names.size(), m_names.size());
1988
+ for (const auto& n : m_names) {
1989
+ std::string m, d;
1990
+ ASSERT_OK(mcf_config->GetOption(cfg_opts, n, &m));
1991
+ ASSERT_OK(cf_config->GetOption(cfg_opts, n, &d));
1992
+ ASSERT_EQ(m, d);
1993
+ }
1994
+
1995
+ cfg_opts.mutable_options_only = false;
1996
+ // Comparing all of the options, the two are not equivalent
1997
+ ASSERT_FALSE(mcf_config->AreEquivalent(cfg_opts, cf_config.get(), &mismatch));
1998
+ ASSERT_FALSE(cf_config->AreEquivalent(cfg_opts, mcf_config.get(), &mismatch));
1999
+ delete cf_opts.compaction_filter;
2000
+
2001
+ // Make sure the options string contains only mutable options
2002
+ ASSERT_OK(GetColumnFamilyOptionsFromString(cfg_opts, ColumnFamilyOptions(),
2003
+ opt_str, &cf_opts));
2004
+ delete cf_opts.compaction_filter;
2005
+ }
2006
+
2007
+ TEST_F(OptionsTest, SstPartitionerTest) {
2008
+ ConfigOptions cfg_opts;
2009
+ ColumnFamilyOptions cf_opts, new_opt;
2010
+ std::string opts_str, mismatch;
2011
+
2012
+ ASSERT_OK(SstPartitionerFactory::CreateFromString(
2013
+ cfg_opts, SstPartitionerFixedPrefixFactory::kClassName(),
2014
+ &cf_opts.sst_partitioner_factory));
2015
+ ASSERT_NE(cf_opts.sst_partitioner_factory, nullptr);
2016
+ ASSERT_STREQ(cf_opts.sst_partitioner_factory->Name(),
2017
+ SstPartitionerFixedPrefixFactory::kClassName());
2018
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
2019
+ cfg_opts, ColumnFamilyOptions(),
2020
+ std::string("sst_partitioner_factory={id=") +
2021
+ SstPartitionerFixedPrefixFactory::kClassName() + "; unknown=10;}",
2022
+ &cf_opts));
2023
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
2024
+ cfg_opts, ColumnFamilyOptions(),
2025
+ std::string("sst_partitioner_factory={id=") +
2026
+ SstPartitionerFixedPrefixFactory::kClassName() + "; length=10;}",
2027
+ &cf_opts));
2028
+ ASSERT_NE(cf_opts.sst_partitioner_factory, nullptr);
2029
+ ASSERT_STREQ(cf_opts.sst_partitioner_factory->Name(),
2030
+ SstPartitionerFixedPrefixFactory::kClassName());
2031
+ ASSERT_OK(GetStringFromColumnFamilyOptions(cfg_opts, cf_opts, &opts_str));
2032
+ ASSERT_OK(
2033
+ GetColumnFamilyOptionsFromString(cfg_opts, cf_opts, opts_str, &new_opt));
2034
+ ASSERT_NE(new_opt.sst_partitioner_factory, nullptr);
2035
+ ASSERT_STREQ(new_opt.sst_partitioner_factory->Name(),
2036
+ SstPartitionerFixedPrefixFactory::kClassName());
2037
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(cfg_opts, cf_opts, new_opt));
2038
+ ASSERT_TRUE(cf_opts.sst_partitioner_factory->AreEquivalent(
2039
+ cfg_opts, new_opt.sst_partitioner_factory.get(), &mismatch));
2040
+ }
2041
+
2042
+ TEST_F(OptionsTest, FileChecksumGenFactoryTest) {
2043
+ ConfigOptions cfg_opts;
2044
+ DBOptions db_opts, new_opt;
2045
+ std::string opts_str, mismatch;
2046
+ auto factory = GetFileChecksumGenCrc32cFactory();
2047
+
2048
+ cfg_opts.ignore_unsupported_options = false;
2049
+
2050
+ ASSERT_OK(GetStringFromDBOptions(cfg_opts, db_opts, &opts_str));
2051
+ ASSERT_OK(GetDBOptionsFromString(cfg_opts, db_opts, opts_str, &new_opt));
2052
+
2053
+ ASSERT_NE(factory, nullptr);
2054
+ ASSERT_OK(FileChecksumGenFactory::CreateFromString(
2055
+ cfg_opts, factory->Name(), &db_opts.file_checksum_gen_factory));
2056
+ ASSERT_NE(db_opts.file_checksum_gen_factory, nullptr);
2057
+ ASSERT_STREQ(db_opts.file_checksum_gen_factory->Name(), factory->Name());
2058
+ ASSERT_NOK(GetDBOptionsFromString(
2059
+ cfg_opts, DBOptions(), "file_checksum_gen_factory=unknown", &db_opts));
2060
+ ASSERT_OK(GetDBOptionsFromString(
2061
+ cfg_opts, DBOptions(),
2062
+ std::string("file_checksum_gen_factory=") + factory->Name(), &db_opts));
2063
+ ASSERT_NE(db_opts.file_checksum_gen_factory, nullptr);
2064
+ ASSERT_STREQ(db_opts.file_checksum_gen_factory->Name(), factory->Name());
2065
+
2066
+ ASSERT_OK(GetStringFromDBOptions(cfg_opts, db_opts, &opts_str));
2067
+ ASSERT_OK(GetDBOptionsFromString(cfg_opts, db_opts, opts_str, &new_opt));
2068
+ ASSERT_NE(new_opt.file_checksum_gen_factory, nullptr);
2069
+ ASSERT_STREQ(new_opt.file_checksum_gen_factory->Name(), factory->Name());
2070
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(cfg_opts, db_opts, new_opt));
2071
+ ASSERT_TRUE(factory->AreEquivalent(
2072
+ cfg_opts, new_opt.file_checksum_gen_factory.get(), &mismatch));
2073
+ ASSERT_TRUE(db_opts.file_checksum_gen_factory->AreEquivalent(
2074
+ cfg_opts, new_opt.file_checksum_gen_factory.get(), &mismatch));
2075
+ }
2076
+
2077
+ class TestTablePropertiesCollectorFactory
2078
+ : public TablePropertiesCollectorFactory {
2079
+ private:
2080
+ std::string id_;
2081
+
2082
+ public:
2083
+ explicit TestTablePropertiesCollectorFactory(const std::string& id)
2084
+ : id_(id) {}
2085
+ TablePropertiesCollector* CreateTablePropertiesCollector(
2086
+ TablePropertiesCollectorFactory::Context /*context*/) override {
2087
+ return nullptr;
2088
+ }
2089
+ static const char* kClassName() { return "TestCollector"; }
2090
+ const char* Name() const override { return kClassName(); }
2091
+ std::string GetId() const override {
2092
+ return std::string(kClassName()) + ":" + id_;
2093
+ }
2094
+ };
2095
+
2096
+ TEST_F(OptionsTest, OptionTablePropertiesTest) {
2097
+ ConfigOptions cfg_opts;
2098
+ ColumnFamilyOptions orig, copy;
2099
+ orig.table_properties_collector_factories.push_back(
2100
+ std::make_shared<TestTablePropertiesCollectorFactory>("1"));
2101
+ orig.table_properties_collector_factories.push_back(
2102
+ std::make_shared<TestTablePropertiesCollectorFactory>("2"));
2103
+
2104
+ // Push two TablePropertiesCollectorFactories then create a new
2105
+ // ColumnFamilyOptions based on those settings. The copy should
2106
+ // have no properties but still match the original
2107
+ std::string opts_str;
2108
+ ASSERT_OK(GetStringFromColumnFamilyOptions(cfg_opts, orig, &opts_str));
2109
+ ASSERT_OK(GetColumnFamilyOptionsFromString(cfg_opts, orig, opts_str, &copy));
2110
+ ASSERT_EQ(copy.table_properties_collector_factories.size(), 0);
2111
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(cfg_opts, orig, copy));
2112
+
2113
+ // Now register a TablePropertiesCollectorFactory
2114
+ // Repeat the experiment. The copy should have the same
2115
+ // properties as the original
2116
+ cfg_opts.registry->AddLibrary("collector")
2117
+ ->AddFactory<TablePropertiesCollectorFactory>(
2118
+ ObjectLibrary::PatternEntry(
2119
+ TestTablePropertiesCollectorFactory::kClassName(), false)
2120
+ .AddSeparator(":"),
2121
+ [](const std::string& name,
2122
+ std::unique_ptr<TablePropertiesCollectorFactory>* guard,
2123
+ std::string* /* errmsg */) {
2124
+ std::string id = name.substr(
2125
+ strlen(TestTablePropertiesCollectorFactory::kClassName()) + 1);
2126
+ guard->reset(new TestTablePropertiesCollectorFactory(id));
2127
+ return guard->get();
2128
+ });
2129
+
2130
+ ASSERT_OK(GetColumnFamilyOptionsFromString(cfg_opts, orig, opts_str, &copy));
2131
+ ASSERT_EQ(copy.table_properties_collector_factories.size(), 2);
2132
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(cfg_opts, orig, copy));
2133
+ }
1585
2134
  #endif // !ROCKSDB_LITE
1586
2135
 
1587
2136
  TEST_F(OptionsTest, ConvertOptionsTest) {
@@ -1607,8 +2156,89 @@ TEST_F(OptionsTest, ConvertOptionsTest) {
1607
2156
  leveldb_opt.block_restart_interval);
1608
2157
  ASSERT_EQ(table_opt->filter_policy.get(), leveldb_opt.filter_policy);
1609
2158
  }
2159
+ #ifndef ROCKSDB_LITE
2160
+ class TestEventListener : public EventListener {
2161
+ private:
2162
+ std::string id_;
2163
+
2164
+ public:
2165
+ explicit TestEventListener(const std::string& id) : id_("Test" + id) {}
2166
+ const char* Name() const override { return id_.c_str(); }
2167
+ };
2168
+
2169
+ static std::unordered_map<std::string, OptionTypeInfo>
2170
+ test_listener_option_info = {
2171
+ {"s",
2172
+ {0, OptionType::kString, OptionVerificationType::kNormal,
2173
+ OptionTypeFlags::kNone}},
2174
+
2175
+ };
2176
+
2177
+ class TestConfigEventListener : public TestEventListener {
2178
+ private:
2179
+ std::string s_;
2180
+
2181
+ public:
2182
+ explicit TestConfigEventListener(const std::string& id)
2183
+ : TestEventListener("Config" + id) {
2184
+ s_ = id;
2185
+ RegisterOptions("Test", &s_, &test_listener_option_info);
2186
+ }
2187
+ };
2188
+
2189
+ static int RegisterTestEventListener(ObjectLibrary& library,
2190
+ const std::string& arg) {
2191
+ library.AddFactory<EventListener>(
2192
+ "Test" + arg,
2193
+ [](const std::string& name, std::unique_ptr<EventListener>* guard,
2194
+ std::string* /* errmsg */) {
2195
+ guard->reset(new TestEventListener(name.substr(4)));
2196
+ return guard->get();
2197
+ });
2198
+ library.AddFactory<EventListener>(
2199
+ "TestConfig" + arg,
2200
+ [](const std::string& name, std::unique_ptr<EventListener>* guard,
2201
+ std::string* /* errmsg */) {
2202
+ guard->reset(new TestConfigEventListener(name.substr(10)));
2203
+ return guard->get();
2204
+ });
2205
+ return 1;
2206
+ }
2207
+ TEST_F(OptionsTest, OptionsListenerTest) {
2208
+ DBOptions orig, copy;
2209
+ orig.listeners.push_back(std::make_shared<TestEventListener>("1"));
2210
+ orig.listeners.push_back(std::make_shared<TestEventListener>("2"));
2211
+ orig.listeners.push_back(std::make_shared<TestEventListener>(""));
2212
+ orig.listeners.push_back(std::make_shared<TestConfigEventListener>("1"));
2213
+ orig.listeners.push_back(std::make_shared<TestConfigEventListener>("2"));
2214
+ orig.listeners.push_back(std::make_shared<TestConfigEventListener>(""));
2215
+ ConfigOptions config_opts(orig);
2216
+ config_opts.registry->AddLibrary("listener", RegisterTestEventListener, "1");
2217
+ std::string opts_str;
2218
+ ASSERT_OK(GetStringFromDBOptions(config_opts, orig, &opts_str));
2219
+ ASSERT_OK(GetDBOptionsFromString(config_opts, orig, opts_str, &copy));
2220
+ ASSERT_OK(GetStringFromDBOptions(config_opts, copy, &opts_str));
2221
+ ASSERT_EQ(
2222
+ copy.listeners.size(),
2223
+ 2); // The Test{Config}1 Listeners could be loaded but not the others
2224
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(config_opts, orig, copy));
2225
+ }
2226
+ #endif // ROCKSDB_LITE
1610
2227
 
1611
2228
  #ifndef ROCKSDB_LITE
2229
+ const static std::string kCustomEnvName = "Custom";
2230
+ const static std::string kCustomEnvProp = "env=" + kCustomEnvName;
2231
+
2232
+ static int RegisterCustomEnv(ObjectLibrary& library, const std::string& arg) {
2233
+ library.AddFactory<Env>(
2234
+ arg, [](const std::string& /*name*/, std::unique_ptr<Env>* /*env_guard*/,
2235
+ std::string* /* errmsg */) {
2236
+ static CustomEnv env(Env::Default());
2237
+ return &env;
2238
+ });
2239
+ return 1;
2240
+ }
2241
+
1612
2242
  // This test suite tests the old APIs into the Configure options methods.
1613
2243
  // Once those APIs are officially deprecated, this test suite can be deleted.
1614
2244
  class OptionsOldApiTest : public testing::Test {};
@@ -1647,6 +2277,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1647
2277
  {"max_compaction_bytes", "21"},
1648
2278
  {"soft_rate_limit", "1.1"},
1649
2279
  {"hard_rate_limit", "2.1"},
2280
+ {"rate_limit_delay_max_milliseconds", "100"},
1650
2281
  {"hard_pending_compaction_bytes_limit", "211"},
1651
2282
  {"arena_block_size", "22"},
1652
2283
  {"disable_auto_compactions", "true"},
@@ -1658,6 +2289,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1658
2289
  {"inplace_update_support", "true"},
1659
2290
  {"report_bg_io_stats", "true"},
1660
2291
  {"compaction_measure_io_stats", "false"},
2292
+ {"purge_redundant_kvs_while_flush", "false"},
1661
2293
  {"inplace_update_num_locks", "25"},
1662
2294
  {"memtable_prefix_bloom_size_ratio", "0.26"},
1663
2295
  {"memtable_whole_key_filtering", "true"},
@@ -1673,6 +2305,9 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1673
2305
  {"blob_compression_type", "kZSTD"},
1674
2306
  {"enable_blob_garbage_collection", "true"},
1675
2307
  {"blob_garbage_collection_age_cutoff", "0.5"},
2308
+ {"blob_garbage_collection_force_threshold", "0.75"},
2309
+ {"blob_compaction_readahead_size", "256K"},
2310
+ {"bottommost_temperature", "kWarm"},
1676
2311
  };
1677
2312
 
1678
2313
  std::unordered_map<std::string, std::string> db_options_map = {
@@ -1709,14 +2344,15 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1709
2344
  {"persist_stats_to_disk", "false"},
1710
2345
  {"stats_history_buffer_size", "69"},
1711
2346
  {"advise_random_on_open", "true"},
2347
+ {"experimental_mempurge_threshold", "0.0"},
1712
2348
  {"use_adaptive_mutex", "false"},
1713
- {"new_table_reader_for_compaction_inputs", "true"},
1714
2349
  {"compaction_readahead_size", "100"},
1715
2350
  {"random_access_max_buffer_size", "3145728"},
1716
2351
  {"writable_file_max_buffer_size", "314159"},
1717
2352
  {"bytes_per_sync", "47"},
1718
2353
  {"wal_bytes_per_sync", "48"},
1719
2354
  {"strict_bytes_per_sync", "true"},
2355
+ {"preserve_deletes", "false"},
1720
2356
  };
1721
2357
 
1722
2358
  ColumnFamilyOptions base_cf_opt;
@@ -1788,14 +2424,16 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1788
2424
  ASSERT_EQ(new_cf_opt.max_successive_merges, 30U);
1789
2425
  ASSERT_TRUE(new_cf_opt.prefix_extractor != nullptr);
1790
2426
  ASSERT_EQ(new_cf_opt.optimize_filters_for_hits, true);
1791
- ASSERT_EQ(std::string(new_cf_opt.prefix_extractor->Name()),
1792
- "rocksdb.FixedPrefix.31");
2427
+ ASSERT_EQ(new_cf_opt.prefix_extractor->AsString(), "rocksdb.FixedPrefix.31");
1793
2428
  ASSERT_EQ(new_cf_opt.enable_blob_files, true);
1794
2429
  ASSERT_EQ(new_cf_opt.min_blob_size, 1ULL << 10);
1795
2430
  ASSERT_EQ(new_cf_opt.blob_file_size, 1ULL << 30);
1796
2431
  ASSERT_EQ(new_cf_opt.blob_compression_type, kZSTD);
1797
2432
  ASSERT_EQ(new_cf_opt.enable_blob_garbage_collection, true);
1798
2433
  ASSERT_EQ(new_cf_opt.blob_garbage_collection_age_cutoff, 0.5);
2434
+ ASSERT_EQ(new_cf_opt.blob_garbage_collection_force_threshold, 0.75);
2435
+ ASSERT_EQ(new_cf_opt.blob_compaction_readahead_size, 262144);
2436
+ ASSERT_EQ(new_cf_opt.bottommost_temperature, Temperature::kWarm);
1799
2437
 
1800
2438
  cf_options_map["write_buffer_size"] = "hello";
1801
2439
  ASSERT_NOK(GetColumnFamilyOptionsFromMap(
@@ -1855,14 +2493,13 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1855
2493
  ASSERT_EQ(new_db_opt.use_direct_reads, false);
1856
2494
  ASSERT_EQ(new_db_opt.use_direct_io_for_flush_and_compaction, false);
1857
2495
  ASSERT_EQ(new_db_opt.is_fd_close_on_exec, true);
1858
- ASSERT_EQ(new_db_opt.skip_log_error_on_recovery, false);
1859
2496
  ASSERT_EQ(new_db_opt.stats_dump_period_sec, 46U);
1860
2497
  ASSERT_EQ(new_db_opt.stats_persist_period_sec, 57U);
1861
2498
  ASSERT_EQ(new_db_opt.persist_stats_to_disk, false);
1862
2499
  ASSERT_EQ(new_db_opt.stats_history_buffer_size, 69U);
1863
2500
  ASSERT_EQ(new_db_opt.advise_random_on_open, true);
2501
+ ASSERT_EQ(new_db_opt.experimental_mempurge_threshold, 0.0);
1864
2502
  ASSERT_EQ(new_db_opt.use_adaptive_mutex, false);
1865
- ASSERT_EQ(new_db_opt.new_table_reader_for_compaction_inputs, true);
1866
2503
  ASSERT_EQ(new_db_opt.compaction_readahead_size, 100);
1867
2504
  ASSERT_EQ(new_db_opt.random_access_max_buffer_size, 3145728);
1868
2505
  ASSERT_EQ(new_db_opt.writable_file_max_buffer_size, 314159);
@@ -1924,7 +2561,7 @@ TEST_F(OptionsOldApiTest, GetColumnFamilyOptionsFromStringTest) {
1924
2561
 
1925
2562
  // Comparator from object registry
1926
2563
  std::string kCompName = "reverse_comp";
1927
- ObjectLibrary::Default()->Register<const Comparator>(
2564
+ ObjectLibrary::Default()->AddFactory<const Comparator>(
1928
2565
  kCompName,
1929
2566
  [](const std::string& /*name*/,
1930
2567
  std::unique_ptr<const Comparator>* /*guard*/,
@@ -1937,14 +2574,6 @@ TEST_F(OptionsOldApiTest, GetColumnFamilyOptionsFromStringTest) {
1937
2574
  // MergeOperator from object registry
1938
2575
  std::unique_ptr<BytesXOROperator> bxo(new BytesXOROperator());
1939
2576
  std::string kMoName = bxo->Name();
1940
- ObjectLibrary::Default()->Register<MergeOperator>(
1941
- kMoName,
1942
- [](const std::string& /*name*/, std::unique_ptr<MergeOperator>* guard,
1943
- std::string* /* errmsg */) {
1944
- guard->reset(new BytesXOROperator());
1945
- return guard->get();
1946
- });
1947
-
1948
2577
  ASSERT_OK(GetColumnFamilyOptionsFromString(
1949
2578
  base_cf_opt, "merge_operator=" + kMoName + ";", &new_cf_opt));
1950
2579
  ASSERT_EQ(kMoName, std::string(new_cf_opt.merge_operator->Name()));
@@ -1989,8 +2618,7 @@ TEST_F(OptionsOldApiTest, GetColumnFamilyOptionsFromStringTest) {
1989
2618
  ASSERT_EQ(new_cf_opt.write_buffer_size, 18 * giga);
1990
2619
  ASSERT_EQ(new_cf_opt.arena_block_size, 19 * giga);
1991
2620
  ASSERT_TRUE(new_cf_opt.prefix_extractor.get() != nullptr);
1992
- std::string prefix_name(new_cf_opt.prefix_extractor->Name());
1993
- ASSERT_EQ(prefix_name, "rocksdb.CappedPrefix.8");
2621
+ ASSERT_EQ(new_cf_opt.prefix_extractor->AsString(), "rocksdb.CappedPrefix.8");
1994
2622
 
1995
2623
  // Units (t)
1996
2624
  ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
@@ -2089,7 +2717,95 @@ TEST_F(OptionsOldApiTest, GetColumnFamilyOptionsFromStringTest) {
2089
2717
  "memtable=skip_list:10;arena_block_size=1024",
2090
2718
  &new_cf_opt));
2091
2719
  ASSERT_TRUE(new_cf_opt.memtable_factory != nullptr);
2092
- ASSERT_EQ(std::string(new_cf_opt.memtable_factory->Name()), "SkipListFactory");
2720
+ ASSERT_TRUE(new_cf_opt.memtable_factory->IsInstanceOf("SkipListFactory"));
2721
+ }
2722
+
2723
+ TEST_F(OptionsTest, SliceTransformCreateFromString) {
2724
+ std::shared_ptr<const SliceTransform> transform = nullptr;
2725
+ ConfigOptions config_options;
2726
+ config_options.ignore_unsupported_options = false;
2727
+ config_options.ignore_unknown_options = false;
2728
+
2729
+ ASSERT_OK(
2730
+ SliceTransform::CreateFromString(config_options, "fixed:31", &transform));
2731
+ ASSERT_NE(transform, nullptr);
2732
+ ASSERT_FALSE(transform->IsInstanceOf("capped"));
2733
+ ASSERT_TRUE(transform->IsInstanceOf("fixed"));
2734
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.FixedPrefix"));
2735
+ ASSERT_EQ(transform->GetId(), "rocksdb.FixedPrefix.31");
2736
+ ASSERT_OK(SliceTransform::CreateFromString(
2737
+ config_options, "rocksdb.FixedPrefix.42", &transform));
2738
+ ASSERT_NE(transform, nullptr);
2739
+ ASSERT_EQ(transform->GetId(), "rocksdb.FixedPrefix.42");
2740
+
2741
+ ASSERT_OK(SliceTransform::CreateFromString(config_options, "capped:16",
2742
+ &transform));
2743
+ ASSERT_NE(transform, nullptr);
2744
+ ASSERT_FALSE(transform->IsInstanceOf("fixed"));
2745
+ ASSERT_TRUE(transform->IsInstanceOf("capped"));
2746
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.CappedPrefix"));
2747
+ ASSERT_EQ(transform->GetId(), "rocksdb.CappedPrefix.16");
2748
+ ASSERT_OK(SliceTransform::CreateFromString(
2749
+ config_options, "rocksdb.CappedPrefix.42", &transform));
2750
+ ASSERT_NE(transform, nullptr);
2751
+ ASSERT_EQ(transform->GetId(), "rocksdb.CappedPrefix.42");
2752
+
2753
+ ASSERT_OK(SliceTransform::CreateFromString(config_options, "rocksdb.Noop",
2754
+ &transform));
2755
+ ASSERT_NE(transform, nullptr);
2756
+
2757
+ ASSERT_NOK(SliceTransform::CreateFromString(config_options,
2758
+ "fixed:21:invalid", &transform));
2759
+ ASSERT_NOK(SliceTransform::CreateFromString(config_options,
2760
+ "capped:21:invalid", &transform));
2761
+ ASSERT_NOK(
2762
+ SliceTransform::CreateFromString(config_options, "fixed", &transform));
2763
+ ASSERT_NOK(
2764
+ SliceTransform::CreateFromString(config_options, "capped", &transform));
2765
+ ASSERT_NOK(
2766
+ SliceTransform::CreateFromString(config_options, "fixed:", &transform));
2767
+ ASSERT_NOK(
2768
+ SliceTransform::CreateFromString(config_options, "capped:", &transform));
2769
+ ASSERT_NOK(SliceTransform::CreateFromString(
2770
+ config_options, "rocksdb.FixedPrefix:42", &transform));
2771
+ ASSERT_NOK(SliceTransform::CreateFromString(
2772
+ config_options, "rocksdb.CappedPrefix:42", &transform));
2773
+ ASSERT_NOK(SliceTransform::CreateFromString(
2774
+ config_options, "rocksdb.FixedPrefix", &transform));
2775
+ ASSERT_NOK(SliceTransform::CreateFromString(
2776
+ config_options, "rocksdb.CappedPrefix", &transform));
2777
+ ASSERT_NOK(SliceTransform::CreateFromString(
2778
+ config_options, "rocksdb.FixedPrefix.", &transform));
2779
+ ASSERT_NOK(SliceTransform::CreateFromString(
2780
+ config_options, "rocksdb.CappedPrefix.", &transform));
2781
+ ASSERT_NOK(
2782
+ SliceTransform::CreateFromString(config_options, "invalid", &transform));
2783
+
2784
+ #ifndef ROCKSDB_LITE
2785
+ ASSERT_OK(SliceTransform::CreateFromString(
2786
+ config_options, "rocksdb.CappedPrefix.11", &transform));
2787
+ ASSERT_NE(transform, nullptr);
2788
+ ASSERT_EQ(transform->GetId(), "rocksdb.CappedPrefix.11");
2789
+ ASSERT_TRUE(transform->IsInstanceOf("capped"));
2790
+ ASSERT_TRUE(transform->IsInstanceOf("capped:11"));
2791
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.CappedPrefix"));
2792
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.CappedPrefix.11"));
2793
+ ASSERT_FALSE(transform->IsInstanceOf("fixed"));
2794
+ ASSERT_FALSE(transform->IsInstanceOf("fixed:11"));
2795
+ ASSERT_FALSE(transform->IsInstanceOf("rocksdb.FixedPrefix"));
2796
+ ASSERT_FALSE(transform->IsInstanceOf("rocksdb.FixedPrefix.11"));
2797
+
2798
+ ASSERT_OK(SliceTransform::CreateFromString(
2799
+ config_options, "rocksdb.FixedPrefix.11", &transform));
2800
+ ASSERT_TRUE(transform->IsInstanceOf("fixed"));
2801
+ ASSERT_TRUE(transform->IsInstanceOf("fixed:11"));
2802
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.FixedPrefix"));
2803
+ ASSERT_TRUE(transform->IsInstanceOf("rocksdb.FixedPrefix.11"));
2804
+ ASSERT_FALSE(transform->IsInstanceOf("capped"));
2805
+ ASSERT_FALSE(transform->IsInstanceOf("capped:11"));
2806
+ ASSERT_FALSE(transform->IsInstanceOf("rocksdb.CappedPrefix"));
2807
+ ASSERT_FALSE(transform->IsInstanceOf("rocksdb.CappedPrefix.11"));
2808
+ #endif // ROCKSDB_LITE
2093
2809
  }
2094
2810
 
2095
2811
  TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
@@ -2099,7 +2815,7 @@ TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
2099
2815
  ASSERT_OK(GetBlockBasedTableOptionsFromString(
2100
2816
  table_opt,
2101
2817
  "cache_index_and_filter_blocks=1;index_type=kHashSearch;"
2102
- "checksum=kxxHash;hash_index_allow_collision=1;no_block_cache=1;"
2818
+ "checksum=kxxHash;no_block_cache=1;"
2103
2819
  "block_cache=1M;block_cache_compressed=1k;block_size=1024;"
2104
2820
  "block_size_deviation=8;block_restart_interval=4;"
2105
2821
  "format_version=5;whole_key_filtering=1;"
@@ -2108,7 +2824,6 @@ TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
2108
2824
  ASSERT_TRUE(new_opt.cache_index_and_filter_blocks);
2109
2825
  ASSERT_EQ(new_opt.index_type, BlockBasedTableOptions::kHashSearch);
2110
2826
  ASSERT_EQ(new_opt.checksum, ChecksumType::kxxHash);
2111
- ASSERT_TRUE(new_opt.hash_index_allow_collision);
2112
2827
  ASSERT_TRUE(new_opt.no_block_cache);
2113
2828
  ASSERT_TRUE(new_opt.block_cache != nullptr);
2114
2829
  ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
@@ -2120,10 +2835,10 @@ TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
2120
2835
  ASSERT_EQ(new_opt.format_version, 5U);
2121
2836
  ASSERT_EQ(new_opt.whole_key_filtering, true);
2122
2837
  ASSERT_TRUE(new_opt.filter_policy != nullptr);
2123
- const BloomFilterPolicy& bfp =
2124
- dynamic_cast<const BloomFilterPolicy&>(*new_opt.filter_policy);
2125
- EXPECT_EQ(bfp.GetMillibitsPerKey(), 4567);
2126
- EXPECT_EQ(bfp.GetWholeBitsPerKey(), 5);
2838
+ const BloomFilterPolicy* bfp =
2839
+ dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
2840
+ EXPECT_EQ(bfp->GetMillibitsPerKey(), 4567);
2841
+ EXPECT_EQ(bfp->GetWholeBitsPerKey(), 5);
2127
2842
 
2128
2843
  // unknown option
2129
2844
  ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
@@ -2159,14 +2874,12 @@ TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
2159
2874
  new_opt.cache_index_and_filter_blocks);
2160
2875
  ASSERT_EQ(table_opt.filter_policy, new_opt.filter_policy);
2161
2876
 
2162
- // unrecognized filter policy config
2163
- ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
2164
- "cache_index_and_filter_blocks=1;"
2165
- "filter_policy=bloomfilter:4",
2166
- &new_opt));
2167
- ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
2168
- new_opt.cache_index_and_filter_blocks);
2169
- ASSERT_EQ(table_opt.filter_policy, new_opt.filter_policy);
2877
+ // Used to be rejected, now accepted
2878
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
2879
+ table_opt, "filter_policy=bloomfilter:4", &new_opt));
2880
+ bfp = dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
2881
+ EXPECT_EQ(bfp->GetMillibitsPerKey(), 4000);
2882
+ EXPECT_EQ(bfp->GetWholeBitsPerKey(), 4);
2170
2883
 
2171
2884
  // Check block cache options are overwritten when specified
2172
2885
  // in new format as a struct.
@@ -2285,6 +2998,14 @@ TEST_F(OptionsOldApiTest, GetPlainTableOptionsFromString) {
2285
2998
  ASSERT_TRUE(new_opt.full_scan_mode);
2286
2999
  ASSERT_TRUE(new_opt.store_index_in_file);
2287
3000
 
3001
+ std::unordered_map<std::string, std::string> opt_map;
3002
+ ASSERT_OK(StringToMap(
3003
+ "user_key_len=55;bloom_bits_per_key=10;huge_page_tlb_size=8;", &opt_map));
3004
+ ASSERT_OK(GetPlainTableOptionsFromMap(table_opt, opt_map, &new_opt));
3005
+ ASSERT_EQ(new_opt.user_key_len, 55u);
3006
+ ASSERT_EQ(new_opt.bloom_bits_per_key, 10);
3007
+ ASSERT_EQ(new_opt.huge_page_tlb_size, 8);
3008
+
2288
3009
  // unknown option
2289
3010
  ASSERT_NOK(GetPlainTableOptionsFromString(table_opt,
2290
3011
  "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
@@ -2308,14 +3029,8 @@ TEST_F(OptionsOldApiTest, GetOptionsFromStringTest) {
2308
3029
  NewBlockBasedTableFactory(block_based_table_options));
2309
3030
 
2310
3031
  // Register an Env with object registry.
2311
- const static char* kCustomEnvName = "CustomEnv";
2312
- class CustomEnv : public EnvWrapper {
2313
- public:
2314
- explicit CustomEnv(Env* _target) : EnvWrapper(_target) {}
2315
- };
2316
-
2317
- ObjectLibrary::Default()->Register<Env>(
2318
- kCustomEnvName,
3032
+ ObjectLibrary::Default()->AddFactory<Env>(
3033
+ "CustomEnvDefault",
2319
3034
  [](const std::string& /*name*/, std::unique_ptr<Env>* /*env_guard*/,
2320
3035
  std::string* /* errmsg */) {
2321
3036
  static CustomEnv env(Env::Default());
@@ -2329,7 +3044,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromStringTest) {
2329
3044
  "compression_opts=4:5:6;create_if_missing=true;max_open_files=1;"
2330
3045
  "bottommost_compression_opts=5:6:7;create_if_missing=true;max_open_files="
2331
3046
  "1;"
2332
- "rate_limiter_bytes_per_sec=1024;env=CustomEnv",
3047
+ "rate_limiter_bytes_per_sec=1024;env=CustomEnvDefault",
2333
3048
  &new_options));
2334
3049
 
2335
3050
  ASSERT_EQ(new_options.compression_opts.window_bits, 4);
@@ -2363,7 +3078,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromStringTest) {
2363
3078
  ASSERT_EQ(new_options.max_open_files, 1);
2364
3079
  ASSERT_TRUE(new_options.rate_limiter.get() != nullptr);
2365
3080
  Env* newEnv = new_options.env;
2366
- ASSERT_OK(Env::LoadEnv(kCustomEnvName, &newEnv));
3081
+ ASSERT_OK(Env::LoadEnv("CustomEnvDefault", &newEnv));
2367
3082
  ASSERT_EQ(newEnv, new_options.env);
2368
3083
  }
2369
3084
 
@@ -2758,8 +3473,8 @@ void VerifyCFPointerTypedOptions(
2758
3473
 
2759
3474
  // change the name of merge operator back-and-forth
2760
3475
  {
2761
- auto* merge_operator = dynamic_cast<test::ChanglingMergeOperator*>(
2762
- base_cf_opt->merge_operator.get());
3476
+ auto* merge_operator = base_cf_opt->merge_operator
3477
+ ->CheckedCast<test::ChanglingMergeOperator>();
2763
3478
  if (merge_operator != nullptr) {
2764
3479
  name_buffer = merge_operator->Name();
2765
3480
  // change the name and expect non-ok status
@@ -2776,8 +3491,8 @@ void VerifyCFPointerTypedOptions(
2776
3491
  // change the name of the compaction filter factory back-and-forth
2777
3492
  {
2778
3493
  auto* compaction_filter_factory =
2779
- dynamic_cast<test::ChanglingCompactionFilterFactory*>(
2780
- base_cf_opt->compaction_filter_factory.get());
3494
+ base_cf_opt->compaction_filter_factory
3495
+ ->CheckedCast<test::ChanglingCompactionFilterFactory>();
2781
3496
  if (compaction_filter_factory != nullptr) {
2782
3497
  name_buffer = compaction_filter_factory->Name();
2783
3498
  // change the name and expect non-ok status
@@ -3060,37 +3775,86 @@ TEST_F(OptionsParserTest, DifferentDefault) {
3060
3775
  ASSERT_EQ(5000, small_opts.max_open_files);
3061
3776
  }
3062
3777
 
3063
- class OptionsSanityCheckTest : public OptionsParserTest {
3778
+ class OptionsSanityCheckTest : public OptionsParserTest,
3779
+ public ::testing::WithParamInterface<bool> {
3780
+ protected:
3781
+ ConfigOptions config_options_;
3782
+
3064
3783
  public:
3065
- OptionsSanityCheckTest() {}
3784
+ OptionsSanityCheckTest() {
3785
+ config_options_.ignore_unknown_options = false;
3786
+ config_options_.ignore_unsupported_options = GetParam();
3787
+ config_options_.input_strings_escaped = true;
3788
+ }
3066
3789
 
3067
3790
  protected:
3068
- Status SanityCheckCFOptions(const ColumnFamilyOptions& cf_opts,
3069
- ConfigOptions::SanityLevel level,
3070
- bool input_strings_escaped = true) {
3071
- ConfigOptions config_options;
3072
- config_options.sanity_level = level;
3073
- config_options.ignore_unknown_options = false;
3074
- config_options.input_strings_escaped = input_strings_escaped;
3075
-
3791
+ Status SanityCheckOptions(const DBOptions& db_opts,
3792
+ const ColumnFamilyOptions& cf_opts,
3793
+ ConfigOptions::SanityLevel level) {
3794
+ config_options_.sanity_level = level;
3076
3795
  return RocksDBOptionsParser::VerifyRocksDBOptionsFromFile(
3077
- config_options, DBOptions(), {"default"}, {cf_opts}, kOptionsFileName,
3796
+ config_options_, db_opts, {"default"}, {cf_opts}, kOptionsFileName,
3078
3797
  fs_.get());
3079
3798
  }
3080
3799
 
3081
- Status PersistCFOptions(const ColumnFamilyOptions& cf_opts) {
3800
+ Status SanityCheckCFOptions(const ColumnFamilyOptions& cf_opts,
3801
+ ConfigOptions::SanityLevel level) {
3802
+ return SanityCheckOptions(DBOptions(), cf_opts, level);
3803
+ }
3804
+
3805
+ void SanityCheckCFOptions(const ColumnFamilyOptions& opts, bool exact) {
3806
+ ASSERT_OK(SanityCheckCFOptions(
3807
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3808
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3809
+ if (exact) {
3810
+ ASSERT_OK(
3811
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3812
+ } else {
3813
+ ASSERT_NOK(
3814
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3815
+ }
3816
+ }
3817
+
3818
+ Status SanityCheckDBOptions(const DBOptions& db_opts,
3819
+ ConfigOptions::SanityLevel level) {
3820
+ return SanityCheckOptions(db_opts, ColumnFamilyOptions(), level);
3821
+ }
3822
+
3823
+ void SanityCheckDBOptions(const DBOptions& opts, bool exact) {
3824
+ ASSERT_OK(SanityCheckDBOptions(
3825
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3826
+ ASSERT_OK(SanityCheckDBOptions(opts, ConfigOptions::kSanityLevelNone));
3827
+ if (exact) {
3828
+ ASSERT_OK(
3829
+ SanityCheckDBOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3830
+ } else {
3831
+ ASSERT_NOK(
3832
+ SanityCheckDBOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3833
+ }
3834
+ }
3835
+
3836
+ Status PersistOptions(const DBOptions& db_opts,
3837
+ const ColumnFamilyOptions& cf_opts) {
3082
3838
  Status s = fs_->DeleteFile(kOptionsFileName, IOOptions(), nullptr);
3083
3839
  if (!s.ok()) {
3084
3840
  return s;
3085
3841
  }
3086
- return PersistRocksDBOptions(DBOptions(), {"default"}, {cf_opts},
3842
+ return PersistRocksDBOptions(db_opts, {"default"}, {cf_opts},
3087
3843
  kOptionsFileName, fs_.get());
3088
3844
  }
3089
3845
 
3846
+ Status PersistCFOptions(const ColumnFamilyOptions& cf_opts) {
3847
+ return PersistOptions(DBOptions(), cf_opts);
3848
+ }
3849
+
3850
+ Status PersistDBOptions(const DBOptions& db_opts) {
3851
+ return PersistOptions(db_opts, ColumnFamilyOptions());
3852
+ }
3853
+
3090
3854
  const std::string kOptionsFileName = "OPTIONS";
3091
3855
  };
3092
3856
 
3093
- TEST_F(OptionsSanityCheckTest, SanityCheck) {
3857
+ TEST_P(OptionsSanityCheckTest, CFOptionsSanityCheck) {
3094
3858
  ColumnFamilyOptions opts;
3095
3859
  Random rnd(301);
3096
3860
 
@@ -3142,11 +3906,7 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3142
3906
  opts.prefix_extractor.reset(NewFixedPrefixTransform(15));
3143
3907
  // expect pass only in
3144
3908
  // ConfigOptions::kSanityLevelLooselyCompatible
3145
- ASSERT_NOK(
3146
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3147
- ASSERT_OK(SanityCheckCFOptions(
3148
- opts, ConfigOptions::kSanityLevelLooselyCompatible));
3149
- ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3909
+ SanityCheckCFOptions(opts, false);
3150
3910
 
3151
3911
  // Change prefix extractor from non-nullptr to nullptr
3152
3912
  opts.prefix_extractor.reset();
@@ -3186,8 +3946,7 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3186
3946
 
3187
3947
  // persist the change
3188
3948
  ASSERT_OK(PersistCFOptions(opts));
3189
- ASSERT_OK(
3190
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3949
+ SanityCheckCFOptions(opts, config_options_.ignore_unsupported_options);
3191
3950
 
3192
3951
  for (int test = 0; test < 5; ++test) {
3193
3952
  // change the merge operator
@@ -3198,8 +3957,7 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3198
3957
 
3199
3958
  // persist the change
3200
3959
  ASSERT_OK(PersistCFOptions(opts));
3201
- ASSERT_OK(
3202
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3960
+ SanityCheckCFOptions(opts, config_options_.ignore_unsupported_options);
3203
3961
  }
3204
3962
 
3205
3963
  // Test when going from merge operator -> nullptr
@@ -3210,8 +3968,7 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3210
3968
 
3211
3969
  // persist the change
3212
3970
  ASSERT_OK(PersistCFOptions(opts));
3213
- ASSERT_OK(
3214
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3971
+ SanityCheckCFOptions(opts, true);
3215
3972
  }
3216
3973
 
3217
3974
  // compaction_filter
@@ -3219,15 +3976,11 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3219
3976
  for (int test = 0; test < 5; ++test) {
3220
3977
  // change the compaction filter
3221
3978
  opts.compaction_filter = test::RandomCompactionFilter(&rnd);
3222
- ASSERT_NOK(
3223
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3224
- ASSERT_OK(SanityCheckCFOptions(
3225
- opts, ConfigOptions::kSanityLevelLooselyCompatible));
3979
+ SanityCheckCFOptions(opts, false);
3226
3980
 
3227
3981
  // persist the change
3228
3982
  ASSERT_OK(PersistCFOptions(opts));
3229
- ASSERT_OK(
3230
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3983
+ SanityCheckCFOptions(opts, config_options_.ignore_unsupported_options);
3231
3984
  delete opts.compaction_filter;
3232
3985
  opts.compaction_filter = nullptr;
3233
3986
  }
@@ -3239,19 +3992,57 @@ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3239
3992
  // change the compaction filter factory
3240
3993
  opts.compaction_filter_factory.reset(
3241
3994
  test::RandomCompactionFilterFactory(&rnd));
3242
- ASSERT_NOK(
3243
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3244
- ASSERT_OK(SanityCheckCFOptions(
3245
- opts, ConfigOptions::kSanityLevelLooselyCompatible));
3995
+ SanityCheckCFOptions(opts, false);
3246
3996
 
3247
3997
  // persist the change
3248
3998
  ASSERT_OK(PersistCFOptions(opts));
3249
- ASSERT_OK(
3250
- SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3999
+ SanityCheckCFOptions(opts, config_options_.ignore_unsupported_options);
3251
4000
  }
3252
4001
  }
3253
4002
  }
3254
4003
 
4004
+ TEST_P(OptionsSanityCheckTest, DBOptionsSanityCheck) {
4005
+ DBOptions opts;
4006
+ Random rnd(301);
4007
+
4008
+ // default DBOptions
4009
+ {
4010
+ ASSERT_OK(PersistDBOptions(opts));
4011
+ ASSERT_OK(
4012
+ SanityCheckDBOptions(opts, ConfigOptions::kSanityLevelExactMatch));
4013
+ }
4014
+
4015
+ // File checksum generator
4016
+ {
4017
+ class MockFileChecksumGenFactory : public FileChecksumGenFactory {
4018
+ public:
4019
+ static const char* kClassName() { return "Mock"; }
4020
+ const char* Name() const override { return kClassName(); }
4021
+ std::unique_ptr<FileChecksumGenerator> CreateFileChecksumGenerator(
4022
+ const FileChecksumGenContext& /*context*/) override {
4023
+ return nullptr;
4024
+ }
4025
+ };
4026
+
4027
+ // Okay to change file_checksum_gen_factory form nullptr to non-nullptr
4028
+ ASSERT_EQ(opts.file_checksum_gen_factory.get(), nullptr);
4029
+ opts.file_checksum_gen_factory.reset(new MockFileChecksumGenFactory());
4030
+
4031
+ // persist the change
4032
+ ASSERT_OK(PersistDBOptions(opts));
4033
+ SanityCheckDBOptions(opts, config_options_.ignore_unsupported_options);
4034
+
4035
+ // Change file_checksum_gen_factory from non-nullptr to nullptr
4036
+ opts.file_checksum_gen_factory.reset();
4037
+ // expect pass as it's safe to change file_checksum_gen_factory
4038
+ // from non-null to null
4039
+ SanityCheckDBOptions(opts, false);
4040
+ }
4041
+ // persist the change
4042
+ ASSERT_OK(PersistDBOptions(opts));
4043
+ ASSERT_OK(SanityCheckDBOptions(opts, ConfigOptions::kSanityLevelExactMatch));
4044
+ }
4045
+
3255
4046
  namespace {
3256
4047
  bool IsEscapedString(const std::string& str) {
3257
4048
  for (size_t i = 0; i < str.size(); ++i) {
@@ -3342,21 +4133,28 @@ TEST_F(OptionsParserTest, EscapeOptionString) {
3342
4133
  static void TestAndCompareOption(const ConfigOptions& config_options,
3343
4134
  const OptionTypeInfo& opt_info,
3344
4135
  const std::string& opt_name, void* base_ptr,
3345
- void* comp_ptr) {
4136
+ void* comp_ptr, bool strip = false) {
3346
4137
  std::string result, mismatch;
3347
4138
  ASSERT_OK(opt_info.Serialize(config_options, opt_name, base_ptr, &result));
4139
+ if (strip) {
4140
+ ASSERT_EQ(result.at(0), '{');
4141
+ ASSERT_EQ(result.at(result.size() - 1), '}');
4142
+ result = result.substr(1, result.size() - 2);
4143
+ }
3348
4144
  ASSERT_OK(opt_info.Parse(config_options, opt_name, result, comp_ptr));
3349
4145
  ASSERT_TRUE(opt_info.AreEqual(config_options, opt_name, base_ptr, comp_ptr,
3350
4146
  &mismatch));
3351
4147
  }
3352
4148
 
3353
- static void TestAndCompareOption(const ConfigOptions& config_options,
3354
- const OptionTypeInfo& opt_info,
3355
- const std::string& opt_name,
3356
- const std::string& opt_value, void* base_ptr,
3357
- void* comp_ptr) {
4149
+ static void TestParseAndCompareOption(const ConfigOptions& config_options,
4150
+ const OptionTypeInfo& opt_info,
4151
+ const std::string& opt_name,
4152
+ const std::string& opt_value,
4153
+ void* base_ptr, void* comp_ptr,
4154
+ bool strip = false) {
3358
4155
  ASSERT_OK(opt_info.Parse(config_options, opt_name, opt_value, base_ptr));
3359
- TestAndCompareOption(config_options, opt_info, opt_name, base_ptr, comp_ptr);
4156
+ TestAndCompareOption(config_options, opt_info, opt_name, base_ptr, comp_ptr,
4157
+ strip);
3360
4158
  }
3361
4159
 
3362
4160
  template <typename T>
@@ -3457,8 +4255,8 @@ TEST_F(OptionTypeInfoTest, TestInvalidArgs) {
3457
4255
  OptionVerificationType::kNormal,
3458
4256
  OptionTypeFlags::kNone,
3459
4257
  [](const ConfigOptions&, const std::string&,
3460
- const std::string& value, char* addr) {
3461
- auto ptr = reinterpret_cast<int*>(addr);
4258
+ const std::string& value, void* addr) {
4259
+ auto ptr = static_cast<int*>(addr);
3462
4260
  *ptr = ParseInt(value);
3463
4261
  return Status::OK();
3464
4262
  });
@@ -3471,8 +4269,8 @@ TEST_F(OptionTypeInfoTest, TestParseFunc) {
3471
4269
  0, OptionType::kUnknown, OptionVerificationType::kNormal,
3472
4270
  OptionTypeFlags::kNone,
3473
4271
  [](const ConfigOptions& /*opts*/, const std::string& name,
3474
- const std::string& value, char* addr) {
3475
- auto ptr = reinterpret_cast<std::string*>(addr);
4272
+ const std::string& value, void* addr) {
4273
+ auto ptr = static_cast<std::string*>(addr);
3476
4274
  if (name == "Oops") {
3477
4275
  return Status::InvalidArgument(value);
3478
4276
  } else {
@@ -3492,7 +4290,7 @@ TEST_F(OptionTypeInfoTest, TestSerializeFunc) {
3492
4290
  0, OptionType::kString, OptionVerificationType::kNormal,
3493
4291
  OptionTypeFlags::kNone, nullptr,
3494
4292
  [](const ConfigOptions& /*opts*/, const std::string& name,
3495
- const char* /*addr*/, std::string* value) {
4293
+ const void* /*addr*/, std::string* value) {
3496
4294
  if (name == "Oops") {
3497
4295
  return Status::InvalidArgument(name);
3498
4296
  } else {
@@ -3514,9 +4312,9 @@ TEST_F(OptionTypeInfoTest, TestEqualsFunc) {
3514
4312
  0, OptionType::kInt, OptionVerificationType::kNormal,
3515
4313
  OptionTypeFlags::kNone, nullptr, nullptr,
3516
4314
  [](const ConfigOptions& /*opts*/, const std::string& name,
3517
- const char* addr1, const char* addr2, std::string* mismatch) {
3518
- auto i1 = *(reinterpret_cast<const int*>(addr1));
3519
- auto i2 = *(reinterpret_cast<const int*>(addr2));
4315
+ const void* addr1, const void* addr2, std::string* mismatch) {
4316
+ auto i1 = *(static_cast<const int*>(addr1));
4317
+ auto i2 = *(static_cast<const int*>(addr2));
3520
4318
  if (name == "LT") {
3521
4319
  return i1 < i2;
3522
4320
  } else if (name == "GT") {
@@ -3570,8 +4368,7 @@ TEST_F(OptionTypeInfoTest, TestOptionFlags) {
3570
4368
  // An alias can change the value via parse, but does nothing on serialize on
3571
4369
  // match
3572
4370
  std::string result;
3573
- ASSERT_OK(opt_alias.Parse(config_options, "Alias", "Alias",
3574
- reinterpret_cast<char*>(&base)));
4371
+ ASSERT_OK(opt_alias.Parse(config_options, "Alias", "Alias", &base));
3575
4372
  ASSERT_OK(opt_alias.Serialize(config_options, "Alias", &base, &result));
3576
4373
  ASSERT_TRUE(
3577
4374
  opt_alias.AreEqual(config_options, "Alias", &base, &comp, &result));
@@ -3609,7 +4406,7 @@ TEST_F(OptionTypeInfoTest, TestCustomEnum) {
3609
4406
  ASSERT_FALSE(opt_info.AreEqual(config_options, "Enum", &e1, &e2, &mismatch));
3610
4407
  ASSERT_EQ(mismatch, "Enum");
3611
4408
 
3612
- TestAndCompareOption(config_options, opt_info, "", "C", &e1, &e2);
4409
+ TestParseAndCompareOption(config_options, opt_info, "", "C", &e1, &e2);
3613
4410
  ASSERT_EQ(e2, TestEnum::kC);
3614
4411
 
3615
4412
  ASSERT_NOK(opt_info.Parse(config_options, "", "D", &e1));
@@ -3620,44 +4417,44 @@ TEST_F(OptionTypeInfoTest, TestBuiltinEnum) {
3620
4417
  ConfigOptions config_options;
3621
4418
  for (auto iter : OptionsHelper::compaction_style_string_map) {
3622
4419
  CompactionStyle e1, e2;
3623
- TestAndCompareOption(config_options,
3624
- OptionTypeInfo(0, OptionType::kCompactionStyle),
3625
- "CompactionStyle", iter.first, &e1, &e2);
4420
+ TestParseAndCompareOption(config_options,
4421
+ OptionTypeInfo(0, OptionType::kCompactionStyle),
4422
+ "CompactionStyle", iter.first, &e1, &e2);
3626
4423
  ASSERT_EQ(e1, iter.second);
3627
4424
  }
3628
4425
  for (auto iter : OptionsHelper::compaction_pri_string_map) {
3629
4426
  CompactionPri e1, e2;
3630
- TestAndCompareOption(config_options,
3631
- OptionTypeInfo(0, OptionType::kCompactionPri),
3632
- "CompactionPri", iter.first, &e1, &e2);
4427
+ TestParseAndCompareOption(config_options,
4428
+ OptionTypeInfo(0, OptionType::kCompactionPri),
4429
+ "CompactionPri", iter.first, &e1, &e2);
3633
4430
  ASSERT_EQ(e1, iter.second);
3634
4431
  }
3635
4432
  for (auto iter : OptionsHelper::compression_type_string_map) {
3636
4433
  CompressionType e1, e2;
3637
- TestAndCompareOption(config_options,
3638
- OptionTypeInfo(0, OptionType::kCompressionType),
3639
- "CompressionType", iter.first, &e1, &e2);
4434
+ TestParseAndCompareOption(config_options,
4435
+ OptionTypeInfo(0, OptionType::kCompressionType),
4436
+ "CompressionType", iter.first, &e1, &e2);
3640
4437
  ASSERT_EQ(e1, iter.second);
3641
4438
  }
3642
4439
  for (auto iter : OptionsHelper::compaction_stop_style_string_map) {
3643
4440
  CompactionStopStyle e1, e2;
3644
- TestAndCompareOption(config_options,
3645
- OptionTypeInfo(0, OptionType::kCompactionStopStyle),
3646
- "CompactionStopStyle", iter.first, &e1, &e2);
4441
+ TestParseAndCompareOption(
4442
+ config_options, OptionTypeInfo(0, OptionType::kCompactionStopStyle),
4443
+ "CompactionStopStyle", iter.first, &e1, &e2);
3647
4444
  ASSERT_EQ(e1, iter.second);
3648
4445
  }
3649
4446
  for (auto iter : OptionsHelper::checksum_type_string_map) {
3650
4447
  ChecksumType e1, e2;
3651
- TestAndCompareOption(config_options,
3652
- OptionTypeInfo(0, OptionType::kChecksumType),
3653
- "CheckSumType", iter.first, &e1, &e2);
4448
+ TestParseAndCompareOption(config_options,
4449
+ OptionTypeInfo(0, OptionType::kChecksumType),
4450
+ "CheckSumType", iter.first, &e1, &e2);
3654
4451
  ASSERT_EQ(e1, iter.second);
3655
4452
  }
3656
4453
  for (auto iter : OptionsHelper::encoding_type_string_map) {
3657
4454
  EncodingType e1, e2;
3658
- TestAndCompareOption(config_options,
3659
- OptionTypeInfo(0, OptionType::kEncodingType),
3660
- "EncodingType", iter.first, &e1, &e2);
4455
+ TestParseAndCompareOption(config_options,
4456
+ OptionTypeInfo(0, OptionType::kEncodingType),
4457
+ "EncodingType", iter.first, &e1, &e2);
3661
4458
  ASSERT_EQ(e1, iter.second);
3662
4459
  }
3663
4460
  }
@@ -3696,15 +4493,17 @@ TEST_F(OptionTypeInfoTest, TestStruct) {
3696
4493
  Extended e1, e2;
3697
4494
  ConfigOptions config_options;
3698
4495
  std::string mismatch;
3699
- TestAndCompareOption(config_options, basic_info, "b", "{i=33;s=33}", &e1.b,
3700
- &e2.b);
4496
+ TestParseAndCompareOption(config_options, basic_info, "b", "{i=33;s=33}",
4497
+ &e1.b, &e2.b);
3701
4498
  ASSERT_EQ(e1.b.i, 33);
3702
4499
  ASSERT_EQ(e1.b.s, "33");
3703
4500
 
3704
- TestAndCompareOption(config_options, basic_info, "b.i", "44", &e1.b, &e2.b);
4501
+ TestParseAndCompareOption(config_options, basic_info, "b.i", "44", &e1.b,
4502
+ &e2.b);
3705
4503
  ASSERT_EQ(e1.b.i, 44);
3706
4504
 
3707
- TestAndCompareOption(config_options, basic_info, "i", "55", &e1.b, &e2.b);
4505
+ TestParseAndCompareOption(config_options, basic_info, "i", "55", &e1.b,
4506
+ &e2.b);
3708
4507
  ASSERT_EQ(e1.b.i, 55);
3709
4508
 
3710
4509
  e1.b.i = 0;
@@ -3727,17 +4526,18 @@ TEST_F(OptionTypeInfoTest, TestStruct) {
3727
4526
  ASSERT_NOK(basic_info.Parse(config_options, "b.j", "44", &e1.b));
3728
4527
  ASSERT_NOK(basic_info.Parse(config_options, "j", "44", &e1.b));
3729
4528
 
3730
- TestAndCompareOption(config_options, extended_info, "e",
3731
- "b={i=55;s=55}; j=22;", &e1, &e2);
4529
+ TestParseAndCompareOption(config_options, extended_info, "e",
4530
+ "b={i=55;s=55}; j=22;", &e1, &e2);
3732
4531
  ASSERT_EQ(e1.b.i, 55);
3733
4532
  ASSERT_EQ(e1.j, 22);
3734
4533
  ASSERT_EQ(e1.b.s, "55");
3735
- TestAndCompareOption(config_options, extended_info, "e.b", "{i=66;s=66;}",
3736
- &e1, &e2);
4534
+ TestParseAndCompareOption(config_options, extended_info, "e.b",
4535
+ "{i=66;s=66;}", &e1, &e2);
3737
4536
  ASSERT_EQ(e1.b.i, 66);
3738
4537
  ASSERT_EQ(e1.j, 22);
3739
4538
  ASSERT_EQ(e1.b.s, "66");
3740
- TestAndCompareOption(config_options, extended_info, "e.b.i", "77", &e1, &e2);
4539
+ TestParseAndCompareOption(config_options, extended_info, "e.b.i", "77", &e1,
4540
+ &e2);
3741
4541
  ASSERT_EQ(e1.b.i, 77);
3742
4542
  ASSERT_EQ(e1.j, 22);
3743
4543
  ASSERT_EQ(e1.b.s, "66");
@@ -3751,7 +4551,8 @@ TEST_F(OptionTypeInfoTest, TestVectorType) {
3751
4551
  std::string mismatch;
3752
4552
 
3753
4553
  ConfigOptions config_options;
3754
- TestAndCompareOption(config_options, vec_info, "v", "a:b:c:d", &vec1, &vec2);
4554
+ TestParseAndCompareOption(config_options, vec_info, "v", "a:b:c:d", &vec1,
4555
+ &vec2);
3755
4556
  ASSERT_EQ(vec1.size(), 4);
3756
4557
  ASSERT_EQ(vec1[0], "a");
3757
4558
  ASSERT_EQ(vec1[1], "b");
@@ -3762,8 +4563,8 @@ TEST_F(OptionTypeInfoTest, TestVectorType) {
3762
4563
  ASSERT_EQ(mismatch, "v");
3763
4564
 
3764
4565
  // Test vectors with inner brackets
3765
- TestAndCompareOption(config_options, vec_info, "v", "a:{b}:c:d", &vec1,
3766
- &vec2);
4566
+ TestParseAndCompareOption(config_options, vec_info, "v", "a:{b}:c:d", &vec1,
4567
+ &vec2);
3767
4568
  ASSERT_EQ(vec1.size(), 4);
3768
4569
  ASSERT_EQ(vec1[0], "a");
3769
4570
  ASSERT_EQ(vec1[1], "b");
@@ -3773,16 +4574,190 @@ TEST_F(OptionTypeInfoTest, TestVectorType) {
3773
4574
  OptionTypeInfo bar_info = OptionTypeInfo::Vector<std::string>(
3774
4575
  0, OptionVerificationType::kNormal, OptionTypeFlags::kNone,
3775
4576
  {0, OptionType::kString}, '|');
3776
- TestAndCompareOption(config_options, vec_info, "v", "x|y|z", &vec1, &vec2);
4577
+ TestParseAndCompareOption(config_options, vec_info, "v", "x|y|z", &vec1,
4578
+ &vec2);
3777
4579
  // Test vectors with inner vector
3778
- TestAndCompareOption(config_options, bar_info, "v",
3779
- "a|{b1|b2}|{c1|c2|{d1|d2}}", &vec1, &vec2);
4580
+ TestParseAndCompareOption(config_options, bar_info, "v",
4581
+ "a|{b1|b2}|{c1|c2|{d1|d2}}", &vec1, &vec2, false);
3780
4582
  ASSERT_EQ(vec1.size(), 3);
3781
4583
  ASSERT_EQ(vec1[0], "a");
3782
4584
  ASSERT_EQ(vec1[1], "b1|b2");
3783
4585
  ASSERT_EQ(vec1[2], "c1|c2|{d1|d2}");
4586
+
4587
+ TestParseAndCompareOption(config_options, bar_info, "v",
4588
+ "{a1|a2}|{b1|{c1|c2}}|d1", &vec1, &vec2, true);
4589
+ ASSERT_EQ(vec1.size(), 3);
4590
+ ASSERT_EQ(vec1[0], "a1|a2");
4591
+ ASSERT_EQ(vec1[1], "b1|{c1|c2}");
4592
+ ASSERT_EQ(vec1[2], "d1");
4593
+
4594
+ TestParseAndCompareOption(config_options, bar_info, "v", "{a1}", &vec1, &vec2,
4595
+ false);
4596
+ ASSERT_EQ(vec1.size(), 1);
4597
+ ASSERT_EQ(vec1[0], "a1");
4598
+
4599
+ TestParseAndCompareOption(config_options, bar_info, "v", "{a1|a2}|{b1|b2}",
4600
+ &vec1, &vec2, true);
4601
+ ASSERT_EQ(vec1.size(), 2);
4602
+ ASSERT_EQ(vec1[0], "a1|a2");
4603
+ ASSERT_EQ(vec1[1], "b1|b2");
4604
+ }
4605
+
4606
+ TEST_F(OptionTypeInfoTest, TestStaticType) {
4607
+ struct SimpleOptions {
4608
+ size_t size = 0;
4609
+ bool verify = true;
4610
+ };
4611
+
4612
+ static std::unordered_map<std::string, OptionTypeInfo> type_map = {
4613
+ {"size", {offsetof(struct SimpleOptions, size), OptionType::kSizeT}},
4614
+ {"verify",
4615
+ {offsetof(struct SimpleOptions, verify), OptionType::kBoolean}},
4616
+ };
4617
+
4618
+ ConfigOptions config_options;
4619
+ SimpleOptions opts, copy;
4620
+ opts.size = 12345;
4621
+ opts.verify = false;
4622
+ std::string str, mismatch;
4623
+
4624
+ ASSERT_OK(
4625
+ OptionTypeInfo::SerializeType(config_options, type_map, &opts, &str));
4626
+ ASSERT_FALSE(OptionTypeInfo::TypesAreEqual(config_options, type_map, &opts,
4627
+ &copy, &mismatch));
4628
+ ASSERT_OK(OptionTypeInfo::ParseType(config_options, str, type_map, &copy));
4629
+ ASSERT_TRUE(OptionTypeInfo::TypesAreEqual(config_options, type_map, &opts,
4630
+ &copy, &mismatch));
4631
+ }
4632
+
4633
+ class ConfigOptionsTest : public testing::Test {};
4634
+
4635
+ TEST_F(ConfigOptionsTest, EnvFromConfigOptions) {
4636
+ ConfigOptions config_options;
4637
+ DBOptions db_opts;
4638
+ Options opts;
4639
+ Env* mem_env = NewMemEnv(Env::Default());
4640
+ config_options.registry->AddLibrary("custom-env", RegisterCustomEnv,
4641
+ kCustomEnvName);
4642
+
4643
+ config_options.env = mem_env;
4644
+ // First test that we can get the env as expected
4645
+ ASSERT_OK(GetDBOptionsFromString(config_options, DBOptions(), kCustomEnvProp,
4646
+ &db_opts));
4647
+ ASSERT_OK(
4648
+ GetOptionsFromString(config_options, Options(), kCustomEnvProp, &opts));
4649
+ ASSERT_NE(config_options.env, db_opts.env);
4650
+ ASSERT_EQ(opts.env, db_opts.env);
4651
+ Env* custom_env = db_opts.env;
4652
+
4653
+ // Now try a "bad" env" and check that nothing changed
4654
+ config_options.ignore_unsupported_options = true;
4655
+ ASSERT_OK(
4656
+ GetDBOptionsFromString(config_options, db_opts, "env=unknown", &db_opts));
4657
+ ASSERT_OK(GetOptionsFromString(config_options, opts, "env=unknown", &opts));
4658
+ ASSERT_EQ(config_options.env, mem_env);
4659
+ ASSERT_EQ(db_opts.env, custom_env);
4660
+ ASSERT_EQ(opts.env, db_opts.env);
4661
+
4662
+ // Now try a "bad" env" ignoring unknown objects
4663
+ config_options.ignore_unsupported_options = false;
4664
+ ASSERT_NOK(
4665
+ GetDBOptionsFromString(config_options, db_opts, "env=unknown", &db_opts));
4666
+ ASSERT_EQ(config_options.env, mem_env);
4667
+ ASSERT_EQ(db_opts.env, custom_env);
4668
+ ASSERT_EQ(opts.env, db_opts.env);
4669
+
4670
+ delete mem_env;
4671
+ }
4672
+ TEST_F(ConfigOptionsTest, MergeOperatorFromString) {
4673
+ ConfigOptions config_options;
4674
+ std::shared_ptr<MergeOperator> merge_op;
4675
+
4676
+ ASSERT_OK(MergeOperator::CreateFromString(config_options, "put", &merge_op));
4677
+ ASSERT_NE(merge_op, nullptr);
4678
+ ASSERT_TRUE(merge_op->IsInstanceOf("put"));
4679
+ ASSERT_STREQ(merge_op->Name(), "PutOperator");
4680
+
4681
+ ASSERT_OK(
4682
+ MergeOperator::CreateFromString(config_options, "put_v1", &merge_op));
4683
+ ASSERT_NE(merge_op, nullptr);
4684
+ ASSERT_TRUE(merge_op->IsInstanceOf("PutOperator"));
4685
+
4686
+ ASSERT_OK(
4687
+ MergeOperator::CreateFromString(config_options, "uint64add", &merge_op));
4688
+ ASSERT_NE(merge_op, nullptr);
4689
+ ASSERT_TRUE(merge_op->IsInstanceOf("uint64add"));
4690
+ ASSERT_STREQ(merge_op->Name(), "UInt64AddOperator");
4691
+
4692
+ ASSERT_OK(MergeOperator::CreateFromString(config_options, "max", &merge_op));
4693
+ ASSERT_NE(merge_op, nullptr);
4694
+ ASSERT_TRUE(merge_op->IsInstanceOf("max"));
4695
+ ASSERT_STREQ(merge_op->Name(), "MaxOperator");
4696
+
4697
+ ASSERT_OK(
4698
+ MergeOperator::CreateFromString(config_options, "bytesxor", &merge_op));
4699
+ ASSERT_NE(merge_op, nullptr);
4700
+ ASSERT_TRUE(merge_op->IsInstanceOf("bytesxor"));
4701
+ ASSERT_STREQ(merge_op->Name(), BytesXOROperator::kClassName());
4702
+
4703
+ ASSERT_OK(
4704
+ MergeOperator::CreateFromString(config_options, "sortlist", &merge_op));
4705
+ ASSERT_NE(merge_op, nullptr);
4706
+ ASSERT_TRUE(merge_op->IsInstanceOf("sortlist"));
4707
+ ASSERT_STREQ(merge_op->Name(), SortList::kClassName());
4708
+
4709
+ ASSERT_OK(MergeOperator::CreateFromString(config_options, "stringappend",
4710
+ &merge_op));
4711
+ ASSERT_NE(merge_op, nullptr);
4712
+ ASSERT_TRUE(merge_op->IsInstanceOf("stringappend"));
4713
+ ASSERT_STREQ(merge_op->Name(), StringAppendOperator::kClassName());
4714
+ auto delimiter = merge_op->GetOptions<std::string>("Delimiter");
4715
+ ASSERT_NE(delimiter, nullptr);
4716
+ ASSERT_EQ(*delimiter, ",");
4717
+
4718
+ ASSERT_OK(MergeOperator::CreateFromString(config_options, "stringappendtest",
4719
+ &merge_op));
4720
+ ASSERT_NE(merge_op, nullptr);
4721
+ ASSERT_TRUE(merge_op->IsInstanceOf("stringappendtest"));
4722
+ ASSERT_STREQ(merge_op->Name(), StringAppendTESTOperator::kClassName());
4723
+ delimiter = merge_op->GetOptions<std::string>("Delimiter");
4724
+ ASSERT_NE(delimiter, nullptr);
4725
+ ASSERT_EQ(*delimiter, ",");
4726
+
4727
+ ASSERT_OK(MergeOperator::CreateFromString(
4728
+ config_options, "id=stringappend; delimiter=||", &merge_op));
4729
+ ASSERT_NE(merge_op, nullptr);
4730
+ ASSERT_TRUE(merge_op->IsInstanceOf("stringappend"));
4731
+ ASSERT_STREQ(merge_op->Name(), StringAppendOperator::kClassName());
4732
+ delimiter = merge_op->GetOptions<std::string>("Delimiter");
4733
+ ASSERT_NE(delimiter, nullptr);
4734
+ ASSERT_EQ(*delimiter, "||");
4735
+
4736
+ ASSERT_OK(MergeOperator::CreateFromString(
4737
+ config_options, "id=stringappendtest; delimiter=&&", &merge_op));
4738
+ ASSERT_NE(merge_op, nullptr);
4739
+ ASSERT_TRUE(merge_op->IsInstanceOf("stringappendtest"));
4740
+ ASSERT_STREQ(merge_op->Name(), StringAppendTESTOperator::kClassName());
4741
+ delimiter = merge_op->GetOptions<std::string>("Delimiter");
4742
+ ASSERT_NE(delimiter, nullptr);
4743
+ ASSERT_EQ(*delimiter, "&&");
4744
+
4745
+ std::shared_ptr<MergeOperator> copy;
4746
+ std::string mismatch;
4747
+ std::string opts_str = merge_op->ToString(config_options);
4748
+
4749
+ ASSERT_OK(MergeOperator::CreateFromString(config_options, opts_str, &copy));
4750
+ ASSERT_TRUE(merge_op->AreEquivalent(config_options, copy.get(), &mismatch));
4751
+ ASSERT_NE(copy, nullptr);
4752
+ delimiter = copy->GetOptions<std::string>("Delimiter");
4753
+ ASSERT_NE(delimiter, nullptr);
4754
+ ASSERT_EQ(*delimiter, "&&");
3784
4755
  }
4756
+
4757
+ INSTANTIATE_TEST_CASE_P(OptionsSanityCheckTest, OptionsSanityCheckTest,
4758
+ ::testing::Bool());
3785
4759
  #endif // !ROCKSDB_LITE
4760
+
3786
4761
  } // namespace ROCKSDB_NAMESPACE
3787
4762
 
3788
4763
  int main(int argc, char** argv) {