@nxtedition/rocksdb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1088) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/UPGRADING.md +91 -0
  5. package/binding.cc +1276 -0
  6. package/binding.gyp +73 -0
  7. package/binding.js +1 -0
  8. package/chained-batch.js +44 -0
  9. package/deps/rocksdb/build_version.cc +4 -0
  10. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  11. package/deps/rocksdb/rocksdb/COPYING +339 -0
  12. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  13. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  14. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  15. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  16. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  20. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  22. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  23. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  24. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  25. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  26. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  27. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  37. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  38. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  60. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  61. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  64. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  65. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  67. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  68. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  69. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  71. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  74. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  75. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  95. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  96. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  97. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  98. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  99. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  100. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  101. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  102. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  103. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  104. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  105. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  106. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  107. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  108. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  122. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  123. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  124. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  125. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  126. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  127. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  128. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  129. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  130. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  131. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  132. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  133. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  134. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  135. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  136. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  137. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  138. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  139. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  140. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  141. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  142. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  143. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  144. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  145. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  146. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  147. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  148. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  149. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  150. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  151. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  152. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  153. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  154. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  155. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  156. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  157. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  158. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  159. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  160. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  161. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  162. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  163. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  164. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  165. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  166. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  167. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  168. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  169. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  170. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  171. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  172. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  174. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  175. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  176. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  178. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  179. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  184. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  186. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  187. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  188. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  189. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  190. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  191. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  192. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  193. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  194. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  195. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  196. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  197. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  198. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  199. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  200. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  201. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  202. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  203. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  204. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  205. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  206. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  207. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  210. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  212. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  213. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  216. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  217. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  218. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  219. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  220. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  223. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  224. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  226. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  227. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  228. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  229. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  230. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  231. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  232. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  233. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  234. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  235. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  236. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  237. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  238. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  239. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  240. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  241. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  242. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  243. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  244. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  245. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  246. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  247. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  248. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  249. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  250. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  251. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  252. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  253. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  254. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  255. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  256. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  257. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  258. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  260. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  261. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  262. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  263. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  264. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  290. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  291. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  292. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  293. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  294. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  295. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  296. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  297. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  298. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  299. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  300. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  301. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  302. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  303. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  304. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  305. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  306. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  307. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  308. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  309. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  310. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  313. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  315. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  316. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  317. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  318. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  319. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  320. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  321. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  324. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  325. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  326. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  327. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  334. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  418. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  419. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  420. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  422. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  423. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  425. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  426. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  427. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  428. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  429. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  430. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  431. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  432. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  433. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  434. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  435. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  436. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  437. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  438. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  439. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  440. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  441. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  442. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  443. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  444. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  445. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  446. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  447. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  448. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  449. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  450. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  451. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  452. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  453. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  454. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  455. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  456. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  457. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  458. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  459. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  460. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  461. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  462. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  463. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  464. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  465. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  466. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  467. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  468. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  469. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  470. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  471. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  472. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  473. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  474. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  475. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  476. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  477. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  478. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  479. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  480. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  481. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  482. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  483. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  484. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  485. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  486. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  487. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  489. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  490. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  491. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  492. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  493. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  494. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  495. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  496. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  497. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  498. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  499. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  500. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  501. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  502. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  503. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  504. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  505. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  506. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  507. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  508. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  509. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  510. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  511. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  512. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  513. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  514. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  515. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  516. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  517. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  518. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  519. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  520. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  521. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  522. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  523. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  524. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  525. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  526. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  527. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  528. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  529. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  530. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  531. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  532. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  533. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  534. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  535. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  536. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  537. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  538. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  539. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  540. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  541. package/deps/rocksdb/rocksdb/src.mk +631 -0
  542. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  543. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  599. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  600. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  601. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  602. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  603. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  604. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  605. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  606. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  607. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  608. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  611. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  612. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  613. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  614. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  615. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  616. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  617. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  618. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  619. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  620. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  621. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  622. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  623. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  624. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  625. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  626. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  627. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  628. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  629. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  630. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  631. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  632. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  633. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  634. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  635. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  642. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  643. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  644. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  645. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  646. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  647. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  648. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  649. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  650. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  651. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  652. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  653. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  654. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  655. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  656. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  657. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  658. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  659. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  660. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  661. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  662. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  663. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  664. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  665. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  666. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  667. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  668. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  669. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  670. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  671. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  672. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  673. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  674. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  675. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  676. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  677. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  713. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  714. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  715. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  716. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  717. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  718. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  719. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  720. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  721. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  722. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  726. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  727. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  728. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  729. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  730. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  731. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  732. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  733. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  734. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  735. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  736. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  737. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  738. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  739. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  740. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  741. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  742. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  743. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  744. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  745. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  746. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  747. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  748. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  749. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  750. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  751. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  752. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  753. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  754. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  755. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  756. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  757. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  760. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  761. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  762. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  763. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  764. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  765. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  766. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  767. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  768. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  769. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  770. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  771. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  772. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  773. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  774. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  775. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  776. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  777. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  778. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  779. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  780. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  781. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  782. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  783. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  784. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  785. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  786. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  790. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  791. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  792. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  793. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  794. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  795. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  796. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  797. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  798. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  799. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  800. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  801. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  802. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  803. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  804. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  805. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  806. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  807. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  808. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  809. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  810. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  811. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  812. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  813. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  814. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  815. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  816. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  817. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  818. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  819. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  820. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  821. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  822. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  823. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  824. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  825. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  826. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  827. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  828. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  829. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  830. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  831. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  832. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  833. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  834. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  835. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  836. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  837. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  838. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  839. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  840. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  841. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  842. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  843. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  844. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  845. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  846. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  847. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  848. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  849. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  850. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  851. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  852. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  853. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  854. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  855. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  856. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  857. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  858. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  859. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  860. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  861. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  862. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  872. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  873. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  874. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  875. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  876. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  877. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  885. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  886. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  887. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  888. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  889. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  890. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  891. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  892. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  894. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  895. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  896. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  897. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  898. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  899. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  900. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  901. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  902. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  903. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  904. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  905. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  906. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  907. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  908. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  909. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  910. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  911. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  919. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  920. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  921. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  922. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  923. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  924. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  925. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  926. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  927. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  928. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  929. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  930. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  945. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  946. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  947. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  948. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  949. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  950. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  951. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  952. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  953. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  954. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  955. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  956. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  957. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  958. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  959. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  960. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1041. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1042. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1043. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1044. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1045. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1046. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1047. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1048. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1049. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1050. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1051. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1052. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1053. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1054. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1055. package/deps/rocksdb/rocksdb.gyp +475 -0
  1056. package/deps/snappy/freebsd/config.h +135 -0
  1057. package/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
  1058. package/deps/snappy/linux/config.h +135 -0
  1059. package/deps/snappy/linux/snappy-stubs-public.h +100 -0
  1060. package/deps/snappy/mac/config.h +137 -0
  1061. package/deps/snappy/mac/snappy-stubs-public.h +100 -0
  1062. package/deps/snappy/openbsd/config.h +135 -0
  1063. package/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
  1064. package/deps/snappy/snappy-1.1.7/COPYING +54 -0
  1065. package/deps/snappy/snappy-1.1.7/cmake/SnappyConfig.cmake +1 -0
  1066. package/deps/snappy/snappy-1.1.7/cmake/config.h.in +62 -0
  1067. package/deps/snappy/snappy-1.1.7/snappy-c.cc +90 -0
  1068. package/deps/snappy/snappy-1.1.7/snappy-c.h +138 -0
  1069. package/deps/snappy/snappy-1.1.7/snappy-internal.h +224 -0
  1070. package/deps/snappy/snappy-1.1.7/snappy-sinksource.cc +104 -0
  1071. package/deps/snappy/snappy-1.1.7/snappy-sinksource.h +182 -0
  1072. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.cc +42 -0
  1073. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.h +561 -0
  1074. package/deps/snappy/snappy-1.1.7/snappy-stubs-public.h.in +94 -0
  1075. package/deps/snappy/snappy-1.1.7/snappy-test.cc +612 -0
  1076. package/deps/snappy/snappy-1.1.7/snappy-test.h +573 -0
  1077. package/deps/snappy/snappy-1.1.7/snappy.cc +1515 -0
  1078. package/deps/snappy/snappy-1.1.7/snappy.h +203 -0
  1079. package/deps/snappy/snappy-1.1.7/snappy_unittest.cc +1410 -0
  1080. package/deps/snappy/snappy.gyp +90 -0
  1081. package/deps/snappy/solaris/config.h +135 -0
  1082. package/deps/snappy/solaris/snappy-stubs-public.h +100 -0
  1083. package/deps/snappy/win32/config.h +29 -0
  1084. package/deps/snappy/win32/snappy-stubs-public.h +100 -0
  1085. package/iterator.js +55 -0
  1086. package/leveldown.js +113 -0
  1087. package/package-lock.json +23687 -0
  1088. package/package.json +70 -0
@@ -0,0 +1,3794 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #include <cctype>
11
+ #include <cinttypes>
12
+ #include <cstring>
13
+ #include <unordered_map>
14
+
15
+ #include "cache/lru_cache.h"
16
+ #include "cache/sharded_cache.h"
17
+ #include "options/options_helper.h"
18
+ #include "options/options_parser.h"
19
+ #include "port/port.h"
20
+ #include "rocksdb/cache.h"
21
+ #include "rocksdb/convenience.h"
22
+ #include "rocksdb/memtablerep.h"
23
+ #include "rocksdb/utilities/leveldb_options.h"
24
+ #include "rocksdb/utilities/object_registry.h"
25
+ #include "rocksdb/utilities/options_type.h"
26
+ #include "table/block_based/filter_policy_internal.h"
27
+ #include "test_util/testharness.h"
28
+ #include "test_util/testutil.h"
29
+ #include "util/random.h"
30
+ #include "util/stderr_logger.h"
31
+ #include "util/string_util.h"
32
+ #include "utilities/merge_operators/bytesxor.h"
33
+
34
+ #ifndef GFLAGS
35
+ bool FLAGS_enable_print = false;
36
+ #else
37
+ #include "util/gflags_compat.h"
38
+ using GFLAGS_NAMESPACE::ParseCommandLineFlags;
39
+ DEFINE_bool(enable_print, false, "Print options generated to console.");
40
+ #endif // GFLAGS
41
+
42
+ namespace ROCKSDB_NAMESPACE {
43
+
44
+ class OptionsTest : public testing::Test {};
45
+
46
+ #ifndef ROCKSDB_LITE // GetOptionsFromMap is not supported in ROCKSDB_LITE
47
+ TEST_F(OptionsTest, GetOptionsFromMapTest) {
48
+ std::unordered_map<std::string, std::string> cf_options_map = {
49
+ {"write_buffer_size", "1"},
50
+ {"max_write_buffer_number", "2"},
51
+ {"min_write_buffer_number_to_merge", "3"},
52
+ {"max_write_buffer_number_to_maintain", "99"},
53
+ {"max_write_buffer_size_to_maintain", "-99999"},
54
+ {"compression", "kSnappyCompression"},
55
+ {"compression_per_level",
56
+ "kNoCompression:"
57
+ "kSnappyCompression:"
58
+ "kZlibCompression:"
59
+ "kBZip2Compression:"
60
+ "kLZ4Compression:"
61
+ "kLZ4HCCompression:"
62
+ "kXpressCompression:"
63
+ "kZSTD:"
64
+ "kZSTDNotFinalCompression"},
65
+ {"bottommost_compression", "kLZ4Compression"},
66
+ {"bottommost_compression_opts", "5:6:7:8:10:true"},
67
+ {"compression_opts", "4:5:6:7:8:true"},
68
+ {"num_levels", "8"},
69
+ {"level0_file_num_compaction_trigger", "8"},
70
+ {"level0_slowdown_writes_trigger", "9"},
71
+ {"level0_stop_writes_trigger", "10"},
72
+ {"target_file_size_base", "12"},
73
+ {"target_file_size_multiplier", "13"},
74
+ {"max_bytes_for_level_base", "14"},
75
+ {"level_compaction_dynamic_level_bytes", "true"},
76
+ {"max_bytes_for_level_multiplier", "15.0"},
77
+ {"max_bytes_for_level_multiplier_additional", "16:17:18"},
78
+ {"max_compaction_bytes", "21"},
79
+ {"soft_rate_limit", "1.1"},
80
+ {"hard_rate_limit", "2.1"},
81
+ {"hard_pending_compaction_bytes_limit", "211"},
82
+ {"arena_block_size", "22"},
83
+ {"disable_auto_compactions", "true"},
84
+ {"compaction_style", "kCompactionStyleLevel"},
85
+ {"compaction_pri", "kOldestSmallestSeqFirst"},
86
+ {"verify_checksums_in_compaction", "false"},
87
+ {"compaction_options_fifo", "23"},
88
+ {"max_sequential_skip_in_iterations", "24"},
89
+ {"inplace_update_support", "true"},
90
+ {"report_bg_io_stats", "true"},
91
+ {"compaction_measure_io_stats", "false"},
92
+ {"inplace_update_num_locks", "25"},
93
+ {"memtable_prefix_bloom_size_ratio", "0.26"},
94
+ {"memtable_whole_key_filtering", "true"},
95
+ {"memtable_huge_page_size", "28"},
96
+ {"bloom_locality", "29"},
97
+ {"max_successive_merges", "30"},
98
+ {"min_partial_merge_operands", "31"},
99
+ {"prefix_extractor", "fixed:31"},
100
+ {"optimize_filters_for_hits", "true"},
101
+ {"enable_blob_files", "true"},
102
+ {"min_blob_size", "1K"},
103
+ {"blob_file_size", "1G"},
104
+ {"blob_compression_type", "kZSTD"},
105
+ {"enable_blob_garbage_collection", "true"},
106
+ {"blob_garbage_collection_age_cutoff", "0.5"},
107
+ };
108
+
109
+ std::unordered_map<std::string, std::string> db_options_map = {
110
+ {"create_if_missing", "false"},
111
+ {"create_missing_column_families", "true"},
112
+ {"error_if_exists", "false"},
113
+ {"paranoid_checks", "true"},
114
+ {"track_and_verify_wals_in_manifest", "true"},
115
+ {"max_open_files", "32"},
116
+ {"max_total_wal_size", "33"},
117
+ {"use_fsync", "true"},
118
+ {"db_log_dir", "/db_log_dir"},
119
+ {"wal_dir", "/wal_dir"},
120
+ {"delete_obsolete_files_period_micros", "34"},
121
+ {"max_background_compactions", "35"},
122
+ {"max_background_flushes", "36"},
123
+ {"max_log_file_size", "37"},
124
+ {"log_file_time_to_roll", "38"},
125
+ {"keep_log_file_num", "39"},
126
+ {"recycle_log_file_num", "5"},
127
+ {"max_manifest_file_size", "40"},
128
+ {"table_cache_numshardbits", "41"},
129
+ {"WAL_ttl_seconds", "43"},
130
+ {"WAL_size_limit_MB", "44"},
131
+ {"manifest_preallocation_size", "45"},
132
+ {"allow_mmap_reads", "true"},
133
+ {"allow_mmap_writes", "false"},
134
+ {"use_direct_reads", "false"},
135
+ {"use_direct_io_for_flush_and_compaction", "false"},
136
+ {"is_fd_close_on_exec", "true"},
137
+ {"skip_log_error_on_recovery", "false"},
138
+ {"stats_dump_period_sec", "46"},
139
+ {"stats_persist_period_sec", "57"},
140
+ {"persist_stats_to_disk", "false"},
141
+ {"stats_history_buffer_size", "69"},
142
+ {"advise_random_on_open", "true"},
143
+ {"use_adaptive_mutex", "false"},
144
+ {"new_table_reader_for_compaction_inputs", "true"},
145
+ {"compaction_readahead_size", "100"},
146
+ {"random_access_max_buffer_size", "3145728"},
147
+ {"writable_file_max_buffer_size", "314159"},
148
+ {"bytes_per_sync", "47"},
149
+ {"wal_bytes_per_sync", "48"},
150
+ {"strict_bytes_per_sync", "true"},
151
+ };
152
+
153
+ ColumnFamilyOptions base_cf_opt;
154
+ ColumnFamilyOptions new_cf_opt;
155
+ ConfigOptions exact, loose;
156
+ exact.input_strings_escaped = false;
157
+ exact.ignore_unknown_options = false;
158
+ exact.sanity_level = ConfigOptions::kSanityLevelExactMatch;
159
+ loose.sanity_level = ConfigOptions::kSanityLevelLooselyCompatible;
160
+
161
+ loose.input_strings_escaped = false;
162
+ loose.ignore_unknown_options = true;
163
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(exact, base_cf_opt, cf_options_map,
164
+ &new_cf_opt));
165
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 1U);
166
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 2);
167
+ ASSERT_EQ(new_cf_opt.min_write_buffer_number_to_merge, 3);
168
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number_to_maintain, 99);
169
+ ASSERT_EQ(new_cf_opt.max_write_buffer_size_to_maintain, -99999);
170
+ ASSERT_EQ(new_cf_opt.compression, kSnappyCompression);
171
+ ASSERT_EQ(new_cf_opt.compression_per_level.size(), 9U);
172
+ ASSERT_EQ(new_cf_opt.compression_per_level[0], kNoCompression);
173
+ ASSERT_EQ(new_cf_opt.compression_per_level[1], kSnappyCompression);
174
+ ASSERT_EQ(new_cf_opt.compression_per_level[2], kZlibCompression);
175
+ ASSERT_EQ(new_cf_opt.compression_per_level[3], kBZip2Compression);
176
+ ASSERT_EQ(new_cf_opt.compression_per_level[4], kLZ4Compression);
177
+ ASSERT_EQ(new_cf_opt.compression_per_level[5], kLZ4HCCompression);
178
+ ASSERT_EQ(new_cf_opt.compression_per_level[6], kXpressCompression);
179
+ ASSERT_EQ(new_cf_opt.compression_per_level[7], kZSTD);
180
+ ASSERT_EQ(new_cf_opt.compression_per_level[8], kZSTDNotFinalCompression);
181
+ ASSERT_EQ(new_cf_opt.compression_opts.window_bits, 4);
182
+ ASSERT_EQ(new_cf_opt.compression_opts.level, 5);
183
+ ASSERT_EQ(new_cf_opt.compression_opts.strategy, 6);
184
+ ASSERT_EQ(new_cf_opt.compression_opts.max_dict_bytes, 7u);
185
+ ASSERT_EQ(new_cf_opt.compression_opts.zstd_max_train_bytes, 8u);
186
+ ASSERT_EQ(new_cf_opt.compression_opts.parallel_threads,
187
+ CompressionOptions().parallel_threads);
188
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled, true);
189
+ ASSERT_EQ(new_cf_opt.bottommost_compression, kLZ4Compression);
190
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.window_bits, 5);
191
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.level, 6);
192
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.strategy, 7);
193
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.max_dict_bytes, 8u);
194
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.zstd_max_train_bytes, 10u);
195
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.parallel_threads,
196
+ CompressionOptions().parallel_threads);
197
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled, true);
198
+ ASSERT_EQ(new_cf_opt.num_levels, 8);
199
+ ASSERT_EQ(new_cf_opt.level0_file_num_compaction_trigger, 8);
200
+ ASSERT_EQ(new_cf_opt.level0_slowdown_writes_trigger, 9);
201
+ ASSERT_EQ(new_cf_opt.level0_stop_writes_trigger, 10);
202
+ ASSERT_EQ(new_cf_opt.target_file_size_base, static_cast<uint64_t>(12));
203
+ ASSERT_EQ(new_cf_opt.target_file_size_multiplier, 13);
204
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_base, 14U);
205
+ ASSERT_EQ(new_cf_opt.level_compaction_dynamic_level_bytes, true);
206
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier, 15.0);
207
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional.size(), 3U);
208
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[0], 16);
209
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[1], 17);
210
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[2], 18);
211
+ ASSERT_EQ(new_cf_opt.max_compaction_bytes, 21);
212
+ ASSERT_EQ(new_cf_opt.hard_pending_compaction_bytes_limit, 211);
213
+ ASSERT_EQ(new_cf_opt.arena_block_size, 22U);
214
+ ASSERT_EQ(new_cf_opt.disable_auto_compactions, true);
215
+ ASSERT_EQ(new_cf_opt.compaction_style, kCompactionStyleLevel);
216
+ ASSERT_EQ(new_cf_opt.compaction_pri, kOldestSmallestSeqFirst);
217
+ ASSERT_EQ(new_cf_opt.compaction_options_fifo.max_table_files_size,
218
+ static_cast<uint64_t>(23));
219
+ ASSERT_EQ(new_cf_opt.max_sequential_skip_in_iterations,
220
+ static_cast<uint64_t>(24));
221
+ ASSERT_EQ(new_cf_opt.inplace_update_support, true);
222
+ ASSERT_EQ(new_cf_opt.inplace_update_num_locks, 25U);
223
+ ASSERT_EQ(new_cf_opt.memtable_prefix_bloom_size_ratio, 0.26);
224
+ ASSERT_EQ(new_cf_opt.memtable_whole_key_filtering, true);
225
+ ASSERT_EQ(new_cf_opt.memtable_huge_page_size, 28U);
226
+ ASSERT_EQ(new_cf_opt.bloom_locality, 29U);
227
+ ASSERT_EQ(new_cf_opt.max_successive_merges, 30U);
228
+ ASSERT_TRUE(new_cf_opt.prefix_extractor != nullptr);
229
+ 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");
232
+ ASSERT_EQ(new_cf_opt.enable_blob_files, true);
233
+ ASSERT_EQ(new_cf_opt.min_blob_size, 1ULL << 10);
234
+ ASSERT_EQ(new_cf_opt.blob_file_size, 1ULL << 30);
235
+ ASSERT_EQ(new_cf_opt.blob_compression_type, kZSTD);
236
+ ASSERT_EQ(new_cf_opt.enable_blob_garbage_collection, true);
237
+ ASSERT_EQ(new_cf_opt.blob_garbage_collection_age_cutoff, 0.5);
238
+
239
+ cf_options_map["write_buffer_size"] = "hello";
240
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(exact, base_cf_opt, cf_options_map,
241
+ &new_cf_opt));
242
+ ASSERT_OK(
243
+ RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
244
+
245
+ cf_options_map["write_buffer_size"] = "1";
246
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(exact, base_cf_opt, cf_options_map,
247
+ &new_cf_opt));
248
+
249
+ cf_options_map["unknown_option"] = "1";
250
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(exact, base_cf_opt, cf_options_map,
251
+ &new_cf_opt));
252
+ ASSERT_OK(
253
+ RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
254
+
255
+ // ignore_unknown_options=true;input_strings_escaped=false
256
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(loose, base_cf_opt, cf_options_map,
257
+ &new_cf_opt));
258
+ ASSERT_OK(
259
+ RocksDBOptionsParser::VerifyCFOptions(loose, base_cf_opt, new_cf_opt));
260
+ ASSERT_NOK(
261
+ RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
262
+
263
+ DBOptions base_db_opt;
264
+ DBOptions new_db_opt;
265
+ ASSERT_OK(
266
+ GetDBOptionsFromMap(exact, base_db_opt, db_options_map, &new_db_opt));
267
+ ASSERT_EQ(new_db_opt.create_if_missing, false);
268
+ ASSERT_EQ(new_db_opt.create_missing_column_families, true);
269
+ ASSERT_EQ(new_db_opt.error_if_exists, false);
270
+ ASSERT_EQ(new_db_opt.paranoid_checks, true);
271
+ ASSERT_EQ(new_db_opt.track_and_verify_wals_in_manifest, true);
272
+ ASSERT_EQ(new_db_opt.max_open_files, 32);
273
+ ASSERT_EQ(new_db_opt.max_total_wal_size, static_cast<uint64_t>(33));
274
+ ASSERT_EQ(new_db_opt.use_fsync, true);
275
+ ASSERT_EQ(new_db_opt.db_log_dir, "/db_log_dir");
276
+ ASSERT_EQ(new_db_opt.wal_dir, "/wal_dir");
277
+ ASSERT_EQ(new_db_opt.delete_obsolete_files_period_micros,
278
+ static_cast<uint64_t>(34));
279
+ ASSERT_EQ(new_db_opt.max_background_compactions, 35);
280
+ ASSERT_EQ(new_db_opt.max_background_flushes, 36);
281
+ ASSERT_EQ(new_db_opt.max_log_file_size, 37U);
282
+ ASSERT_EQ(new_db_opt.log_file_time_to_roll, 38U);
283
+ ASSERT_EQ(new_db_opt.keep_log_file_num, 39U);
284
+ ASSERT_EQ(new_db_opt.recycle_log_file_num, 5U);
285
+ ASSERT_EQ(new_db_opt.max_manifest_file_size, static_cast<uint64_t>(40));
286
+ ASSERT_EQ(new_db_opt.table_cache_numshardbits, 41);
287
+ ASSERT_EQ(new_db_opt.WAL_ttl_seconds, static_cast<uint64_t>(43));
288
+ ASSERT_EQ(new_db_opt.WAL_size_limit_MB, static_cast<uint64_t>(44));
289
+ ASSERT_EQ(new_db_opt.manifest_preallocation_size, 45U);
290
+ ASSERT_EQ(new_db_opt.allow_mmap_reads, true);
291
+ ASSERT_EQ(new_db_opt.allow_mmap_writes, false);
292
+ ASSERT_EQ(new_db_opt.use_direct_reads, false);
293
+ ASSERT_EQ(new_db_opt.use_direct_io_for_flush_and_compaction, false);
294
+ ASSERT_EQ(new_db_opt.is_fd_close_on_exec, true);
295
+ ASSERT_EQ(new_db_opt.skip_log_error_on_recovery, false);
296
+ ASSERT_EQ(new_db_opt.stats_dump_period_sec, 46U);
297
+ ASSERT_EQ(new_db_opt.stats_persist_period_sec, 57U);
298
+ ASSERT_EQ(new_db_opt.persist_stats_to_disk, false);
299
+ ASSERT_EQ(new_db_opt.stats_history_buffer_size, 69U);
300
+ ASSERT_EQ(new_db_opt.advise_random_on_open, true);
301
+ ASSERT_EQ(new_db_opt.use_adaptive_mutex, false);
302
+ ASSERT_EQ(new_db_opt.new_table_reader_for_compaction_inputs, true);
303
+ ASSERT_EQ(new_db_opt.compaction_readahead_size, 100);
304
+ ASSERT_EQ(new_db_opt.random_access_max_buffer_size, 3145728);
305
+ ASSERT_EQ(new_db_opt.writable_file_max_buffer_size, 314159);
306
+ ASSERT_EQ(new_db_opt.bytes_per_sync, static_cast<uint64_t>(47));
307
+ ASSERT_EQ(new_db_opt.wal_bytes_per_sync, static_cast<uint64_t>(48));
308
+ ASSERT_EQ(new_db_opt.strict_bytes_per_sync, true);
309
+
310
+ db_options_map["max_open_files"] = "hello";
311
+ Status s =
312
+ GetDBOptionsFromMap(exact, base_db_opt, db_options_map, &new_db_opt);
313
+ ASSERT_NOK(s);
314
+ ASSERT_TRUE(s.IsInvalidArgument());
315
+
316
+ ASSERT_OK(
317
+ RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
318
+ ASSERT_OK(
319
+ RocksDBOptionsParser::VerifyDBOptions(loose, base_db_opt, new_db_opt));
320
+
321
+ // unknow options should fail parsing without ignore_unknown_options = true
322
+ db_options_map["unknown_db_option"] = "1";
323
+ s = GetDBOptionsFromMap(exact, base_db_opt, db_options_map, &new_db_opt);
324
+ ASSERT_NOK(s);
325
+ ASSERT_TRUE(s.IsInvalidArgument());
326
+ ASSERT_OK(
327
+ RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
328
+
329
+ ASSERT_OK(
330
+ GetDBOptionsFromMap(loose, base_db_opt, db_options_map, &new_db_opt));
331
+ ASSERT_OK(
332
+ RocksDBOptionsParser::VerifyDBOptions(loose, base_db_opt, new_db_opt));
333
+ ASSERT_NOK(
334
+ RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
335
+ }
336
+ #endif // !ROCKSDB_LITE
337
+
338
+ #ifndef ROCKSDB_LITE // GetColumnFamilyOptionsFromString is not supported in
339
+ // ROCKSDB_LITE
340
+ TEST_F(OptionsTest, GetColumnFamilyOptionsFromStringTest) {
341
+ ColumnFamilyOptions base_cf_opt;
342
+ ColumnFamilyOptions new_cf_opt;
343
+ ConfigOptions config_options;
344
+ config_options.input_strings_escaped = false;
345
+ config_options.ignore_unknown_options = false;
346
+
347
+ base_cf_opt.table_factory.reset();
348
+ ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt, "",
349
+ &new_cf_opt));
350
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
351
+ config_options, base_cf_opt, "write_buffer_size=5", &new_cf_opt));
352
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 5U);
353
+ ASSERT_TRUE(new_cf_opt.table_factory == nullptr);
354
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
355
+ config_options, base_cf_opt, "write_buffer_size=6;", &new_cf_opt));
356
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 6U);
357
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
358
+ config_options, base_cf_opt, " write_buffer_size = 7 ", &new_cf_opt));
359
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 7U);
360
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
361
+ config_options, base_cf_opt, " write_buffer_size = 8 ; ", &new_cf_opt));
362
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 8U);
363
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
364
+ config_options, base_cf_opt,
365
+ "write_buffer_size=9;max_write_buffer_number=10", &new_cf_opt));
366
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 9U);
367
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 10);
368
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
369
+ config_options, base_cf_opt,
370
+ "write_buffer_size=11; max_write_buffer_number = 12 ;", &new_cf_opt));
371
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 11U);
372
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 12);
373
+ // Wrong name "max_write_buffer_number_"
374
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
375
+ config_options, base_cf_opt,
376
+ "write_buffer_size=13;max_write_buffer_number_=14;", &new_cf_opt));
377
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
378
+ new_cf_opt));
379
+
380
+ // Comparator from object registry
381
+ std::string kCompName = "reverse_comp";
382
+ ObjectLibrary::Default()->Register<const Comparator>(
383
+ kCompName,
384
+ [](const std::string& /*name*/,
385
+ std::unique_ptr<const Comparator>* /*guard*/,
386
+ std::string* /* errmsg */) { return ReverseBytewiseComparator(); });
387
+
388
+ ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
389
+ "comparator=" + kCompName + ";",
390
+ &new_cf_opt));
391
+ ASSERT_EQ(new_cf_opt.comparator, ReverseBytewiseComparator());
392
+
393
+ // MergeOperator from object registry
394
+ std::unique_ptr<BytesXOROperator> bxo(new BytesXOROperator());
395
+ 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
+ ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
405
+ "merge_operator=" + kMoName + ";",
406
+ &new_cf_opt));
407
+ ASSERT_EQ(kMoName, std::string(new_cf_opt.merge_operator->Name()));
408
+
409
+ // Wrong key/value pair
410
+ Status s = GetColumnFamilyOptionsFromString(
411
+ config_options, base_cf_opt,
412
+ "write_buffer_size=13;max_write_buffer_number;", &new_cf_opt);
413
+ ASSERT_NOK(s);
414
+ ASSERT_TRUE(s.IsInvalidArgument());
415
+
416
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
417
+ new_cf_opt));
418
+
419
+ // Error Parsing value
420
+ s = GetColumnFamilyOptionsFromString(
421
+ config_options, base_cf_opt,
422
+ "write_buffer_size=13;max_write_buffer_number=;", &new_cf_opt);
423
+ ASSERT_NOK(s);
424
+ ASSERT_TRUE(s.IsInvalidArgument());
425
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
426
+ new_cf_opt));
427
+
428
+ // Missing option name
429
+ s = GetColumnFamilyOptionsFromString(
430
+ config_options, base_cf_opt, "write_buffer_size=13; =100;", &new_cf_opt);
431
+ ASSERT_NOK(s);
432
+ ASSERT_TRUE(s.IsInvalidArgument());
433
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
434
+ new_cf_opt));
435
+
436
+ const uint64_t kilo = 1024UL;
437
+ const uint64_t mega = 1024 * kilo;
438
+ const uint64_t giga = 1024 * mega;
439
+ const uint64_t tera = 1024 * giga;
440
+
441
+ // Units (k)
442
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
443
+ config_options, base_cf_opt, "max_write_buffer_number=15K", &new_cf_opt));
444
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 15 * kilo);
445
+ // Units (m)
446
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
447
+ config_options, base_cf_opt,
448
+ "max_write_buffer_number=16m;inplace_update_num_locks=17M", &new_cf_opt));
449
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 16 * mega);
450
+ ASSERT_EQ(new_cf_opt.inplace_update_num_locks, 17u * mega);
451
+ // Units (g)
452
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
453
+ config_options, base_cf_opt,
454
+ "write_buffer_size=18g;prefix_extractor=capped:8;"
455
+ "arena_block_size=19G",
456
+ &new_cf_opt));
457
+
458
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 18 * giga);
459
+ ASSERT_EQ(new_cf_opt.arena_block_size, 19 * giga);
460
+ 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");
463
+
464
+ // Units (t)
465
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
466
+ config_options, base_cf_opt, "write_buffer_size=20t;arena_block_size=21T",
467
+ &new_cf_opt));
468
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 20 * tera);
469
+ ASSERT_EQ(new_cf_opt.arena_block_size, 21 * tera);
470
+
471
+ // Nested block based table options
472
+ // Empty
473
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
474
+ config_options, base_cf_opt,
475
+ "write_buffer_size=10;max_write_buffer_number=16;"
476
+ "block_based_table_factory={};arena_block_size=1024",
477
+ &new_cf_opt));
478
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
479
+ // Non-empty
480
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
481
+ config_options, base_cf_opt,
482
+ "write_buffer_size=10;max_write_buffer_number=16;"
483
+ "block_based_table_factory={block_cache=1M;block_size=4;};"
484
+ "arena_block_size=1024",
485
+ &new_cf_opt));
486
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
487
+ // Last one
488
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
489
+ config_options, base_cf_opt,
490
+ "write_buffer_size=10;max_write_buffer_number=16;"
491
+ "block_based_table_factory={block_cache=1M;block_size=4;}",
492
+ &new_cf_opt));
493
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
494
+ // Mismatch curly braces
495
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
496
+ config_options, base_cf_opt,
497
+ "write_buffer_size=10;max_write_buffer_number=16;"
498
+ "block_based_table_factory={{{block_size=4;};"
499
+ "arena_block_size=1024",
500
+ &new_cf_opt));
501
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
502
+ new_cf_opt));
503
+
504
+ // Unexpected chars after closing curly brace
505
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
506
+ config_options, base_cf_opt,
507
+ "write_buffer_size=10;max_write_buffer_number=16;"
508
+ "block_based_table_factory={block_size=4;}};"
509
+ "arena_block_size=1024",
510
+ &new_cf_opt));
511
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
512
+ new_cf_opt));
513
+
514
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
515
+ config_options, base_cf_opt,
516
+ "write_buffer_size=10;max_write_buffer_number=16;"
517
+ "block_based_table_factory={block_size=4;}xdfa;"
518
+ "arena_block_size=1024",
519
+ &new_cf_opt));
520
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
521
+ new_cf_opt));
522
+
523
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
524
+ config_options, base_cf_opt,
525
+ "write_buffer_size=10;max_write_buffer_number=16;"
526
+ "block_based_table_factory={block_size=4;}xdfa",
527
+ &new_cf_opt));
528
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
529
+ new_cf_opt));
530
+
531
+ // Invalid block based table option
532
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
533
+ config_options, base_cf_opt,
534
+ "write_buffer_size=10;max_write_buffer_number=16;"
535
+ "block_based_table_factory={xx_block_size=4;}",
536
+ &new_cf_opt));
537
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
538
+ new_cf_opt));
539
+
540
+ ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
541
+ "optimize_filters_for_hits=true",
542
+ &new_cf_opt));
543
+ ASSERT_OK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
544
+ "optimize_filters_for_hits=false",
545
+ &new_cf_opt));
546
+
547
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(config_options, base_cf_opt,
548
+ "optimize_filters_for_hits=junk",
549
+ &new_cf_opt));
550
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opt,
551
+ new_cf_opt));
552
+
553
+ // Nested plain table options
554
+ // Empty
555
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
556
+ config_options, base_cf_opt,
557
+ "write_buffer_size=10;max_write_buffer_number=16;"
558
+ "plain_table_factory={};arena_block_size=1024",
559
+ &new_cf_opt));
560
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
561
+ ASSERT_EQ(std::string(new_cf_opt.table_factory->Name()), "PlainTable");
562
+ // Non-empty
563
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
564
+ config_options, base_cf_opt,
565
+ "write_buffer_size=10;max_write_buffer_number=16;"
566
+ "plain_table_factory={user_key_len=66;bloom_bits_per_key=20;};"
567
+ "arena_block_size=1024",
568
+ &new_cf_opt));
569
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
570
+ ASSERT_EQ(std::string(new_cf_opt.table_factory->Name()), "PlainTable");
571
+
572
+ // memtable factory
573
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
574
+ config_options, base_cf_opt,
575
+ "write_buffer_size=10;max_write_buffer_number=16;"
576
+ "memtable=skip_list:10;arena_block_size=1024",
577
+ &new_cf_opt));
578
+ ASSERT_TRUE(new_cf_opt.memtable_factory != nullptr);
579
+ ASSERT_EQ(std::string(new_cf_opt.memtable_factory->Name()), "SkipListFactory");
580
+ }
581
+
582
+ TEST_F(OptionsTest, CompressionOptionsFromString) {
583
+ ColumnFamilyOptions base_cf_opt;
584
+ ColumnFamilyOptions new_cf_opt;
585
+ ConfigOptions config_options;
586
+ std::string opts_str;
587
+ config_options.ignore_unknown_options = false;
588
+ CompressionOptions dflt;
589
+ // Test with some optional values removed....
590
+ ASSERT_OK(
591
+ GetColumnFamilyOptionsFromString(config_options, ColumnFamilyOptions(),
592
+ "compression_opts=3:4:5; "
593
+ "bottommost_compression_opts=4:5:6:7",
594
+ &base_cf_opt));
595
+ ASSERT_EQ(base_cf_opt.compression_opts.window_bits, 3);
596
+ ASSERT_EQ(base_cf_opt.compression_opts.level, 4);
597
+ ASSERT_EQ(base_cf_opt.compression_opts.strategy, 5);
598
+ ASSERT_EQ(base_cf_opt.compression_opts.max_dict_bytes, dflt.max_dict_bytes);
599
+ ASSERT_EQ(base_cf_opt.compression_opts.zstd_max_train_bytes,
600
+ dflt.zstd_max_train_bytes);
601
+ ASSERT_EQ(base_cf_opt.compression_opts.parallel_threads,
602
+ dflt.parallel_threads);
603
+ ASSERT_EQ(base_cf_opt.compression_opts.enabled, dflt.enabled);
604
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.window_bits, 4);
605
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.level, 5);
606
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.strategy, 6);
607
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.max_dict_bytes, 7u);
608
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.zstd_max_train_bytes,
609
+ dflt.zstd_max_train_bytes);
610
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.parallel_threads,
611
+ dflt.parallel_threads);
612
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.enabled, dflt.enabled);
613
+
614
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
615
+ config_options, ColumnFamilyOptions(),
616
+ "compression_opts=4:5:6:7:8:9:true; "
617
+ "bottommost_compression_opts=5:6:7:8:9:false",
618
+ &base_cf_opt));
619
+ ASSERT_EQ(base_cf_opt.compression_opts.window_bits, 4);
620
+ ASSERT_EQ(base_cf_opt.compression_opts.level, 5);
621
+ ASSERT_EQ(base_cf_opt.compression_opts.strategy, 6);
622
+ ASSERT_EQ(base_cf_opt.compression_opts.max_dict_bytes, 7u);
623
+ ASSERT_EQ(base_cf_opt.compression_opts.zstd_max_train_bytes, 8u);
624
+ ASSERT_EQ(base_cf_opt.compression_opts.parallel_threads, 9u);
625
+ ASSERT_EQ(base_cf_opt.compression_opts.enabled, true);
626
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.window_bits, 5);
627
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.level, 6);
628
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.strategy, 7);
629
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.max_dict_bytes, 8u);
630
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.zstd_max_train_bytes, 9u);
631
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.parallel_threads,
632
+ dflt.parallel_threads);
633
+ ASSERT_EQ(base_cf_opt.bottommost_compression_opts.enabled, false);
634
+
635
+ ASSERT_OK(
636
+ GetStringFromColumnFamilyOptions(config_options, base_cf_opt, &opts_str));
637
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
638
+ config_options, ColumnFamilyOptions(), opts_str, &new_cf_opt));
639
+ ASSERT_EQ(new_cf_opt.compression_opts.window_bits, 4);
640
+ ASSERT_EQ(new_cf_opt.compression_opts.level, 5);
641
+ ASSERT_EQ(new_cf_opt.compression_opts.strategy, 6);
642
+ ASSERT_EQ(new_cf_opt.compression_opts.max_dict_bytes, 7u);
643
+ ASSERT_EQ(new_cf_opt.compression_opts.zstd_max_train_bytes, 8u);
644
+ ASSERT_EQ(new_cf_opt.compression_opts.parallel_threads, 9u);
645
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled, true);
646
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.window_bits, 5);
647
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.level, 6);
648
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.strategy, 7);
649
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.max_dict_bytes, 8u);
650
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.zstd_max_train_bytes, 9u);
651
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.parallel_threads,
652
+ dflt.parallel_threads);
653
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled, false);
654
+
655
+ // Test as struct values
656
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
657
+ config_options, ColumnFamilyOptions(),
658
+ "compression_opts={window_bits=5; level=6; strategy=7; max_dict_bytes=8;"
659
+ "zstd_max_train_bytes=9;parallel_threads=10;enabled=true}; "
660
+ "bottommost_compression_opts={window_bits=4; level=5; strategy=6;"
661
+ " max_dict_bytes=7;zstd_max_train_bytes=8;parallel_threads=9;"
662
+ "enabled=false}; ",
663
+ &new_cf_opt));
664
+ ASSERT_EQ(new_cf_opt.compression_opts.window_bits, 5);
665
+ ASSERT_EQ(new_cf_opt.compression_opts.level, 6);
666
+ ASSERT_EQ(new_cf_opt.compression_opts.strategy, 7);
667
+ ASSERT_EQ(new_cf_opt.compression_opts.max_dict_bytes, 8u);
668
+ ASSERT_EQ(new_cf_opt.compression_opts.zstd_max_train_bytes, 9u);
669
+ ASSERT_EQ(new_cf_opt.compression_opts.parallel_threads, 10u);
670
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled, true);
671
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.window_bits, 4);
672
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.level, 5);
673
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.strategy, 6);
674
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.max_dict_bytes, 7u);
675
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.zstd_max_train_bytes, 8u);
676
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.parallel_threads, 9u);
677
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled, false);
678
+
679
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
680
+ config_options, base_cf_opt,
681
+ "compression_opts={window_bits=4; strategy=5;};"
682
+ "bottommost_compression_opts={level=6; strategy=7;}",
683
+ &new_cf_opt));
684
+ ASSERT_EQ(new_cf_opt.compression_opts.window_bits, 4);
685
+ ASSERT_EQ(new_cf_opt.compression_opts.strategy, 5);
686
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.level, 6);
687
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.strategy, 7);
688
+
689
+ ASSERT_EQ(new_cf_opt.compression_opts.level,
690
+ base_cf_opt.compression_opts.level);
691
+ ASSERT_EQ(new_cf_opt.compression_opts.max_dict_bytes,
692
+ base_cf_opt.compression_opts.max_dict_bytes);
693
+ ASSERT_EQ(new_cf_opt.compression_opts.zstd_max_train_bytes,
694
+ base_cf_opt.compression_opts.zstd_max_train_bytes);
695
+ ASSERT_EQ(new_cf_opt.compression_opts.parallel_threads,
696
+ base_cf_opt.compression_opts.parallel_threads);
697
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled,
698
+ base_cf_opt.compression_opts.enabled);
699
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.window_bits,
700
+ base_cf_opt.bottommost_compression_opts.window_bits);
701
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.max_dict_bytes,
702
+ base_cf_opt.bottommost_compression_opts.max_dict_bytes);
703
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.zstd_max_train_bytes,
704
+ base_cf_opt.bottommost_compression_opts.zstd_max_train_bytes);
705
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.parallel_threads,
706
+ base_cf_opt.bottommost_compression_opts.parallel_threads);
707
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled,
708
+ base_cf_opt.bottommost_compression_opts.enabled);
709
+
710
+ // Test a few individual struct values
711
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
712
+ config_options, base_cf_opt,
713
+ "compression_opts.enabled=false; "
714
+ "bottommost_compression_opts.enabled=true; ",
715
+ &new_cf_opt));
716
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled, false);
717
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled, true);
718
+
719
+ // Now test some illegal values
720
+ ConfigOptions ignore;
721
+ ignore.ignore_unknown_options = true;
722
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
723
+ config_options, ColumnFamilyOptions(),
724
+ "compression_opts=5:6:7:8:9:x:false", &base_cf_opt));
725
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
726
+ ignore, ColumnFamilyOptions(), "compression_opts=5:6:7:8:9:x:false",
727
+ &base_cf_opt));
728
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
729
+ config_options, ColumnFamilyOptions(),
730
+ "compression_opts=1:2:3:4:5:6:true:8", &base_cf_opt));
731
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
732
+ ignore, ColumnFamilyOptions(), "compression_opts=1:2:3:4:5:6:true:8",
733
+ &base_cf_opt));
734
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
735
+ config_options, ColumnFamilyOptions(), "compression_opts={unknown=bad;}",
736
+ &base_cf_opt));
737
+ ASSERT_OK(GetColumnFamilyOptionsFromString(ignore, ColumnFamilyOptions(),
738
+ "compression_opts={unknown=bad;}",
739
+ &base_cf_opt));
740
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
741
+ config_options, ColumnFamilyOptions(), "compression_opts.unknown=bad",
742
+ &base_cf_opt));
743
+ ASSERT_OK(GetColumnFamilyOptionsFromString(ignore, ColumnFamilyOptions(),
744
+ "compression_opts.unknown=bad",
745
+ &base_cf_opt));
746
+ }
747
+
748
+ TEST_F(OptionsTest, OldInterfaceTest) {
749
+ ColumnFamilyOptions base_cf_opt;
750
+ ColumnFamilyOptions new_cf_opt;
751
+ ConfigOptions exact;
752
+
753
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
754
+ base_cf_opt,
755
+ "write_buffer_size=18;prefix_extractor=capped:8;"
756
+ "arena_block_size=19",
757
+ &new_cf_opt));
758
+
759
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 18);
760
+ ASSERT_EQ(new_cf_opt.arena_block_size, 19);
761
+ ASSERT_TRUE(new_cf_opt.prefix_extractor.get() != nullptr);
762
+
763
+ // And with a bad option
764
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
765
+ base_cf_opt,
766
+ "write_buffer_size=10;max_write_buffer_number=16;"
767
+ "block_based_table_factory={xx_block_size=4;}",
768
+ &new_cf_opt));
769
+ ASSERT_OK(
770
+ RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
771
+
772
+ std::unordered_map<std::string, std::string> cf_options_map = {
773
+ {"write_buffer_size", "1"},
774
+ {"max_write_buffer_number", "2"},
775
+ {"min_write_buffer_number_to_merge", "3"},
776
+ };
777
+ ASSERT_OK(
778
+ GetColumnFamilyOptionsFromMap(base_cf_opt, cf_options_map, &new_cf_opt));
779
+ cf_options_map["unknown_option"] = "1";
780
+ ASSERT_NOK(
781
+ GetColumnFamilyOptionsFromMap(base_cf_opt, cf_options_map, &new_cf_opt));
782
+ ASSERT_OK(
783
+ RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
784
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(base_cf_opt, cf_options_map,
785
+ &new_cf_opt, true, true));
786
+
787
+ DBOptions base_db_opt;
788
+ DBOptions new_db_opt;
789
+ std::unordered_map<std::string, std::string> db_options_map = {
790
+ {"create_if_missing", "false"},
791
+ {"create_missing_column_families", "true"},
792
+ {"error_if_exists", "false"},
793
+ {"paranoid_checks", "true"},
794
+ {"track_and_verify_wals_in_manifest", "true"},
795
+ {"max_open_files", "32"},
796
+ };
797
+ ASSERT_OK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt));
798
+ ASSERT_EQ(new_db_opt.create_if_missing, false);
799
+ ASSERT_EQ(new_db_opt.create_missing_column_families, true);
800
+ ASSERT_EQ(new_db_opt.error_if_exists, false);
801
+ ASSERT_EQ(new_db_opt.paranoid_checks, true);
802
+ ASSERT_EQ(new_db_opt.track_and_verify_wals_in_manifest, true);
803
+ ASSERT_EQ(new_db_opt.max_open_files, 32);
804
+ db_options_map["unknown_option"] = "1";
805
+ Status s = GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt);
806
+ ASSERT_NOK(s);
807
+ ASSERT_TRUE(s.IsInvalidArgument());
808
+
809
+ ASSERT_OK(
810
+ RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
811
+ ASSERT_OK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt, true,
812
+ true));
813
+ ASSERT_OK(GetDBOptionsFromString(
814
+ base_db_opt,
815
+ "create_if_missing=false;error_if_exists=false;max_open_files=42;",
816
+ &new_db_opt));
817
+ ASSERT_EQ(new_db_opt.create_if_missing, false);
818
+ ASSERT_EQ(new_db_opt.error_if_exists, false);
819
+ ASSERT_EQ(new_db_opt.max_open_files, 42);
820
+ s = GetDBOptionsFromString(
821
+ base_db_opt,
822
+ "create_if_missing=false;error_if_exists=false;max_open_files=42;"
823
+ "unknown_option=1;",
824
+ &new_db_opt);
825
+ ASSERT_NOK(s);
826
+ ASSERT_TRUE(s.IsInvalidArgument());
827
+ ASSERT_OK(
828
+ RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
829
+ }
830
+
831
+ #endif // !ROCKSDB_LITE
832
+
833
+ #ifndef ROCKSDB_LITE // GetBlockBasedTableOptionsFromString is not supported
834
+ TEST_F(OptionsTest, GetBlockBasedTableOptionsFromString) {
835
+ BlockBasedTableOptions table_opt;
836
+ BlockBasedTableOptions new_opt;
837
+ ConfigOptions config_options;
838
+ config_options.input_strings_escaped = false;
839
+ config_options.ignore_unknown_options = false;
840
+
841
+ // make sure default values are overwritten by something else
842
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
843
+ config_options, table_opt,
844
+ "cache_index_and_filter_blocks=1;index_type=kHashSearch;"
845
+ "checksum=kxxHash;hash_index_allow_collision=1;"
846
+ "block_cache=1M;block_cache_compressed=1k;block_size=1024;"
847
+ "block_size_deviation=8;block_restart_interval=4;"
848
+ "format_version=5;whole_key_filtering=1;"
849
+ "filter_policy=bloomfilter:4.567:false;"
850
+ // A bug caused read_amp_bytes_per_bit to be a large integer in OPTIONS
851
+ // file generated by 6.10 to 6.14. Though bug is fixed in these releases,
852
+ // we need to handle the case of loading OPTIONS file generated before the
853
+ // fix.
854
+ "read_amp_bytes_per_bit=17179869185;",
855
+ &new_opt));
856
+ ASSERT_TRUE(new_opt.cache_index_and_filter_blocks);
857
+ ASSERT_EQ(new_opt.index_type, BlockBasedTableOptions::kHashSearch);
858
+ ASSERT_EQ(new_opt.checksum, ChecksumType::kxxHash);
859
+ ASSERT_TRUE(new_opt.hash_index_allow_collision);
860
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
861
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
862
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
863
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL);
864
+ ASSERT_EQ(new_opt.block_size, 1024UL);
865
+ ASSERT_EQ(new_opt.block_size_deviation, 8);
866
+ ASSERT_EQ(new_opt.block_restart_interval, 4);
867
+ ASSERT_EQ(new_opt.format_version, 5U);
868
+ ASSERT_EQ(new_opt.whole_key_filtering, true);
869
+ ASSERT_TRUE(new_opt.filter_policy != nullptr);
870
+ const BloomFilterPolicy* bfp =
871
+ dynamic_cast<const BloomFilterPolicy*>(new_opt.filter_policy.get());
872
+ EXPECT_EQ(bfp->GetMillibitsPerKey(), 4567);
873
+ EXPECT_EQ(bfp->GetWholeBitsPerKey(), 5);
874
+ EXPECT_EQ(bfp->GetMode(), BloomFilterPolicy::kAutoBloom);
875
+ // Verify that only the lower 32bits are stored in
876
+ // new_opt.read_amp_bytes_per_bit.
877
+ EXPECT_EQ(1U, new_opt.read_amp_bytes_per_bit);
878
+
879
+ // unknown option
880
+ Status s = GetBlockBasedTableOptionsFromString(
881
+ config_options, table_opt,
882
+ "cache_index_and_filter_blocks=1;index_type=kBinarySearch;"
883
+ "bad_option=1",
884
+ &new_opt);
885
+ ASSERT_NOK(s);
886
+ ASSERT_TRUE(s.IsInvalidArgument());
887
+ ASSERT_EQ(static_cast<bool>(table_opt.cache_index_and_filter_blocks),
888
+ new_opt.cache_index_and_filter_blocks);
889
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
890
+
891
+ // unrecognized index type
892
+ s = GetBlockBasedTableOptionsFromString(
893
+ config_options, table_opt,
894
+ "cache_index_and_filter_blocks=1;index_type=kBinarySearchXX", &new_opt);
895
+ ASSERT_NOK(s);
896
+ ASSERT_TRUE(s.IsInvalidArgument());
897
+ ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
898
+ new_opt.cache_index_and_filter_blocks);
899
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
900
+
901
+ // unrecognized checksum type
902
+ ASSERT_NOK(GetBlockBasedTableOptionsFromString(
903
+ config_options, table_opt,
904
+ "cache_index_and_filter_blocks=1;checksum=kxxHashXX", &new_opt));
905
+ ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
906
+ new_opt.cache_index_and_filter_blocks);
907
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
908
+
909
+ // unrecognized filter policy name
910
+ s = GetBlockBasedTableOptionsFromString(config_options, table_opt,
911
+ "cache_index_and_filter_blocks=1;"
912
+ "filter_policy=bloomfilterxx:4:true",
913
+ &new_opt);
914
+ ASSERT_NOK(s);
915
+ 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
+
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);
925
+ ASSERT_NOK(s);
926
+ 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
+
931
+ // Experimental Ribbon filter policy
932
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
933
+ config_options, table_opt, "filter_policy=experimental_ribbon:5.678;",
934
+ &new_opt));
935
+ 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);
939
+
940
+ // Check block cache options are overwritten when specified
941
+ // in new format as a struct.
942
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
943
+ config_options, table_opt,
944
+ "block_cache={capacity=1M;num_shard_bits=4;"
945
+ "strict_capacity_limit=true;high_pri_pool_ratio=0.5;};"
946
+ "block_cache_compressed={capacity=1M;num_shard_bits=4;"
947
+ "strict_capacity_limit=true;high_pri_pool_ratio=0.5;}",
948
+ &new_opt));
949
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
950
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
951
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
952
+ new_opt.block_cache)->GetNumShardBits(), 4);
953
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), true);
954
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
955
+ new_opt.block_cache)->GetHighPriPoolRatio(), 0.5);
956
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
957
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL*1024UL);
958
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
959
+ new_opt.block_cache_compressed)->GetNumShardBits(), 4);
960
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), true);
961
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
962
+ new_opt.block_cache_compressed)->GetHighPriPoolRatio(),
963
+ 0.5);
964
+
965
+ // Set only block cache capacity. Check other values are
966
+ // reset to default values.
967
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
968
+ config_options, table_opt,
969
+ "block_cache={capacity=2M};"
970
+ "block_cache_compressed={capacity=2M}",
971
+ &new_opt));
972
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
973
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 2*1024UL*1024UL);
974
+ // Default values
975
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
976
+ new_opt.block_cache)->GetNumShardBits(),
977
+ GetDefaultCacheShardBits(new_opt.block_cache->GetCapacity()));
978
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), false);
979
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache)
980
+ ->GetHighPriPoolRatio(),
981
+ 0.5);
982
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
983
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 2*1024UL*1024UL);
984
+ // Default values
985
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
986
+ new_opt.block_cache_compressed)->GetNumShardBits(),
987
+ GetDefaultCacheShardBits(
988
+ new_opt.block_cache_compressed->GetCapacity()));
989
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), false);
990
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
991
+ ->GetHighPriPoolRatio(),
992
+ 0.5);
993
+
994
+ // Set couple of block cache options.
995
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
996
+ config_options, table_opt,
997
+ "block_cache={num_shard_bits=5;high_pri_pool_ratio=0.5;};"
998
+ "block_cache_compressed={num_shard_bits=5;"
999
+ "high_pri_pool_ratio=0.0;}",
1000
+ &new_opt));
1001
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 0);
1002
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
1003
+ new_opt.block_cache)->GetNumShardBits(), 5);
1004
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), false);
1005
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
1006
+ new_opt.block_cache)->GetHighPriPoolRatio(), 0.5);
1007
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
1008
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 0);
1009
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
1010
+ new_opt.block_cache_compressed)->GetNumShardBits(), 5);
1011
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), false);
1012
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
1013
+ ->GetHighPriPoolRatio(),
1014
+ 0.0);
1015
+
1016
+ // Set couple of block cache options.
1017
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
1018
+ config_options, table_opt,
1019
+ "block_cache={capacity=1M;num_shard_bits=4;"
1020
+ "strict_capacity_limit=true;};"
1021
+ "block_cache_compressed={capacity=1M;num_shard_bits=4;"
1022
+ "strict_capacity_limit=true;}",
1023
+ &new_opt));
1024
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
1025
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
1026
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
1027
+ new_opt.block_cache)->GetNumShardBits(), 4);
1028
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), true);
1029
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache)
1030
+ ->GetHighPriPoolRatio(),
1031
+ 0.5);
1032
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
1033
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL*1024UL);
1034
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
1035
+ new_opt.block_cache_compressed)->GetNumShardBits(), 4);
1036
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), true);
1037
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
1038
+ ->GetHighPriPoolRatio(),
1039
+ 0.5);
1040
+ }
1041
+ #endif // !ROCKSDB_LITE
1042
+
1043
+
1044
+ #ifndef ROCKSDB_LITE // GetPlainTableOptionsFromString is not supported
1045
+ TEST_F(OptionsTest, GetPlainTableOptionsFromString) {
1046
+ PlainTableOptions table_opt;
1047
+ PlainTableOptions new_opt;
1048
+ ConfigOptions config_options;
1049
+ config_options.input_strings_escaped = false;
1050
+ config_options.ignore_unknown_options = false;
1051
+ // make sure default values are overwritten by something else
1052
+ ASSERT_OK(GetPlainTableOptionsFromString(
1053
+ config_options, table_opt,
1054
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
1055
+ "index_sparseness=8;huge_page_tlb_size=4;encoding_type=kPrefix;"
1056
+ "full_scan_mode=true;store_index_in_file=true",
1057
+ &new_opt));
1058
+ ASSERT_EQ(new_opt.user_key_len, 66u);
1059
+ ASSERT_EQ(new_opt.bloom_bits_per_key, 20);
1060
+ ASSERT_EQ(new_opt.hash_table_ratio, 0.5);
1061
+ ASSERT_EQ(new_opt.index_sparseness, 8);
1062
+ ASSERT_EQ(new_opt.huge_page_tlb_size, 4);
1063
+ ASSERT_EQ(new_opt.encoding_type, EncodingType::kPrefix);
1064
+ ASSERT_TRUE(new_opt.full_scan_mode);
1065
+ ASSERT_TRUE(new_opt.store_index_in_file);
1066
+
1067
+ // unknown option
1068
+ Status s = GetPlainTableOptionsFromString(
1069
+ config_options, table_opt,
1070
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
1071
+ "bad_option=1",
1072
+ &new_opt);
1073
+ ASSERT_NOK(s);
1074
+ ASSERT_TRUE(s.IsInvalidArgument());
1075
+
1076
+ // unrecognized EncodingType
1077
+ s = GetPlainTableOptionsFromString(
1078
+ config_options, table_opt,
1079
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
1080
+ "encoding_type=kPrefixXX",
1081
+ &new_opt);
1082
+ ASSERT_NOK(s);
1083
+ ASSERT_TRUE(s.IsInvalidArgument());
1084
+ }
1085
+ #endif // !ROCKSDB_LITE
1086
+
1087
+ #ifndef ROCKSDB_LITE // GetMemTableRepFactoryFromString is not supported
1088
+ TEST_F(OptionsTest, GetMemTableRepFactoryFromString) {
1089
+ std::unique_ptr<MemTableRepFactory> new_mem_factory = nullptr;
1090
+
1091
+ ASSERT_OK(GetMemTableRepFactoryFromString("skip_list", &new_mem_factory));
1092
+ ASSERT_OK(GetMemTableRepFactoryFromString("skip_list:16", &new_mem_factory));
1093
+ ASSERT_EQ(std::string(new_mem_factory->Name()), "SkipListFactory");
1094
+ ASSERT_NOK(GetMemTableRepFactoryFromString("skip_list:16:invalid_opt",
1095
+ &new_mem_factory));
1096
+
1097
+ ASSERT_OK(GetMemTableRepFactoryFromString("prefix_hash", &new_mem_factory));
1098
+ ASSERT_OK(GetMemTableRepFactoryFromString("prefix_hash:1000",
1099
+ &new_mem_factory));
1100
+ ASSERT_EQ(std::string(new_mem_factory->Name()), "HashSkipListRepFactory");
1101
+ ASSERT_NOK(GetMemTableRepFactoryFromString("prefix_hash:1000:invalid_opt",
1102
+ &new_mem_factory));
1103
+
1104
+ ASSERT_OK(GetMemTableRepFactoryFromString("hash_linkedlist",
1105
+ &new_mem_factory));
1106
+ ASSERT_OK(GetMemTableRepFactoryFromString("hash_linkedlist:1000",
1107
+ &new_mem_factory));
1108
+ ASSERT_EQ(std::string(new_mem_factory->Name()), "HashLinkListRepFactory");
1109
+ ASSERT_NOK(GetMemTableRepFactoryFromString("hash_linkedlist:1000:invalid_opt",
1110
+ &new_mem_factory));
1111
+
1112
+ ASSERT_OK(GetMemTableRepFactoryFromString("vector", &new_mem_factory));
1113
+ ASSERT_OK(GetMemTableRepFactoryFromString("vector:1024", &new_mem_factory));
1114
+ ASSERT_EQ(std::string(new_mem_factory->Name()), "VectorRepFactory");
1115
+ ASSERT_NOK(GetMemTableRepFactoryFromString("vector:1024:invalid_opt",
1116
+ &new_mem_factory));
1117
+
1118
+ ASSERT_NOK(GetMemTableRepFactoryFromString("cuckoo", &new_mem_factory));
1119
+ // CuckooHash memtable is already removed.
1120
+ ASSERT_NOK(GetMemTableRepFactoryFromString("cuckoo:1024", &new_mem_factory));
1121
+
1122
+ ASSERT_NOK(GetMemTableRepFactoryFromString("bad_factory", &new_mem_factory));
1123
+ }
1124
+ #endif // !ROCKSDB_LITE
1125
+
1126
+ #ifndef ROCKSDB_LITE // GetOptionsFromString is not supported in RocksDB Lite
1127
+ TEST_F(OptionsTest, GetOptionsFromStringTest) {
1128
+ Options base_options, new_options;
1129
+ ConfigOptions config_options;
1130
+ config_options.input_strings_escaped = false;
1131
+ config_options.ignore_unknown_options = false;
1132
+
1133
+ base_options.write_buffer_size = 20;
1134
+ base_options.min_write_buffer_number_to_merge = 15;
1135
+ BlockBasedTableOptions block_based_table_options;
1136
+ block_based_table_options.cache_index_and_filter_blocks = true;
1137
+ base_options.table_factory.reset(
1138
+ NewBlockBasedTableFactory(block_based_table_options));
1139
+
1140
+ // 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,
1149
+ [](const std::string& /*name*/, std::unique_ptr<Env>* /*env_guard*/,
1150
+ std::string* /* errmsg */) {
1151
+ static CustomEnv env(Env::Default());
1152
+ return &env;
1153
+ });
1154
+
1155
+ ASSERT_OK(GetOptionsFromString(
1156
+ config_options, base_options,
1157
+ "write_buffer_size=10;max_write_buffer_number=16;"
1158
+ "block_based_table_factory={block_cache=1M;block_size=4;};"
1159
+ "compression_opts=4:5:6;create_if_missing=true;max_open_files=1;"
1160
+ "bottommost_compression_opts=5:6:7;create_if_missing=true;max_open_files="
1161
+ "1;"
1162
+ "rate_limiter_bytes_per_sec=1024;env=CustomEnv",
1163
+ &new_options));
1164
+
1165
+ ASSERT_EQ(new_options.compression_opts.window_bits, 4);
1166
+ ASSERT_EQ(new_options.compression_opts.level, 5);
1167
+ ASSERT_EQ(new_options.compression_opts.strategy, 6);
1168
+ ASSERT_EQ(new_options.compression_opts.max_dict_bytes, 0u);
1169
+ ASSERT_EQ(new_options.compression_opts.zstd_max_train_bytes, 0u);
1170
+ ASSERT_EQ(new_options.compression_opts.parallel_threads, 1u);
1171
+ ASSERT_EQ(new_options.compression_opts.enabled, false);
1172
+ ASSERT_EQ(new_options.bottommost_compression, kDisableCompressionOption);
1173
+ ASSERT_EQ(new_options.bottommost_compression_opts.window_bits, 5);
1174
+ ASSERT_EQ(new_options.bottommost_compression_opts.level, 6);
1175
+ ASSERT_EQ(new_options.bottommost_compression_opts.strategy, 7);
1176
+ ASSERT_EQ(new_options.bottommost_compression_opts.max_dict_bytes, 0u);
1177
+ ASSERT_EQ(new_options.bottommost_compression_opts.zstd_max_train_bytes, 0u);
1178
+ ASSERT_EQ(new_options.bottommost_compression_opts.parallel_threads, 1u);
1179
+ ASSERT_EQ(new_options.bottommost_compression_opts.enabled, false);
1180
+ ASSERT_EQ(new_options.write_buffer_size, 10U);
1181
+ ASSERT_EQ(new_options.max_write_buffer_number, 16);
1182
+ const auto new_bbto =
1183
+ new_options.table_factory->GetOptions<BlockBasedTableOptions>();
1184
+ ASSERT_NE(new_bbto, nullptr);
1185
+ ASSERT_EQ(new_bbto->block_cache->GetCapacity(), 1U << 20);
1186
+ ASSERT_EQ(new_bbto->block_size, 4U);
1187
+ // don't overwrite block based table options
1188
+ ASSERT_TRUE(new_bbto->cache_index_and_filter_blocks);
1189
+
1190
+ ASSERT_EQ(new_options.create_if_missing, true);
1191
+ ASSERT_EQ(new_options.max_open_files, 1);
1192
+ ASSERT_TRUE(new_options.rate_limiter.get() != nullptr);
1193
+ Env* newEnv = new_options.env;
1194
+ ASSERT_OK(Env::LoadEnv(kCustomEnvName, &newEnv));
1195
+ ASSERT_EQ(newEnv, new_options.env);
1196
+
1197
+ config_options.ignore_unknown_options = false;
1198
+ // Test a bad value for a DBOption returns a failure
1199
+ base_options.dump_malloc_stats = false;
1200
+ base_options.write_buffer_size = 1024;
1201
+ Options bad_options = new_options;
1202
+ Status s = GetOptionsFromString(config_options, base_options,
1203
+ "create_if_missing=XX;dump_malloc_stats=true",
1204
+ &bad_options);
1205
+ ASSERT_NOK(s);
1206
+ ASSERT_TRUE(s.IsInvalidArgument());
1207
+ ASSERT_EQ(bad_options.dump_malloc_stats, false);
1208
+
1209
+ bad_options = new_options;
1210
+ s = GetOptionsFromString(config_options, base_options,
1211
+ "write_buffer_size=XX;dump_malloc_stats=true",
1212
+ &bad_options);
1213
+ ASSERT_NOK(s);
1214
+ ASSERT_TRUE(s.IsInvalidArgument());
1215
+
1216
+ ASSERT_EQ(bad_options.dump_malloc_stats, false);
1217
+
1218
+ // Test a bad value for a TableFactory Option returns a failure
1219
+ bad_options = new_options;
1220
+ s = GetOptionsFromString(config_options, base_options,
1221
+ "write_buffer_size=16;dump_malloc_stats=true"
1222
+ "block_based_table_factory={block_size=XX;};",
1223
+ &bad_options);
1224
+ ASSERT_TRUE(s.IsInvalidArgument());
1225
+ ASSERT_EQ(bad_options.dump_malloc_stats, false);
1226
+ ASSERT_EQ(bad_options.write_buffer_size, 1024);
1227
+
1228
+ config_options.ignore_unknown_options = true;
1229
+ ASSERT_OK(GetOptionsFromString(config_options, base_options,
1230
+ "create_if_missing=XX;dump_malloc_stats=true;"
1231
+ "write_buffer_size=XX;"
1232
+ "block_based_table_factory={block_size=XX;};",
1233
+ &bad_options));
1234
+ ASSERT_EQ(bad_options.create_if_missing, base_options.create_if_missing);
1235
+ ASSERT_EQ(bad_options.dump_malloc_stats, true);
1236
+ ASSERT_EQ(bad_options.write_buffer_size, base_options.write_buffer_size);
1237
+
1238
+ // Test the old interface
1239
+ ASSERT_OK(GetOptionsFromString(
1240
+ base_options,
1241
+ "write_buffer_size=22;max_write_buffer_number=33;max_open_files=44;",
1242
+ &new_options));
1243
+ ASSERT_EQ(new_options.write_buffer_size, 22U);
1244
+ ASSERT_EQ(new_options.max_write_buffer_number, 33);
1245
+ ASSERT_EQ(new_options.max_open_files, 44);
1246
+ }
1247
+
1248
+ TEST_F(OptionsTest, DBOptionsSerialization) {
1249
+ Options base_options, new_options;
1250
+ Random rnd(301);
1251
+ ConfigOptions config_options;
1252
+ config_options.input_strings_escaped = false;
1253
+ config_options.ignore_unknown_options = false;
1254
+
1255
+ // Phase 1: Make big change in base_options
1256
+ test::RandomInitDBOptions(&base_options, &rnd);
1257
+
1258
+ // Phase 2: obtain a string from base_option
1259
+ std::string base_options_file_content;
1260
+ ASSERT_OK(GetStringFromDBOptions(config_options, base_options,
1261
+ &base_options_file_content));
1262
+
1263
+ // Phase 3: Set new_options from the derived string and expect
1264
+ // new_options == base_options
1265
+ ASSERT_OK(GetDBOptionsFromString(config_options, DBOptions(),
1266
+ base_options_file_content, &new_options));
1267
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(config_options, base_options,
1268
+ new_options));
1269
+ }
1270
+
1271
+ TEST_F(OptionsTest, OptionsComposeDecompose) {
1272
+ // build an Options from DBOptions + CFOptions, then decompose it to verify
1273
+ // we get same constituent options.
1274
+ DBOptions base_db_opts;
1275
+ ColumnFamilyOptions base_cf_opts;
1276
+ ConfigOptions
1277
+ config_options; // Use default for ignore(false) and check (exact)
1278
+ config_options.input_strings_escaped = false;
1279
+
1280
+ Random rnd(301);
1281
+ test::RandomInitDBOptions(&base_db_opts, &rnd);
1282
+ test::RandomInitCFOptions(&base_cf_opts, base_db_opts, &rnd);
1283
+
1284
+ Options base_opts(base_db_opts, base_cf_opts);
1285
+ DBOptions new_db_opts(base_opts);
1286
+ ColumnFamilyOptions new_cf_opts(base_opts);
1287
+
1288
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(config_options, base_db_opts,
1289
+ new_db_opts));
1290
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_cf_opts,
1291
+ new_cf_opts));
1292
+ delete new_cf_opts.compaction_filter;
1293
+ }
1294
+
1295
+ TEST_F(OptionsTest, ColumnFamilyOptionsSerialization) {
1296
+ Options options;
1297
+ ColumnFamilyOptions base_opt, new_opt;
1298
+ Random rnd(302);
1299
+ ConfigOptions config_options;
1300
+ config_options.input_strings_escaped = false;
1301
+
1302
+ // Phase 1: randomly assign base_opt
1303
+ // custom type options
1304
+ test::RandomInitCFOptions(&base_opt, options, &rnd);
1305
+
1306
+ // Phase 2: obtain a string from base_opt
1307
+ std::string base_options_file_content;
1308
+ ASSERT_OK(GetStringFromColumnFamilyOptions(config_options, base_opt,
1309
+ &base_options_file_content));
1310
+
1311
+ // Phase 3: Set new_opt from the derived string and expect
1312
+ // new_opt == base_opt
1313
+ ASSERT_OK(
1314
+ GetColumnFamilyOptionsFromString(config_options, ColumnFamilyOptions(),
1315
+ base_options_file_content, &new_opt));
1316
+ ASSERT_OK(
1317
+ RocksDBOptionsParser::VerifyCFOptions(config_options, base_opt, new_opt));
1318
+ if (base_opt.compaction_filter) {
1319
+ delete base_opt.compaction_filter;
1320
+ }
1321
+ }
1322
+
1323
+ TEST_F(OptionsTest, CheckBlockBasedTableOptions) {
1324
+ ColumnFamilyOptions cf_opts;
1325
+ DBOptions db_opts;
1326
+ ConfigOptions config_opts;
1327
+
1328
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1329
+ config_opts, cf_opts, "prefix_extractor=capped:8", &cf_opts));
1330
+ ASSERT_OK(TableFactory::CreateFromString(config_opts, "BlockBasedTable",
1331
+ &cf_opts.table_factory));
1332
+ ASSERT_NE(cf_opts.table_factory.get(), nullptr);
1333
+ ASSERT_TRUE(cf_opts.table_factory->IsInstanceOf(
1334
+ TableFactory::kBlockBasedTableName()));
1335
+ auto bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1336
+ ASSERT_OK(cf_opts.table_factory->ConfigureFromString(
1337
+ config_opts,
1338
+ "block_cache={capacity=1M;num_shard_bits=4;};"
1339
+ "block_size_deviation=101;"
1340
+ "block_restart_interval=0;"
1341
+ "index_block_restart_interval=5;"
1342
+ "partition_filters=true;"
1343
+ "index_type=kHashSearch;"
1344
+ "no_block_cache=1;"));
1345
+ ASSERT_NE(bbto, nullptr);
1346
+ ASSERT_EQ(bbto->block_cache.get(), nullptr);
1347
+ ASSERT_EQ(bbto->block_size_deviation, 0);
1348
+ ASSERT_EQ(bbto->block_restart_interval, 1);
1349
+ ASSERT_EQ(bbto->index_block_restart_interval, 1);
1350
+ ASSERT_FALSE(bbto->partition_filters);
1351
+ ASSERT_OK(TableFactory::CreateFromString(config_opts, "BlockBasedTable",
1352
+ &cf_opts.table_factory));
1353
+ bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1354
+
1355
+ ASSERT_OK(cf_opts.table_factory->ConfigureFromString(config_opts,
1356
+ "no_block_cache=0;"));
1357
+ ASSERT_NE(bbto->block_cache.get(), nullptr);
1358
+ ASSERT_OK(cf_opts.table_factory->ValidateOptions(db_opts, cf_opts));
1359
+ }
1360
+
1361
+ TEST_F(OptionsTest, MutableTableOptions) {
1362
+ ConfigOptions config_options;
1363
+ std::shared_ptr<TableFactory> bbtf;
1364
+ bbtf.reset(NewBlockBasedTableFactory());
1365
+ auto bbto = bbtf->GetOptions<BlockBasedTableOptions>();
1366
+ ASSERT_NE(bbto, nullptr);
1367
+ ASSERT_FALSE(bbtf->IsPrepared());
1368
+ ASSERT_OK(bbtf->ConfigureOption(config_options, "block_align", "true"));
1369
+ ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1370
+ ASSERT_EQ(bbto->block_align, true);
1371
+ ASSERT_EQ(bbto->block_size, 1024);
1372
+ ASSERT_OK(bbtf->PrepareOptions(config_options));
1373
+ ASSERT_TRUE(bbtf->IsPrepared());
1374
+ ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1375
+ ASSERT_EQ(bbto->block_align, true);
1376
+ ASSERT_NOK(bbtf->ConfigureOption(config_options, "block_align", "false"));
1377
+ ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "2048"));
1378
+ ASSERT_EQ(bbto->block_align, true);
1379
+ ASSERT_EQ(bbto->block_size, 2048);
1380
+
1381
+ ColumnFamilyOptions cf_opts;
1382
+ cf_opts.table_factory = bbtf;
1383
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(
1384
+ config_options, cf_opts, "block_based_table_factory.block_align=false",
1385
+ &cf_opts));
1386
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1387
+ config_options, cf_opts, "block_based_table_factory.block_size=8192",
1388
+ &cf_opts));
1389
+ ASSERT_EQ(bbto->block_align, true);
1390
+ ASSERT_EQ(bbto->block_size, 8192);
1391
+ }
1392
+
1393
+ #endif // !ROCKSDB_LITE
1394
+
1395
+ Status StringToMap(
1396
+ const std::string& opts_str,
1397
+ std::unordered_map<std::string, std::string>* opts_map);
1398
+
1399
+ #ifndef ROCKSDB_LITE // StringToMap is not supported in ROCKSDB_LITE
1400
+ TEST_F(OptionsTest, StringToMapTest) {
1401
+ std::unordered_map<std::string, std::string> opts_map;
1402
+ // Regular options
1403
+ ASSERT_OK(StringToMap("k1=v1;k2=v2;k3=v3", &opts_map));
1404
+ ASSERT_EQ(opts_map["k1"], "v1");
1405
+ ASSERT_EQ(opts_map["k2"], "v2");
1406
+ ASSERT_EQ(opts_map["k3"], "v3");
1407
+ // Value with '='
1408
+ opts_map.clear();
1409
+ ASSERT_OK(StringToMap("k1==v1;k2=v2=;", &opts_map));
1410
+ ASSERT_EQ(opts_map["k1"], "=v1");
1411
+ ASSERT_EQ(opts_map["k2"], "v2=");
1412
+ // Overwrriten option
1413
+ opts_map.clear();
1414
+ ASSERT_OK(StringToMap("k1=v1;k1=v2;k3=v3", &opts_map));
1415
+ ASSERT_EQ(opts_map["k1"], "v2");
1416
+ ASSERT_EQ(opts_map["k3"], "v3");
1417
+ // Empty value
1418
+ opts_map.clear();
1419
+ ASSERT_OK(StringToMap("k1=v1;k2=;k3=v3;k4=", &opts_map));
1420
+ ASSERT_EQ(opts_map["k1"], "v1");
1421
+ ASSERT_TRUE(opts_map.find("k2") != opts_map.end());
1422
+ ASSERT_EQ(opts_map["k2"], "");
1423
+ ASSERT_EQ(opts_map["k3"], "v3");
1424
+ ASSERT_TRUE(opts_map.find("k4") != opts_map.end());
1425
+ ASSERT_EQ(opts_map["k4"], "");
1426
+ opts_map.clear();
1427
+ ASSERT_OK(StringToMap("k1=v1;k2=;k3=v3;k4= ", &opts_map));
1428
+ ASSERT_EQ(opts_map["k1"], "v1");
1429
+ ASSERT_TRUE(opts_map.find("k2") != opts_map.end());
1430
+ ASSERT_EQ(opts_map["k2"], "");
1431
+ ASSERT_EQ(opts_map["k3"], "v3");
1432
+ ASSERT_TRUE(opts_map.find("k4") != opts_map.end());
1433
+ ASSERT_EQ(opts_map["k4"], "");
1434
+ opts_map.clear();
1435
+ ASSERT_OK(StringToMap("k1=v1;k2=;k3=", &opts_map));
1436
+ ASSERT_EQ(opts_map["k1"], "v1");
1437
+ ASSERT_TRUE(opts_map.find("k2") != opts_map.end());
1438
+ ASSERT_EQ(opts_map["k2"], "");
1439
+ ASSERT_TRUE(opts_map.find("k3") != opts_map.end());
1440
+ ASSERT_EQ(opts_map["k3"], "");
1441
+ opts_map.clear();
1442
+ ASSERT_OK(StringToMap("k1=v1;k2=;k3=;", &opts_map));
1443
+ ASSERT_EQ(opts_map["k1"], "v1");
1444
+ ASSERT_TRUE(opts_map.find("k2") != opts_map.end());
1445
+ ASSERT_EQ(opts_map["k2"], "");
1446
+ ASSERT_TRUE(opts_map.find("k3") != opts_map.end());
1447
+ ASSERT_EQ(opts_map["k3"], "");
1448
+ // Regular nested options
1449
+ opts_map.clear();
1450
+ ASSERT_OK(StringToMap("k1=v1;k2={nk1=nv1;nk2=nv2};k3=v3", &opts_map));
1451
+ ASSERT_EQ(opts_map["k1"], "v1");
1452
+ ASSERT_EQ(opts_map["k2"], "nk1=nv1;nk2=nv2");
1453
+ ASSERT_EQ(opts_map["k3"], "v3");
1454
+ // Multi-level nested options
1455
+ opts_map.clear();
1456
+ ASSERT_OK(StringToMap("k1=v1;k2={nk1=nv1;nk2={nnk1=nnk2}};"
1457
+ "k3={nk1={nnk1={nnnk1=nnnv1;nnnk2;nnnv2}}};k4=v4",
1458
+ &opts_map));
1459
+ ASSERT_EQ(opts_map["k1"], "v1");
1460
+ ASSERT_EQ(opts_map["k2"], "nk1=nv1;nk2={nnk1=nnk2}");
1461
+ ASSERT_EQ(opts_map["k3"], "nk1={nnk1={nnnk1=nnnv1;nnnk2;nnnv2}}");
1462
+ ASSERT_EQ(opts_map["k4"], "v4");
1463
+ // Garbage inside curly braces
1464
+ opts_map.clear();
1465
+ ASSERT_OK(StringToMap("k1=v1;k2={dfad=};k3={=};k4=v4",
1466
+ &opts_map));
1467
+ ASSERT_EQ(opts_map["k1"], "v1");
1468
+ ASSERT_EQ(opts_map["k2"], "dfad=");
1469
+ ASSERT_EQ(opts_map["k3"], "=");
1470
+ ASSERT_EQ(opts_map["k4"], "v4");
1471
+ // Empty nested options
1472
+ opts_map.clear();
1473
+ ASSERT_OK(StringToMap("k1=v1;k2={};", &opts_map));
1474
+ ASSERT_EQ(opts_map["k1"], "v1");
1475
+ ASSERT_EQ(opts_map["k2"], "");
1476
+ opts_map.clear();
1477
+ ASSERT_OK(StringToMap("k1=v1;k2={{{{}}}{}{}};", &opts_map));
1478
+ ASSERT_EQ(opts_map["k1"], "v1");
1479
+ ASSERT_EQ(opts_map["k2"], "{{{}}}{}{}");
1480
+ // With random spaces
1481
+ opts_map.clear();
1482
+ ASSERT_OK(StringToMap(" k1 = v1 ; k2= {nk1=nv1; nk2={nnk1=nnk2}} ; "
1483
+ "k3={ { } }; k4= v4 ",
1484
+ &opts_map));
1485
+ ASSERT_EQ(opts_map["k1"], "v1");
1486
+ ASSERT_EQ(opts_map["k2"], "nk1=nv1; nk2={nnk1=nnk2}");
1487
+ ASSERT_EQ(opts_map["k3"], "{ }");
1488
+ ASSERT_EQ(opts_map["k4"], "v4");
1489
+
1490
+ // Empty key
1491
+ ASSERT_NOK(StringToMap("k1=v1;k2=v2;=", &opts_map));
1492
+ ASSERT_NOK(StringToMap("=v1;k2=v2", &opts_map));
1493
+ ASSERT_NOK(StringToMap("k1=v1;k2v2;", &opts_map));
1494
+ ASSERT_NOK(StringToMap("k1=v1;k2=v2;fadfa", &opts_map));
1495
+ ASSERT_NOK(StringToMap("k1=v1;k2=v2;;", &opts_map));
1496
+ // Mismatch curly braces
1497
+ ASSERT_NOK(StringToMap("k1=v1;k2={;k3=v3", &opts_map));
1498
+ ASSERT_NOK(StringToMap("k1=v1;k2={{};k3=v3", &opts_map));
1499
+ ASSERT_NOK(StringToMap("k1=v1;k2={}};k3=v3", &opts_map));
1500
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}{}}};k3=v3", &opts_map));
1501
+ // However this is valid!
1502
+ opts_map.clear();
1503
+ ASSERT_OK(StringToMap("k1=v1;k2=};k3=v3", &opts_map));
1504
+ ASSERT_EQ(opts_map["k1"], "v1");
1505
+ ASSERT_EQ(opts_map["k2"], "}");
1506
+ ASSERT_EQ(opts_map["k3"], "v3");
1507
+
1508
+ // Invalid chars after closing curly brace
1509
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}}{};k3=v3", &opts_map));
1510
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}}cfda;k3=v3", &opts_map));
1511
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}} cfda;k3=v3", &opts_map));
1512
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}} cfda", &opts_map));
1513
+ ASSERT_NOK(StringToMap("k1=v1;k2={{}}{}", &opts_map));
1514
+ ASSERT_NOK(StringToMap("k1=v1;k2={{dfdl}adfa}{}", &opts_map));
1515
+ }
1516
+ #endif // ROCKSDB_LITE
1517
+
1518
+ #ifndef ROCKSDB_LITE // StringToMap is not supported in ROCKSDB_LITE
1519
+ TEST_F(OptionsTest, StringToMapRandomTest) {
1520
+ std::unordered_map<std::string, std::string> opts_map;
1521
+ // Make sure segfault is not hit by semi-random strings
1522
+
1523
+ std::vector<std::string> bases = {
1524
+ "a={aa={};tt={xxx={}}};c=defff",
1525
+ "a={aa={};tt={xxx={}}};c=defff;d={{}yxx{}3{xx}}",
1526
+ "abc={{}{}{}{{{}}}{{}{}{}{}{}{}{}"};
1527
+
1528
+ for (std::string base : bases) {
1529
+ for (int rand_seed = 301; rand_seed < 401; rand_seed++) {
1530
+ Random rnd(rand_seed);
1531
+ for (int attempt = 0; attempt < 10; attempt++) {
1532
+ std::string str = base;
1533
+ // Replace random position to space
1534
+ size_t pos = static_cast<size_t>(
1535
+ rnd.Uniform(static_cast<int>(base.size())));
1536
+ str[pos] = ' ';
1537
+ Status s = StringToMap(str, &opts_map);
1538
+ ASSERT_TRUE(s.ok() || s.IsInvalidArgument());
1539
+ opts_map.clear();
1540
+ }
1541
+ }
1542
+ }
1543
+
1544
+ // Random Construct a string
1545
+ std::vector<char> chars = {'{', '}', ' ', '=', ';', 'c'};
1546
+ for (int rand_seed = 301; rand_seed < 1301; rand_seed++) {
1547
+ Random rnd(rand_seed);
1548
+ int len = rnd.Uniform(30);
1549
+ std::string str = "";
1550
+ for (int attempt = 0; attempt < len; attempt++) {
1551
+ // Add a random character
1552
+ size_t pos = static_cast<size_t>(
1553
+ rnd.Uniform(static_cast<int>(chars.size())));
1554
+ str.append(1, chars[pos]);
1555
+ }
1556
+ Status s = StringToMap(str, &opts_map);
1557
+ ASSERT_TRUE(s.ok() || s.IsInvalidArgument());
1558
+ s = StringToMap("name=" + str, &opts_map);
1559
+ ASSERT_TRUE(s.ok() || s.IsInvalidArgument());
1560
+ opts_map.clear();
1561
+ }
1562
+ }
1563
+
1564
+ TEST_F(OptionsTest, GetStringFromCompressionType) {
1565
+ std::string res;
1566
+
1567
+ ASSERT_OK(GetStringFromCompressionType(&res, kNoCompression));
1568
+ ASSERT_EQ(res, "kNoCompression");
1569
+
1570
+ ASSERT_OK(GetStringFromCompressionType(&res, kSnappyCompression));
1571
+ ASSERT_EQ(res, "kSnappyCompression");
1572
+
1573
+ ASSERT_OK(GetStringFromCompressionType(&res, kDisableCompressionOption));
1574
+ ASSERT_EQ(res, "kDisableCompressionOption");
1575
+
1576
+ ASSERT_OK(GetStringFromCompressionType(&res, kLZ4Compression));
1577
+ ASSERT_EQ(res, "kLZ4Compression");
1578
+
1579
+ ASSERT_OK(GetStringFromCompressionType(&res, kZlibCompression));
1580
+ ASSERT_EQ(res, "kZlibCompression");
1581
+
1582
+ ASSERT_NOK(
1583
+ GetStringFromCompressionType(&res, static_cast<CompressionType>(-10)));
1584
+ }
1585
+ #endif // !ROCKSDB_LITE
1586
+
1587
+ TEST_F(OptionsTest, ConvertOptionsTest) {
1588
+ LevelDBOptions leveldb_opt;
1589
+ Options converted_opt = ConvertOptions(leveldb_opt);
1590
+
1591
+ ASSERT_EQ(converted_opt.create_if_missing, leveldb_opt.create_if_missing);
1592
+ ASSERT_EQ(converted_opt.error_if_exists, leveldb_opt.error_if_exists);
1593
+ ASSERT_EQ(converted_opt.paranoid_checks, leveldb_opt.paranoid_checks);
1594
+ ASSERT_EQ(converted_opt.env, leveldb_opt.env);
1595
+ ASSERT_EQ(converted_opt.info_log.get(), leveldb_opt.info_log);
1596
+ ASSERT_EQ(converted_opt.write_buffer_size, leveldb_opt.write_buffer_size);
1597
+ ASSERT_EQ(converted_opt.max_open_files, leveldb_opt.max_open_files);
1598
+ ASSERT_EQ(converted_opt.compression, leveldb_opt.compression);
1599
+
1600
+ std::shared_ptr<TableFactory> table_factory = converted_opt.table_factory;
1601
+ const auto table_opt = table_factory->GetOptions<BlockBasedTableOptions>();
1602
+ ASSERT_NE(table_opt, nullptr);
1603
+
1604
+ ASSERT_EQ(table_opt->block_cache->GetCapacity(), 8UL << 20);
1605
+ ASSERT_EQ(table_opt->block_size, leveldb_opt.block_size);
1606
+ ASSERT_EQ(table_opt->block_restart_interval,
1607
+ leveldb_opt.block_restart_interval);
1608
+ ASSERT_EQ(table_opt->filter_policy.get(), leveldb_opt.filter_policy);
1609
+ }
1610
+
1611
+ #ifndef ROCKSDB_LITE
1612
+ // This test suite tests the old APIs into the Configure options methods.
1613
+ // Once those APIs are officially deprecated, this test suite can be deleted.
1614
+ class OptionsOldApiTest : public testing::Test {};
1615
+
1616
+ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
1617
+ std::unordered_map<std::string, std::string> cf_options_map = {
1618
+ {"write_buffer_size", "1"},
1619
+ {"max_write_buffer_number", "2"},
1620
+ {"min_write_buffer_number_to_merge", "3"},
1621
+ {"max_write_buffer_number_to_maintain", "99"},
1622
+ {"max_write_buffer_size_to_maintain", "-99999"},
1623
+ {"compression", "kSnappyCompression"},
1624
+ {"compression_per_level",
1625
+ "kNoCompression:"
1626
+ "kSnappyCompression:"
1627
+ "kZlibCompression:"
1628
+ "kBZip2Compression:"
1629
+ "kLZ4Compression:"
1630
+ "kLZ4HCCompression:"
1631
+ "kXpressCompression:"
1632
+ "kZSTD:"
1633
+ "kZSTDNotFinalCompression"},
1634
+ {"bottommost_compression", "kLZ4Compression"},
1635
+ {"bottommost_compression_opts", "5:6:7:8:9:true"},
1636
+ {"compression_opts", "4:5:6:7:8:true"},
1637
+ {"num_levels", "8"},
1638
+ {"level0_file_num_compaction_trigger", "8"},
1639
+ {"level0_slowdown_writes_trigger", "9"},
1640
+ {"level0_stop_writes_trigger", "10"},
1641
+ {"target_file_size_base", "12"},
1642
+ {"target_file_size_multiplier", "13"},
1643
+ {"max_bytes_for_level_base", "14"},
1644
+ {"level_compaction_dynamic_level_bytes", "true"},
1645
+ {"max_bytes_for_level_multiplier", "15.0"},
1646
+ {"max_bytes_for_level_multiplier_additional", "16:17:18"},
1647
+ {"max_compaction_bytes", "21"},
1648
+ {"soft_rate_limit", "1.1"},
1649
+ {"hard_rate_limit", "2.1"},
1650
+ {"hard_pending_compaction_bytes_limit", "211"},
1651
+ {"arena_block_size", "22"},
1652
+ {"disable_auto_compactions", "true"},
1653
+ {"compaction_style", "kCompactionStyleLevel"},
1654
+ {"compaction_pri", "kOldestSmallestSeqFirst"},
1655
+ {"verify_checksums_in_compaction", "false"},
1656
+ {"compaction_options_fifo", "23"},
1657
+ {"max_sequential_skip_in_iterations", "24"},
1658
+ {"inplace_update_support", "true"},
1659
+ {"report_bg_io_stats", "true"},
1660
+ {"compaction_measure_io_stats", "false"},
1661
+ {"inplace_update_num_locks", "25"},
1662
+ {"memtable_prefix_bloom_size_ratio", "0.26"},
1663
+ {"memtable_whole_key_filtering", "true"},
1664
+ {"memtable_huge_page_size", "28"},
1665
+ {"bloom_locality", "29"},
1666
+ {"max_successive_merges", "30"},
1667
+ {"min_partial_merge_operands", "31"},
1668
+ {"prefix_extractor", "fixed:31"},
1669
+ {"optimize_filters_for_hits", "true"},
1670
+ {"enable_blob_files", "true"},
1671
+ {"min_blob_size", "1K"},
1672
+ {"blob_file_size", "1G"},
1673
+ {"blob_compression_type", "kZSTD"},
1674
+ {"enable_blob_garbage_collection", "true"},
1675
+ {"blob_garbage_collection_age_cutoff", "0.5"},
1676
+ };
1677
+
1678
+ std::unordered_map<std::string, std::string> db_options_map = {
1679
+ {"create_if_missing", "false"},
1680
+ {"create_missing_column_families", "true"},
1681
+ {"error_if_exists", "false"},
1682
+ {"paranoid_checks", "true"},
1683
+ {"track_and_verify_wals_in_manifest", "true"},
1684
+ {"max_open_files", "32"},
1685
+ {"max_total_wal_size", "33"},
1686
+ {"use_fsync", "true"},
1687
+ {"db_log_dir", "/db_log_dir"},
1688
+ {"wal_dir", "/wal_dir"},
1689
+ {"delete_obsolete_files_period_micros", "34"},
1690
+ {"max_background_compactions", "35"},
1691
+ {"max_background_flushes", "36"},
1692
+ {"max_log_file_size", "37"},
1693
+ {"log_file_time_to_roll", "38"},
1694
+ {"keep_log_file_num", "39"},
1695
+ {"recycle_log_file_num", "5"},
1696
+ {"max_manifest_file_size", "40"},
1697
+ {"table_cache_numshardbits", "41"},
1698
+ {"WAL_ttl_seconds", "43"},
1699
+ {"WAL_size_limit_MB", "44"},
1700
+ {"manifest_preallocation_size", "45"},
1701
+ {"allow_mmap_reads", "true"},
1702
+ {"allow_mmap_writes", "false"},
1703
+ {"use_direct_reads", "false"},
1704
+ {"use_direct_io_for_flush_and_compaction", "false"},
1705
+ {"is_fd_close_on_exec", "true"},
1706
+ {"skip_log_error_on_recovery", "false"},
1707
+ {"stats_dump_period_sec", "46"},
1708
+ {"stats_persist_period_sec", "57"},
1709
+ {"persist_stats_to_disk", "false"},
1710
+ {"stats_history_buffer_size", "69"},
1711
+ {"advise_random_on_open", "true"},
1712
+ {"use_adaptive_mutex", "false"},
1713
+ {"new_table_reader_for_compaction_inputs", "true"},
1714
+ {"compaction_readahead_size", "100"},
1715
+ {"random_access_max_buffer_size", "3145728"},
1716
+ {"writable_file_max_buffer_size", "314159"},
1717
+ {"bytes_per_sync", "47"},
1718
+ {"wal_bytes_per_sync", "48"},
1719
+ {"strict_bytes_per_sync", "true"},
1720
+ };
1721
+
1722
+ ColumnFamilyOptions base_cf_opt;
1723
+ ColumnFamilyOptions new_cf_opt;
1724
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1725
+ base_cf_opt, cf_options_map, &new_cf_opt));
1726
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 1U);
1727
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 2);
1728
+ ASSERT_EQ(new_cf_opt.min_write_buffer_number_to_merge, 3);
1729
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number_to_maintain, 99);
1730
+ ASSERT_EQ(new_cf_opt.max_write_buffer_size_to_maintain, -99999);
1731
+ ASSERT_EQ(new_cf_opt.compression, kSnappyCompression);
1732
+ ASSERT_EQ(new_cf_opt.compression_per_level.size(), 9U);
1733
+ ASSERT_EQ(new_cf_opt.compression_per_level[0], kNoCompression);
1734
+ ASSERT_EQ(new_cf_opt.compression_per_level[1], kSnappyCompression);
1735
+ ASSERT_EQ(new_cf_opt.compression_per_level[2], kZlibCompression);
1736
+ ASSERT_EQ(new_cf_opt.compression_per_level[3], kBZip2Compression);
1737
+ ASSERT_EQ(new_cf_opt.compression_per_level[4], kLZ4Compression);
1738
+ ASSERT_EQ(new_cf_opt.compression_per_level[5], kLZ4HCCompression);
1739
+ ASSERT_EQ(new_cf_opt.compression_per_level[6], kXpressCompression);
1740
+ ASSERT_EQ(new_cf_opt.compression_per_level[7], kZSTD);
1741
+ ASSERT_EQ(new_cf_opt.compression_per_level[8], kZSTDNotFinalCompression);
1742
+ ASSERT_EQ(new_cf_opt.compression_opts.window_bits, 4);
1743
+ ASSERT_EQ(new_cf_opt.compression_opts.level, 5);
1744
+ ASSERT_EQ(new_cf_opt.compression_opts.strategy, 6);
1745
+ ASSERT_EQ(new_cf_opt.compression_opts.max_dict_bytes, 7u);
1746
+ ASSERT_EQ(new_cf_opt.compression_opts.zstd_max_train_bytes, 8u);
1747
+ ASSERT_EQ(new_cf_opt.compression_opts.parallel_threads,
1748
+ CompressionOptions().parallel_threads);
1749
+ ASSERT_EQ(new_cf_opt.compression_opts.enabled, true);
1750
+ ASSERT_EQ(new_cf_opt.bottommost_compression, kLZ4Compression);
1751
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.window_bits, 5);
1752
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.level, 6);
1753
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.strategy, 7);
1754
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.max_dict_bytes, 8u);
1755
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.zstd_max_train_bytes, 9u);
1756
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.parallel_threads,
1757
+ CompressionOptions().parallel_threads);
1758
+ ASSERT_EQ(new_cf_opt.bottommost_compression_opts.enabled, true);
1759
+ ASSERT_EQ(new_cf_opt.num_levels, 8);
1760
+ ASSERT_EQ(new_cf_opt.level0_file_num_compaction_trigger, 8);
1761
+ ASSERT_EQ(new_cf_opt.level0_slowdown_writes_trigger, 9);
1762
+ ASSERT_EQ(new_cf_opt.level0_stop_writes_trigger, 10);
1763
+ ASSERT_EQ(new_cf_opt.target_file_size_base, static_cast<uint64_t>(12));
1764
+ ASSERT_EQ(new_cf_opt.target_file_size_multiplier, 13);
1765
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_base, 14U);
1766
+ ASSERT_EQ(new_cf_opt.level_compaction_dynamic_level_bytes, true);
1767
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier, 15.0);
1768
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional.size(), 3U);
1769
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[0], 16);
1770
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[1], 17);
1771
+ ASSERT_EQ(new_cf_opt.max_bytes_for_level_multiplier_additional[2], 18);
1772
+ ASSERT_EQ(new_cf_opt.max_compaction_bytes, 21);
1773
+ ASSERT_EQ(new_cf_opt.hard_pending_compaction_bytes_limit, 211);
1774
+ ASSERT_EQ(new_cf_opt.arena_block_size, 22U);
1775
+ ASSERT_EQ(new_cf_opt.disable_auto_compactions, true);
1776
+ ASSERT_EQ(new_cf_opt.compaction_style, kCompactionStyleLevel);
1777
+ ASSERT_EQ(new_cf_opt.compaction_pri, kOldestSmallestSeqFirst);
1778
+ ASSERT_EQ(new_cf_opt.compaction_options_fifo.max_table_files_size,
1779
+ static_cast<uint64_t>(23));
1780
+ ASSERT_EQ(new_cf_opt.max_sequential_skip_in_iterations,
1781
+ static_cast<uint64_t>(24));
1782
+ ASSERT_EQ(new_cf_opt.inplace_update_support, true);
1783
+ ASSERT_EQ(new_cf_opt.inplace_update_num_locks, 25U);
1784
+ ASSERT_EQ(new_cf_opt.memtable_prefix_bloom_size_ratio, 0.26);
1785
+ ASSERT_EQ(new_cf_opt.memtable_whole_key_filtering, true);
1786
+ ASSERT_EQ(new_cf_opt.memtable_huge_page_size, 28U);
1787
+ ASSERT_EQ(new_cf_opt.bloom_locality, 29U);
1788
+ ASSERT_EQ(new_cf_opt.max_successive_merges, 30U);
1789
+ ASSERT_TRUE(new_cf_opt.prefix_extractor != nullptr);
1790
+ 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");
1793
+ ASSERT_EQ(new_cf_opt.enable_blob_files, true);
1794
+ ASSERT_EQ(new_cf_opt.min_blob_size, 1ULL << 10);
1795
+ ASSERT_EQ(new_cf_opt.blob_file_size, 1ULL << 30);
1796
+ ASSERT_EQ(new_cf_opt.blob_compression_type, kZSTD);
1797
+ ASSERT_EQ(new_cf_opt.enable_blob_garbage_collection, true);
1798
+ ASSERT_EQ(new_cf_opt.blob_garbage_collection_age_cutoff, 0.5);
1799
+
1800
+ cf_options_map["write_buffer_size"] = "hello";
1801
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1802
+ base_cf_opt, cf_options_map, &new_cf_opt));
1803
+ ConfigOptions exact, loose;
1804
+ exact.sanity_level = ConfigOptions::kSanityLevelExactMatch;
1805
+ loose.sanity_level = ConfigOptions::kSanityLevelLooselyCompatible;
1806
+
1807
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1808
+
1809
+ cf_options_map["write_buffer_size"] = "1";
1810
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1811
+ base_cf_opt, cf_options_map, &new_cf_opt));
1812
+
1813
+ cf_options_map["unknown_option"] = "1";
1814
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1815
+ base_cf_opt, cf_options_map, &new_cf_opt));
1816
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1817
+
1818
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(base_cf_opt, cf_options_map,
1819
+ &new_cf_opt,
1820
+ false, /* input_strings_escaped */
1821
+ true /* ignore_unknown_options */));
1822
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
1823
+ loose, base_cf_opt, new_cf_opt, nullptr /* new_opt_map */));
1824
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
1825
+ exact /* default for VerifyCFOptions */, base_cf_opt, new_cf_opt, nullptr));
1826
+
1827
+ DBOptions base_db_opt;
1828
+ DBOptions new_db_opt;
1829
+ ASSERT_OK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt));
1830
+ ASSERT_EQ(new_db_opt.create_if_missing, false);
1831
+ ASSERT_EQ(new_db_opt.create_missing_column_families, true);
1832
+ ASSERT_EQ(new_db_opt.error_if_exists, false);
1833
+ ASSERT_EQ(new_db_opt.paranoid_checks, true);
1834
+ ASSERT_EQ(new_db_opt.track_and_verify_wals_in_manifest, true);
1835
+ ASSERT_EQ(new_db_opt.max_open_files, 32);
1836
+ ASSERT_EQ(new_db_opt.max_total_wal_size, static_cast<uint64_t>(33));
1837
+ ASSERT_EQ(new_db_opt.use_fsync, true);
1838
+ ASSERT_EQ(new_db_opt.db_log_dir, "/db_log_dir");
1839
+ ASSERT_EQ(new_db_opt.wal_dir, "/wal_dir");
1840
+ ASSERT_EQ(new_db_opt.delete_obsolete_files_period_micros,
1841
+ static_cast<uint64_t>(34));
1842
+ ASSERT_EQ(new_db_opt.max_background_compactions, 35);
1843
+ ASSERT_EQ(new_db_opt.max_background_flushes, 36);
1844
+ ASSERT_EQ(new_db_opt.max_log_file_size, 37U);
1845
+ ASSERT_EQ(new_db_opt.log_file_time_to_roll, 38U);
1846
+ ASSERT_EQ(new_db_opt.keep_log_file_num, 39U);
1847
+ ASSERT_EQ(new_db_opt.recycle_log_file_num, 5U);
1848
+ ASSERT_EQ(new_db_opt.max_manifest_file_size, static_cast<uint64_t>(40));
1849
+ ASSERT_EQ(new_db_opt.table_cache_numshardbits, 41);
1850
+ ASSERT_EQ(new_db_opt.WAL_ttl_seconds, static_cast<uint64_t>(43));
1851
+ ASSERT_EQ(new_db_opt.WAL_size_limit_MB, static_cast<uint64_t>(44));
1852
+ ASSERT_EQ(new_db_opt.manifest_preallocation_size, 45U);
1853
+ ASSERT_EQ(new_db_opt.allow_mmap_reads, true);
1854
+ ASSERT_EQ(new_db_opt.allow_mmap_writes, false);
1855
+ ASSERT_EQ(new_db_opt.use_direct_reads, false);
1856
+ ASSERT_EQ(new_db_opt.use_direct_io_for_flush_and_compaction, false);
1857
+ ASSERT_EQ(new_db_opt.is_fd_close_on_exec, true);
1858
+ ASSERT_EQ(new_db_opt.skip_log_error_on_recovery, false);
1859
+ ASSERT_EQ(new_db_opt.stats_dump_period_sec, 46U);
1860
+ ASSERT_EQ(new_db_opt.stats_persist_period_sec, 57U);
1861
+ ASSERT_EQ(new_db_opt.persist_stats_to_disk, false);
1862
+ ASSERT_EQ(new_db_opt.stats_history_buffer_size, 69U);
1863
+ ASSERT_EQ(new_db_opt.advise_random_on_open, true);
1864
+ ASSERT_EQ(new_db_opt.use_adaptive_mutex, false);
1865
+ ASSERT_EQ(new_db_opt.new_table_reader_for_compaction_inputs, true);
1866
+ ASSERT_EQ(new_db_opt.compaction_readahead_size, 100);
1867
+ ASSERT_EQ(new_db_opt.random_access_max_buffer_size, 3145728);
1868
+ ASSERT_EQ(new_db_opt.writable_file_max_buffer_size, 314159);
1869
+ ASSERT_EQ(new_db_opt.bytes_per_sync, static_cast<uint64_t>(47));
1870
+ ASSERT_EQ(new_db_opt.wal_bytes_per_sync, static_cast<uint64_t>(48));
1871
+ ASSERT_EQ(new_db_opt.strict_bytes_per_sync, true);
1872
+
1873
+ db_options_map["max_open_files"] = "hello";
1874
+ ASSERT_NOK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt));
1875
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
1876
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(loose, base_db_opt, new_db_opt));
1877
+
1878
+ // unknow options should fail parsing without ignore_unknown_options = true
1879
+ db_options_map["unknown_db_option"] = "1";
1880
+ ASSERT_NOK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt));
1881
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
1882
+
1883
+ ASSERT_OK(GetDBOptionsFromMap(base_db_opt, db_options_map, &new_db_opt,
1884
+ false, /* input_strings_escaped */
1885
+ true /* ignore_unknown_options */));
1886
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(loose, base_db_opt, new_db_opt));
1887
+ ASSERT_NOK(RocksDBOptionsParser::VerifyDBOptions(exact, base_db_opt, new_db_opt));
1888
+ }
1889
+
1890
+ TEST_F(OptionsOldApiTest, GetColumnFamilyOptionsFromStringTest) {
1891
+ ColumnFamilyOptions base_cf_opt;
1892
+ ColumnFamilyOptions new_cf_opt;
1893
+ base_cf_opt.table_factory.reset();
1894
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt, "", &new_cf_opt));
1895
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1896
+ "write_buffer_size=5", &new_cf_opt));
1897
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 5U);
1898
+ ASSERT_TRUE(new_cf_opt.table_factory == nullptr);
1899
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1900
+ "write_buffer_size=6;", &new_cf_opt));
1901
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 6U);
1902
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1903
+ " write_buffer_size = 7 ", &new_cf_opt));
1904
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 7U);
1905
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1906
+ " write_buffer_size = 8 ; ", &new_cf_opt));
1907
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 8U);
1908
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1909
+ "write_buffer_size=9;max_write_buffer_number=10", &new_cf_opt));
1910
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 9U);
1911
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 10);
1912
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1913
+ "write_buffer_size=11; max_write_buffer_number = 12 ;",
1914
+ &new_cf_opt));
1915
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 11U);
1916
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 12);
1917
+ // Wrong name "max_write_buffer_number_"
1918
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
1919
+ "write_buffer_size=13;max_write_buffer_number_=14;",
1920
+ &new_cf_opt));
1921
+ ConfigOptions exact;
1922
+ exact.sanity_level = ConfigOptions::kSanityLevelExactMatch;
1923
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1924
+
1925
+ // Comparator from object registry
1926
+ std::string kCompName = "reverse_comp";
1927
+ ObjectLibrary::Default()->Register<const Comparator>(
1928
+ kCompName,
1929
+ [](const std::string& /*name*/,
1930
+ std::unique_ptr<const Comparator>* /*guard*/,
1931
+ std::string* /* errmsg */) { return ReverseBytewiseComparator(); });
1932
+
1933
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1934
+ base_cf_opt, "comparator=" + kCompName + ";", &new_cf_opt));
1935
+ ASSERT_EQ(new_cf_opt.comparator, ReverseBytewiseComparator());
1936
+
1937
+ // MergeOperator from object registry
1938
+ std::unique_ptr<BytesXOROperator> bxo(new BytesXOROperator());
1939
+ 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
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1949
+ base_cf_opt, "merge_operator=" + kMoName + ";", &new_cf_opt));
1950
+ ASSERT_EQ(kMoName, std::string(new_cf_opt.merge_operator->Name()));
1951
+
1952
+ // Wrong key/value pair
1953
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
1954
+ "write_buffer_size=13;max_write_buffer_number;", &new_cf_opt));
1955
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1956
+
1957
+ // Error Paring value
1958
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
1959
+ "write_buffer_size=13;max_write_buffer_number=;", &new_cf_opt));
1960
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1961
+
1962
+ // Missing option name
1963
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
1964
+ "write_buffer_size=13; =100;", &new_cf_opt));
1965
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
1966
+
1967
+ const uint64_t kilo = 1024UL;
1968
+ const uint64_t mega = 1024 * kilo;
1969
+ const uint64_t giga = 1024 * mega;
1970
+ const uint64_t tera = 1024 * giga;
1971
+
1972
+ // Units (k)
1973
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1974
+ base_cf_opt, "max_write_buffer_number=15K", &new_cf_opt));
1975
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 15 * kilo);
1976
+ // Units (m)
1977
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1978
+ "max_write_buffer_number=16m;inplace_update_num_locks=17M",
1979
+ &new_cf_opt));
1980
+ ASSERT_EQ(new_cf_opt.max_write_buffer_number, 16 * mega);
1981
+ ASSERT_EQ(new_cf_opt.inplace_update_num_locks, 17u * mega);
1982
+ // Units (g)
1983
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
1984
+ base_cf_opt,
1985
+ "write_buffer_size=18g;prefix_extractor=capped:8;"
1986
+ "arena_block_size=19G",
1987
+ &new_cf_opt));
1988
+
1989
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 18 * giga);
1990
+ ASSERT_EQ(new_cf_opt.arena_block_size, 19 * giga);
1991
+ 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");
1994
+
1995
+ // Units (t)
1996
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
1997
+ "write_buffer_size=20t;arena_block_size=21T", &new_cf_opt));
1998
+ ASSERT_EQ(new_cf_opt.write_buffer_size, 20 * tera);
1999
+ ASSERT_EQ(new_cf_opt.arena_block_size, 21 * tera);
2000
+
2001
+ // Nested block based table options
2002
+ // Empty
2003
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2004
+ "write_buffer_size=10;max_write_buffer_number=16;"
2005
+ "block_based_table_factory={};arena_block_size=1024",
2006
+ &new_cf_opt));
2007
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
2008
+ // Non-empty
2009
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2010
+ "write_buffer_size=10;max_write_buffer_number=16;"
2011
+ "block_based_table_factory={block_cache=1M;block_size=4;};"
2012
+ "arena_block_size=1024",
2013
+ &new_cf_opt));
2014
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
2015
+ // Last one
2016
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2017
+ "write_buffer_size=10;max_write_buffer_number=16;"
2018
+ "block_based_table_factory={block_cache=1M;block_size=4;}",
2019
+ &new_cf_opt));
2020
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
2021
+ // Mismatch curly braces
2022
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2023
+ "write_buffer_size=10;max_write_buffer_number=16;"
2024
+ "block_based_table_factory={{{block_size=4;};"
2025
+ "arena_block_size=1024",
2026
+ &new_cf_opt));
2027
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2028
+
2029
+ // Unexpected chars after closing curly brace
2030
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2031
+ "write_buffer_size=10;max_write_buffer_number=16;"
2032
+ "block_based_table_factory={block_size=4;}};"
2033
+ "arena_block_size=1024",
2034
+ &new_cf_opt));
2035
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2036
+
2037
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2038
+ "write_buffer_size=10;max_write_buffer_number=16;"
2039
+ "block_based_table_factory={block_size=4;}xdfa;"
2040
+ "arena_block_size=1024",
2041
+ &new_cf_opt));
2042
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2043
+
2044
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2045
+ "write_buffer_size=10;max_write_buffer_number=16;"
2046
+ "block_based_table_factory={block_size=4;}xdfa",
2047
+ &new_cf_opt));
2048
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2049
+
2050
+ // Invalid block based table option
2051
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2052
+ "write_buffer_size=10;max_write_buffer_number=16;"
2053
+ "block_based_table_factory={xx_block_size=4;}",
2054
+ &new_cf_opt));
2055
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2056
+
2057
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2058
+ "optimize_filters_for_hits=true",
2059
+ &new_cf_opt));
2060
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2061
+ "optimize_filters_for_hits=false",
2062
+ &new_cf_opt));
2063
+
2064
+ ASSERT_NOK(GetColumnFamilyOptionsFromString(base_cf_opt,
2065
+ "optimize_filters_for_hits=junk",
2066
+ &new_cf_opt));
2067
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(exact, base_cf_opt, new_cf_opt));
2068
+
2069
+ // Nested plain table options
2070
+ // Empty
2071
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2072
+ "write_buffer_size=10;max_write_buffer_number=16;"
2073
+ "plain_table_factory={};arena_block_size=1024",
2074
+ &new_cf_opt));
2075
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
2076
+ ASSERT_EQ(std::string(new_cf_opt.table_factory->Name()), "PlainTable");
2077
+ // Non-empty
2078
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2079
+ "write_buffer_size=10;max_write_buffer_number=16;"
2080
+ "plain_table_factory={user_key_len=66;bloom_bits_per_key=20;};"
2081
+ "arena_block_size=1024",
2082
+ &new_cf_opt));
2083
+ ASSERT_TRUE(new_cf_opt.table_factory != nullptr);
2084
+ ASSERT_EQ(std::string(new_cf_opt.table_factory->Name()), "PlainTable");
2085
+
2086
+ // memtable factory
2087
+ ASSERT_OK(GetColumnFamilyOptionsFromString(base_cf_opt,
2088
+ "write_buffer_size=10;max_write_buffer_number=16;"
2089
+ "memtable=skip_list:10;arena_block_size=1024",
2090
+ &new_cf_opt));
2091
+ ASSERT_TRUE(new_cf_opt.memtable_factory != nullptr);
2092
+ ASSERT_EQ(std::string(new_cf_opt.memtable_factory->Name()), "SkipListFactory");
2093
+ }
2094
+
2095
+ TEST_F(OptionsOldApiTest, GetBlockBasedTableOptionsFromString) {
2096
+ BlockBasedTableOptions table_opt;
2097
+ BlockBasedTableOptions new_opt;
2098
+ // make sure default values are overwritten by something else
2099
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
2100
+ table_opt,
2101
+ "cache_index_and_filter_blocks=1;index_type=kHashSearch;"
2102
+ "checksum=kxxHash;hash_index_allow_collision=1;no_block_cache=1;"
2103
+ "block_cache=1M;block_cache_compressed=1k;block_size=1024;"
2104
+ "block_size_deviation=8;block_restart_interval=4;"
2105
+ "format_version=5;whole_key_filtering=1;"
2106
+ "filter_policy=bloomfilter:4.567:false;",
2107
+ &new_opt));
2108
+ ASSERT_TRUE(new_opt.cache_index_and_filter_blocks);
2109
+ ASSERT_EQ(new_opt.index_type, BlockBasedTableOptions::kHashSearch);
2110
+ ASSERT_EQ(new_opt.checksum, ChecksumType::kxxHash);
2111
+ ASSERT_TRUE(new_opt.hash_index_allow_collision);
2112
+ ASSERT_TRUE(new_opt.no_block_cache);
2113
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
2114
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
2115
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
2116
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL);
2117
+ ASSERT_EQ(new_opt.block_size, 1024UL);
2118
+ ASSERT_EQ(new_opt.block_size_deviation, 8);
2119
+ ASSERT_EQ(new_opt.block_restart_interval, 4);
2120
+ ASSERT_EQ(new_opt.format_version, 5U);
2121
+ ASSERT_EQ(new_opt.whole_key_filtering, true);
2122
+ 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);
2127
+
2128
+ // unknown option
2129
+ ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
2130
+ "cache_index_and_filter_blocks=1;index_type=kBinarySearch;"
2131
+ "bad_option=1",
2132
+ &new_opt));
2133
+ ASSERT_EQ(static_cast<bool>(table_opt.cache_index_and_filter_blocks),
2134
+ new_opt.cache_index_and_filter_blocks);
2135
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
2136
+
2137
+ // unrecognized index type
2138
+ ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
2139
+ "cache_index_and_filter_blocks=1;index_type=kBinarySearchXX",
2140
+ &new_opt));
2141
+ ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
2142
+ new_opt.cache_index_and_filter_blocks);
2143
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
2144
+
2145
+ // unrecognized checksum type
2146
+ ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
2147
+ "cache_index_and_filter_blocks=1;checksum=kxxHashXX",
2148
+ &new_opt));
2149
+ ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
2150
+ new_opt.cache_index_and_filter_blocks);
2151
+ ASSERT_EQ(table_opt.index_type, new_opt.index_type);
2152
+
2153
+ // unrecognized filter policy name
2154
+ ASSERT_NOK(GetBlockBasedTableOptionsFromString(table_opt,
2155
+ "cache_index_and_filter_blocks=1;"
2156
+ "filter_policy=bloomfilterxx:4:true",
2157
+ &new_opt));
2158
+ ASSERT_EQ(table_opt.cache_index_and_filter_blocks,
2159
+ new_opt.cache_index_and_filter_blocks);
2160
+ ASSERT_EQ(table_opt.filter_policy, new_opt.filter_policy);
2161
+
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);
2170
+
2171
+ // Check block cache options are overwritten when specified
2172
+ // in new format as a struct.
2173
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(table_opt,
2174
+ "block_cache={capacity=1M;num_shard_bits=4;"
2175
+ "strict_capacity_limit=true;high_pri_pool_ratio=0.5;};"
2176
+ "block_cache_compressed={capacity=1M;num_shard_bits=4;"
2177
+ "strict_capacity_limit=true;high_pri_pool_ratio=0.5;}",
2178
+ &new_opt));
2179
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
2180
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
2181
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2182
+ new_opt.block_cache)->GetNumShardBits(), 4);
2183
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), true);
2184
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
2185
+ new_opt.block_cache)->GetHighPriPoolRatio(), 0.5);
2186
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
2187
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL*1024UL);
2188
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2189
+ new_opt.block_cache_compressed)->GetNumShardBits(), 4);
2190
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), true);
2191
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
2192
+ new_opt.block_cache_compressed)->GetHighPriPoolRatio(),
2193
+ 0.5);
2194
+
2195
+ // Set only block cache capacity. Check other values are
2196
+ // reset to default values.
2197
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(table_opt,
2198
+ "block_cache={capacity=2M};"
2199
+ "block_cache_compressed={capacity=2M}",
2200
+ &new_opt));
2201
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
2202
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 2*1024UL*1024UL);
2203
+ // Default values
2204
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2205
+ new_opt.block_cache)->GetNumShardBits(),
2206
+ GetDefaultCacheShardBits(new_opt.block_cache->GetCapacity()));
2207
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), false);
2208
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache)
2209
+ ->GetHighPriPoolRatio(),
2210
+ 0.5);
2211
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
2212
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 2*1024UL*1024UL);
2213
+ // Default values
2214
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2215
+ new_opt.block_cache_compressed)->GetNumShardBits(),
2216
+ GetDefaultCacheShardBits(
2217
+ new_opt.block_cache_compressed->GetCapacity()));
2218
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), false);
2219
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
2220
+ ->GetHighPriPoolRatio(),
2221
+ 0.5);
2222
+
2223
+ // Set couple of block cache options.
2224
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(
2225
+ table_opt,
2226
+ "block_cache={num_shard_bits=5;high_pri_pool_ratio=0.5;};"
2227
+ "block_cache_compressed={num_shard_bits=5;"
2228
+ "high_pri_pool_ratio=0.0;}",
2229
+ &new_opt));
2230
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 0);
2231
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2232
+ new_opt.block_cache)->GetNumShardBits(), 5);
2233
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), false);
2234
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(
2235
+ new_opt.block_cache)->GetHighPriPoolRatio(), 0.5);
2236
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
2237
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 0);
2238
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2239
+ new_opt.block_cache_compressed)->GetNumShardBits(), 5);
2240
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), false);
2241
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
2242
+ ->GetHighPriPoolRatio(),
2243
+ 0.0);
2244
+
2245
+ // Set couple of block cache options.
2246
+ ASSERT_OK(GetBlockBasedTableOptionsFromString(table_opt,
2247
+ "block_cache={capacity=1M;num_shard_bits=4;"
2248
+ "strict_capacity_limit=true;};"
2249
+ "block_cache_compressed={capacity=1M;num_shard_bits=4;"
2250
+ "strict_capacity_limit=true;}",
2251
+ &new_opt));
2252
+ ASSERT_TRUE(new_opt.block_cache != nullptr);
2253
+ ASSERT_EQ(new_opt.block_cache->GetCapacity(), 1024UL*1024UL);
2254
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2255
+ new_opt.block_cache)->GetNumShardBits(), 4);
2256
+ ASSERT_EQ(new_opt.block_cache->HasStrictCapacityLimit(), true);
2257
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache)
2258
+ ->GetHighPriPoolRatio(),
2259
+ 0.5);
2260
+ ASSERT_TRUE(new_opt.block_cache_compressed != nullptr);
2261
+ ASSERT_EQ(new_opt.block_cache_compressed->GetCapacity(), 1024UL*1024UL);
2262
+ ASSERT_EQ(std::dynamic_pointer_cast<ShardedCache>(
2263
+ new_opt.block_cache_compressed)->GetNumShardBits(), 4);
2264
+ ASSERT_EQ(new_opt.block_cache_compressed->HasStrictCapacityLimit(), true);
2265
+ ASSERT_EQ(std::dynamic_pointer_cast<LRUCache>(new_opt.block_cache_compressed)
2266
+ ->GetHighPriPoolRatio(),
2267
+ 0.5);
2268
+ }
2269
+
2270
+ TEST_F(OptionsOldApiTest, GetPlainTableOptionsFromString) {
2271
+ PlainTableOptions table_opt;
2272
+ PlainTableOptions new_opt;
2273
+ // make sure default values are overwritten by something else
2274
+ ASSERT_OK(GetPlainTableOptionsFromString(table_opt,
2275
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
2276
+ "index_sparseness=8;huge_page_tlb_size=4;encoding_type=kPrefix;"
2277
+ "full_scan_mode=true;store_index_in_file=true",
2278
+ &new_opt));
2279
+ ASSERT_EQ(new_opt.user_key_len, 66u);
2280
+ ASSERT_EQ(new_opt.bloom_bits_per_key, 20);
2281
+ ASSERT_EQ(new_opt.hash_table_ratio, 0.5);
2282
+ ASSERT_EQ(new_opt.index_sparseness, 8);
2283
+ ASSERT_EQ(new_opt.huge_page_tlb_size, 4);
2284
+ ASSERT_EQ(new_opt.encoding_type, EncodingType::kPrefix);
2285
+ ASSERT_TRUE(new_opt.full_scan_mode);
2286
+ ASSERT_TRUE(new_opt.store_index_in_file);
2287
+
2288
+ // unknown option
2289
+ ASSERT_NOK(GetPlainTableOptionsFromString(table_opt,
2290
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
2291
+ "bad_option=1",
2292
+ &new_opt));
2293
+
2294
+ // unrecognized EncodingType
2295
+ ASSERT_NOK(GetPlainTableOptionsFromString(table_opt,
2296
+ "user_key_len=66;bloom_bits_per_key=20;hash_table_ratio=0.5;"
2297
+ "encoding_type=kPrefixXX",
2298
+ &new_opt));
2299
+ }
2300
+
2301
+ TEST_F(OptionsOldApiTest, GetOptionsFromStringTest) {
2302
+ Options base_options, new_options;
2303
+ base_options.write_buffer_size = 20;
2304
+ base_options.min_write_buffer_number_to_merge = 15;
2305
+ BlockBasedTableOptions block_based_table_options;
2306
+ block_based_table_options.cache_index_and_filter_blocks = true;
2307
+ base_options.table_factory.reset(
2308
+ NewBlockBasedTableFactory(block_based_table_options));
2309
+
2310
+ // 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,
2319
+ [](const std::string& /*name*/, std::unique_ptr<Env>* /*env_guard*/,
2320
+ std::string* /* errmsg */) {
2321
+ static CustomEnv env(Env::Default());
2322
+ return &env;
2323
+ });
2324
+
2325
+ ASSERT_OK(GetOptionsFromString(
2326
+ base_options,
2327
+ "write_buffer_size=10;max_write_buffer_number=16;"
2328
+ "block_based_table_factory={block_cache=1M;block_size=4;};"
2329
+ "compression_opts=4:5:6;create_if_missing=true;max_open_files=1;"
2330
+ "bottommost_compression_opts=5:6:7;create_if_missing=true;max_open_files="
2331
+ "1;"
2332
+ "rate_limiter_bytes_per_sec=1024;env=CustomEnv",
2333
+ &new_options));
2334
+
2335
+ ASSERT_EQ(new_options.compression_opts.window_bits, 4);
2336
+ ASSERT_EQ(new_options.compression_opts.level, 5);
2337
+ ASSERT_EQ(new_options.compression_opts.strategy, 6);
2338
+ ASSERT_EQ(new_options.compression_opts.max_dict_bytes, 0u);
2339
+ ASSERT_EQ(new_options.compression_opts.zstd_max_train_bytes, 0u);
2340
+ ASSERT_EQ(new_options.compression_opts.parallel_threads, 1u);
2341
+ ASSERT_EQ(new_options.compression_opts.enabled, false);
2342
+ ASSERT_EQ(new_options.bottommost_compression, kDisableCompressionOption);
2343
+ ASSERT_EQ(new_options.bottommost_compression_opts.window_bits, 5);
2344
+ ASSERT_EQ(new_options.bottommost_compression_opts.level, 6);
2345
+ ASSERT_EQ(new_options.bottommost_compression_opts.strategy, 7);
2346
+ ASSERT_EQ(new_options.bottommost_compression_opts.max_dict_bytes, 0u);
2347
+ ASSERT_EQ(new_options.bottommost_compression_opts.zstd_max_train_bytes, 0u);
2348
+ ASSERT_EQ(new_options.bottommost_compression_opts.parallel_threads, 1u);
2349
+ ASSERT_EQ(new_options.bottommost_compression_opts.enabled, false);
2350
+ ASSERT_EQ(new_options.write_buffer_size, 10U);
2351
+ ASSERT_EQ(new_options.max_write_buffer_number, 16);
2352
+
2353
+ auto new_block_based_table_options =
2354
+ new_options.table_factory->GetOptions<BlockBasedTableOptions>();
2355
+ ASSERT_NE(new_block_based_table_options, nullptr);
2356
+ ASSERT_EQ(new_block_based_table_options->block_cache->GetCapacity(),
2357
+ 1U << 20);
2358
+ ASSERT_EQ(new_block_based_table_options->block_size, 4U);
2359
+ // don't overwrite block based table options
2360
+ ASSERT_TRUE(new_block_based_table_options->cache_index_and_filter_blocks);
2361
+
2362
+ ASSERT_EQ(new_options.create_if_missing, true);
2363
+ ASSERT_EQ(new_options.max_open_files, 1);
2364
+ ASSERT_TRUE(new_options.rate_limiter.get() != nullptr);
2365
+ Env* newEnv = new_options.env;
2366
+ ASSERT_OK(Env::LoadEnv(kCustomEnvName, &newEnv));
2367
+ ASSERT_EQ(newEnv, new_options.env);
2368
+ }
2369
+
2370
+ TEST_F(OptionsOldApiTest, DBOptionsSerialization) {
2371
+ Options base_options, new_options;
2372
+ Random rnd(301);
2373
+
2374
+ // Phase 1: Make big change in base_options
2375
+ test::RandomInitDBOptions(&base_options, &rnd);
2376
+
2377
+ // Phase 2: obtain a string from base_option
2378
+ std::string base_options_file_content;
2379
+ ASSERT_OK(GetStringFromDBOptions(&base_options_file_content, base_options));
2380
+
2381
+ // Phase 3: Set new_options from the derived string and expect
2382
+ // new_options == base_options
2383
+ ASSERT_OK(GetDBOptionsFromString(DBOptions(), base_options_file_content,
2384
+ &new_options));
2385
+ ConfigOptions config_options;
2386
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(config_options, base_options, new_options));
2387
+ }
2388
+
2389
+ TEST_F(OptionsOldApiTest, ColumnFamilyOptionsSerialization) {
2390
+ Options options;
2391
+ ColumnFamilyOptions base_opt, new_opt;
2392
+ Random rnd(302);
2393
+ // Phase 1: randomly assign base_opt
2394
+ // custom type options
2395
+ test::RandomInitCFOptions(&base_opt, options, &rnd);
2396
+
2397
+ // Phase 2: obtain a string from base_opt
2398
+ std::string base_options_file_content;
2399
+ ASSERT_OK(
2400
+ GetStringFromColumnFamilyOptions(&base_options_file_content, base_opt));
2401
+
2402
+ // Phase 3: Set new_opt from the derived string and expect
2403
+ // new_opt == base_opt
2404
+ ASSERT_OK(GetColumnFamilyOptionsFromString(
2405
+ ColumnFamilyOptions(), base_options_file_content, &new_opt));
2406
+ ConfigOptions config_options;
2407
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, base_opt, new_opt));
2408
+ if (base_opt.compaction_filter) {
2409
+ delete base_opt.compaction_filter;
2410
+ }
2411
+ }
2412
+ #endif // !ROCKSDB_LITE
2413
+
2414
+ #ifndef ROCKSDB_LITE
2415
+ class OptionsParserTest : public testing::Test {
2416
+ public:
2417
+ OptionsParserTest() { fs_.reset(new test::StringFS(FileSystem::Default())); }
2418
+
2419
+ protected:
2420
+ std::shared_ptr<test::StringFS> fs_;
2421
+ };
2422
+
2423
+ TEST_F(OptionsParserTest, Comment) {
2424
+ DBOptions db_opt;
2425
+ db_opt.max_open_files = 12345;
2426
+ db_opt.max_background_flushes = 301;
2427
+ db_opt.max_total_wal_size = 1024;
2428
+ ColumnFamilyOptions cf_opt;
2429
+
2430
+ std::string options_file_content =
2431
+ "# This is a testing option string.\n"
2432
+ "# Currently we only support \"#\" styled comment.\n"
2433
+ "\n"
2434
+ "[Version]\n"
2435
+ " rocksdb_version=3.14.0\n"
2436
+ " options_file_version=1\n"
2437
+ "[ DBOptions ]\n"
2438
+ " # note that we don't support space around \"=\"\n"
2439
+ " max_open_files=12345;\n"
2440
+ " max_background_flushes=301 # comment after a statement is fine\n"
2441
+ " # max_background_flushes=1000 # this line would be ignored\n"
2442
+ " # max_background_compactions=2000 # so does this one\n"
2443
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2444
+ "[CFOptions \"default\"] # column family must be specified\n"
2445
+ " # in the correct order\n"
2446
+ " # if a section is blank, we will use the default\n";
2447
+
2448
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2449
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2450
+ RocksDBOptionsParser parser;
2451
+ ASSERT_OK(
2452
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2453
+
2454
+ ConfigOptions exact;
2455
+ exact.input_strings_escaped = false;
2456
+ exact.sanity_level = ConfigOptions::kSanityLevelExactMatch;
2457
+ ASSERT_OK(
2458
+ RocksDBOptionsParser::VerifyDBOptions(exact, *parser.db_opt(), db_opt));
2459
+ ASSERT_EQ(parser.NumColumnFamilies(), 1U);
2460
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2461
+ exact, *parser.GetCFOptions("default"), cf_opt));
2462
+ }
2463
+
2464
+ TEST_F(OptionsParserTest, ExtraSpace) {
2465
+ std::string options_file_content =
2466
+ "# This is a testing option string.\n"
2467
+ "# Currently we only support \"#\" styled comment.\n"
2468
+ "\n"
2469
+ "[ Version ]\n"
2470
+ " rocksdb_version = 3.14.0 \n"
2471
+ " options_file_version=1 # some comment\n"
2472
+ "[DBOptions ] # some comment\n"
2473
+ "max_open_files=12345 \n"
2474
+ " max_background_flushes = 301 \n"
2475
+ " max_total_wal_size = 1024 # keep_log_file_num=1000\n"
2476
+ " [CFOptions \"default\" ]\n"
2477
+ " # if a section is blank, we will use the default\n";
2478
+
2479
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2480
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2481
+ RocksDBOptionsParser parser;
2482
+ ASSERT_OK(
2483
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2484
+ }
2485
+
2486
+ TEST_F(OptionsParserTest, MissingDBOptions) {
2487
+ std::string options_file_content =
2488
+ "# This is a testing option string.\n"
2489
+ "# Currently we only support \"#\" styled comment.\n"
2490
+ "\n"
2491
+ "[Version]\n"
2492
+ " rocksdb_version=3.14.0\n"
2493
+ " options_file_version=1\n"
2494
+ "[CFOptions \"default\"]\n"
2495
+ " # if a section is blank, we will use the default\n";
2496
+
2497
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2498
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2499
+ RocksDBOptionsParser parser;
2500
+ ASSERT_NOK(
2501
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2502
+ ;
2503
+ }
2504
+
2505
+ TEST_F(OptionsParserTest, DoubleDBOptions) {
2506
+ DBOptions db_opt;
2507
+ db_opt.max_open_files = 12345;
2508
+ db_opt.max_background_flushes = 301;
2509
+ db_opt.max_total_wal_size = 1024;
2510
+ ColumnFamilyOptions cf_opt;
2511
+
2512
+ std::string options_file_content =
2513
+ "# This is a testing option string.\n"
2514
+ "# Currently we only support \"#\" styled comment.\n"
2515
+ "\n"
2516
+ "[Version]\n"
2517
+ " rocksdb_version=3.14.0\n"
2518
+ " options_file_version=1\n"
2519
+ "[DBOptions]\n"
2520
+ " max_open_files=12345\n"
2521
+ " max_background_flushes=301\n"
2522
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2523
+ "[DBOptions]\n"
2524
+ "[CFOptions \"default\"]\n"
2525
+ " # if a section is blank, we will use the default\n";
2526
+
2527
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2528
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2529
+ RocksDBOptionsParser parser;
2530
+ ASSERT_NOK(
2531
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2532
+ }
2533
+
2534
+ TEST_F(OptionsParserTest, NoDefaultCFOptions) {
2535
+ DBOptions db_opt;
2536
+ db_opt.max_open_files = 12345;
2537
+ db_opt.max_background_flushes = 301;
2538
+ db_opt.max_total_wal_size = 1024;
2539
+ ColumnFamilyOptions cf_opt;
2540
+
2541
+ std::string options_file_content =
2542
+ "# This is a testing option string.\n"
2543
+ "# Currently we only support \"#\" styled comment.\n"
2544
+ "\n"
2545
+ "[Version]\n"
2546
+ " rocksdb_version=3.14.0\n"
2547
+ " options_file_version=1\n"
2548
+ "[DBOptions]\n"
2549
+ " max_open_files=12345\n"
2550
+ " max_background_flushes=301\n"
2551
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2552
+ "[CFOptions \"something_else\"]\n"
2553
+ " # if a section is blank, we will use the default\n";
2554
+
2555
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2556
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2557
+ RocksDBOptionsParser parser;
2558
+ ASSERT_NOK(
2559
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2560
+ }
2561
+
2562
+ TEST_F(OptionsParserTest, DefaultCFOptionsMustBeTheFirst) {
2563
+ DBOptions db_opt;
2564
+ db_opt.max_open_files = 12345;
2565
+ db_opt.max_background_flushes = 301;
2566
+ db_opt.max_total_wal_size = 1024;
2567
+ ColumnFamilyOptions cf_opt;
2568
+
2569
+ std::string options_file_content =
2570
+ "# This is a testing option string.\n"
2571
+ "# Currently we only support \"#\" styled comment.\n"
2572
+ "\n"
2573
+ "[Version]\n"
2574
+ " rocksdb_version=3.14.0\n"
2575
+ " options_file_version=1\n"
2576
+ "[DBOptions]\n"
2577
+ " max_open_files=12345\n"
2578
+ " max_background_flushes=301\n"
2579
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2580
+ "[CFOptions \"something_else\"]\n"
2581
+ " # if a section is blank, we will use the default\n"
2582
+ "[CFOptions \"default\"]\n"
2583
+ " # if a section is blank, we will use the default\n";
2584
+
2585
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2586
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2587
+ RocksDBOptionsParser parser;
2588
+ ASSERT_NOK(
2589
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2590
+ }
2591
+
2592
+ TEST_F(OptionsParserTest, DuplicateCFOptions) {
2593
+ DBOptions db_opt;
2594
+ db_opt.max_open_files = 12345;
2595
+ db_opt.max_background_flushes = 301;
2596
+ db_opt.max_total_wal_size = 1024;
2597
+ ColumnFamilyOptions cf_opt;
2598
+
2599
+ std::string options_file_content =
2600
+ "# This is a testing option string.\n"
2601
+ "# Currently we only support \"#\" styled comment.\n"
2602
+ "\n"
2603
+ "[Version]\n"
2604
+ " rocksdb_version=3.14.0\n"
2605
+ " options_file_version=1\n"
2606
+ "[DBOptions]\n"
2607
+ " max_open_files=12345\n"
2608
+ " max_background_flushes=301\n"
2609
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2610
+ "[CFOptions \"default\"]\n"
2611
+ "[CFOptions \"something_else\"]\n"
2612
+ "[CFOptions \"something_else\"]\n";
2613
+
2614
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2615
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2616
+ RocksDBOptionsParser parser;
2617
+ ASSERT_NOK(
2618
+ parser.Parse(kTestFileName, fs_.get(), false, 4096 /* readahead_size */));
2619
+ }
2620
+
2621
+ TEST_F(OptionsParserTest, IgnoreUnknownOptions) {
2622
+ for (int case_id = 0; case_id < 5; case_id++) {
2623
+ DBOptions db_opt;
2624
+ db_opt.max_open_files = 12345;
2625
+ db_opt.max_background_flushes = 301;
2626
+ db_opt.max_total_wal_size = 1024;
2627
+ ColumnFamilyOptions cf_opt;
2628
+
2629
+ std::string version_string;
2630
+ bool should_ignore = true;
2631
+ if (case_id == 0) {
2632
+ // same version
2633
+ should_ignore = false;
2634
+ version_string =
2635
+ ToString(ROCKSDB_MAJOR) + "." + ToString(ROCKSDB_MINOR) + ".0";
2636
+ } else if (case_id == 1) {
2637
+ // higher minor version
2638
+ should_ignore = true;
2639
+ version_string =
2640
+ ToString(ROCKSDB_MAJOR) + "." + ToString(ROCKSDB_MINOR + 1) + ".0";
2641
+ } else if (case_id == 2) {
2642
+ // higher major version.
2643
+ should_ignore = true;
2644
+ version_string = ToString(ROCKSDB_MAJOR + 1) + ".0.0";
2645
+ } else if (case_id == 3) {
2646
+ // lower minor version
2647
+ #if ROCKSDB_MINOR == 0
2648
+ continue;
2649
+ #else
2650
+ version_string =
2651
+ ToString(ROCKSDB_MAJOR) + "." + ToString(ROCKSDB_MINOR - 1) + ".0";
2652
+ should_ignore = false;
2653
+ #endif
2654
+ } else {
2655
+ // lower major version
2656
+ should_ignore = false;
2657
+ version_string =
2658
+ ToString(ROCKSDB_MAJOR - 1) + "." + ToString(ROCKSDB_MINOR) + ".0";
2659
+ }
2660
+
2661
+ std::string options_file_content =
2662
+ "# This is a testing option string.\n"
2663
+ "# Currently we only support \"#\" styled comment.\n"
2664
+ "\n"
2665
+ "[Version]\n"
2666
+ " rocksdb_version=" +
2667
+ version_string +
2668
+ "\n"
2669
+ " options_file_version=1\n"
2670
+ "[DBOptions]\n"
2671
+ " max_open_files=12345\n"
2672
+ " max_background_flushes=301\n"
2673
+ " max_total_wal_size=1024 # keep_log_file_num=1000\n"
2674
+ " unknown_db_option1=321\n"
2675
+ " unknown_db_option2=false\n"
2676
+ "[CFOptions \"default\"]\n"
2677
+ " unknown_cf_option1=hello\n"
2678
+ "[CFOptions \"something_else\"]\n"
2679
+ " unknown_cf_option2=world\n"
2680
+ " # if a section is blank, we will use the default\n";
2681
+
2682
+ const std::string kTestFileName = "test-rocksdb-options.ini";
2683
+ auto s = fs_->FileExists(kTestFileName, IOOptions(), nullptr);
2684
+ ASSERT_TRUE(s.ok() || s.IsNotFound());
2685
+ if (s.ok()) {
2686
+ ASSERT_OK(fs_->DeleteFile(kTestFileName, IOOptions(), nullptr));
2687
+ }
2688
+ ASSERT_OK(fs_->WriteToNewFile(kTestFileName, options_file_content));
2689
+ RocksDBOptionsParser parser;
2690
+ ASSERT_NOK(parser.Parse(kTestFileName, fs_.get(), false,
2691
+ 4096 /* readahead_size */));
2692
+ if (should_ignore) {
2693
+ ASSERT_OK(parser.Parse(kTestFileName, fs_.get(),
2694
+ true /* ignore_unknown_options */,
2695
+ 4096 /* readahead_size */));
2696
+ } else {
2697
+ ASSERT_NOK(parser.Parse(kTestFileName, fs_.get(),
2698
+ true /* ignore_unknown_options */,
2699
+ 4096 /* readahead_size */));
2700
+ }
2701
+ }
2702
+ }
2703
+
2704
+ TEST_F(OptionsParserTest, ParseVersion) {
2705
+ DBOptions db_opt;
2706
+ db_opt.max_open_files = 12345;
2707
+ db_opt.max_background_flushes = 301;
2708
+ db_opt.max_total_wal_size = 1024;
2709
+ ColumnFamilyOptions cf_opt;
2710
+
2711
+ std::string file_template =
2712
+ "# This is a testing option string.\n"
2713
+ "# Currently we only support \"#\" styled comment.\n"
2714
+ "\n"
2715
+ "[Version]\n"
2716
+ " rocksdb_version=3.13.1\n"
2717
+ " options_file_version=%s\n"
2718
+ "[DBOptions]\n"
2719
+ "[CFOptions \"default\"]\n";
2720
+ const int kLength = 1000;
2721
+ char buffer[kLength];
2722
+ RocksDBOptionsParser parser;
2723
+
2724
+ const std::vector<std::string> invalid_versions = {
2725
+ "a.b.c", "3.2.2b", "3.-12", "3. 1", // only digits and dots are allowed
2726
+ "1.2.3.4",
2727
+ "1.2.3" // can only contains at most one dot.
2728
+ "0", // options_file_version must be at least one
2729
+ "3..2",
2730
+ ".", ".1.2", // must have at least one digit before each dot
2731
+ "1.2.", "1.", "2.34."}; // must have at least one digit after each dot
2732
+ for (auto iv : invalid_versions) {
2733
+ snprintf(buffer, kLength - 1, file_template.c_str(), iv.c_str());
2734
+
2735
+ parser.Reset();
2736
+ ASSERT_OK(fs_->WriteToNewFile(iv, buffer));
2737
+ ASSERT_NOK(parser.Parse(iv, fs_.get(), false, 0 /* readahead_size */));
2738
+ }
2739
+
2740
+ const std::vector<std::string> valid_versions = {
2741
+ "1.232", "100", "3.12", "1", "12.3 ", " 1.25 "};
2742
+ for (auto vv : valid_versions) {
2743
+ snprintf(buffer, kLength - 1, file_template.c_str(), vv.c_str());
2744
+ parser.Reset();
2745
+ ASSERT_OK(fs_->WriteToNewFile(vv, buffer));
2746
+ ASSERT_OK(parser.Parse(vv, fs_.get(), false, 0 /* readahead_size */));
2747
+ }
2748
+ }
2749
+
2750
+ void VerifyCFPointerTypedOptions(
2751
+ ColumnFamilyOptions* base_cf_opt, const ColumnFamilyOptions* new_cf_opt,
2752
+ const std::unordered_map<std::string, std::string>* new_cf_opt_map) {
2753
+ std::string name_buffer;
2754
+ ConfigOptions config_options;
2755
+ config_options.input_strings_escaped = false;
2756
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(config_options, *base_cf_opt,
2757
+ *new_cf_opt, new_cf_opt_map));
2758
+
2759
+ // change the name of merge operator back-and-forth
2760
+ {
2761
+ auto* merge_operator = dynamic_cast<test::ChanglingMergeOperator*>(
2762
+ base_cf_opt->merge_operator.get());
2763
+ if (merge_operator != nullptr) {
2764
+ name_buffer = merge_operator->Name();
2765
+ // change the name and expect non-ok status
2766
+ merge_operator->SetName("some-other-name");
2767
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
2768
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2769
+ // change the name back and expect ok status
2770
+ merge_operator->SetName(name_buffer);
2771
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2772
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2773
+ }
2774
+ }
2775
+
2776
+ // change the name of the compaction filter factory back-and-forth
2777
+ {
2778
+ auto* compaction_filter_factory =
2779
+ dynamic_cast<test::ChanglingCompactionFilterFactory*>(
2780
+ base_cf_opt->compaction_filter_factory.get());
2781
+ if (compaction_filter_factory != nullptr) {
2782
+ name_buffer = compaction_filter_factory->Name();
2783
+ // change the name and expect non-ok status
2784
+ compaction_filter_factory->SetName("some-other-name");
2785
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
2786
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2787
+ // change the name back and expect ok status
2788
+ compaction_filter_factory->SetName(name_buffer);
2789
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2790
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2791
+ }
2792
+ }
2793
+
2794
+ // test by setting compaction_filter to nullptr
2795
+ {
2796
+ auto* tmp_compaction_filter = base_cf_opt->compaction_filter;
2797
+ if (tmp_compaction_filter != nullptr) {
2798
+ base_cf_opt->compaction_filter = nullptr;
2799
+ // set compaction_filter to nullptr and expect non-ok status
2800
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
2801
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2802
+ // set the value back and expect ok status
2803
+ base_cf_opt->compaction_filter = tmp_compaction_filter;
2804
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2805
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2806
+ }
2807
+ }
2808
+
2809
+ // test by setting table_factory to nullptr
2810
+ {
2811
+ auto tmp_table_factory = base_cf_opt->table_factory;
2812
+ if (tmp_table_factory != nullptr) {
2813
+ base_cf_opt->table_factory.reset();
2814
+ // set table_factory to nullptr and expect non-ok status
2815
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
2816
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2817
+ // set the value back and expect ok status
2818
+ base_cf_opt->table_factory = tmp_table_factory;
2819
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2820
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2821
+ }
2822
+ }
2823
+
2824
+ // test by setting memtable_factory to nullptr
2825
+ {
2826
+ auto tmp_memtable_factory = base_cf_opt->memtable_factory;
2827
+ if (tmp_memtable_factory != nullptr) {
2828
+ base_cf_opt->memtable_factory.reset();
2829
+ // set memtable_factory to nullptr and expect non-ok status
2830
+ ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(
2831
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2832
+ // set the value back and expect ok status
2833
+ base_cf_opt->memtable_factory = tmp_memtable_factory;
2834
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2835
+ config_options, *base_cf_opt, *new_cf_opt, new_cf_opt_map));
2836
+ }
2837
+ }
2838
+ }
2839
+
2840
+ TEST_F(OptionsParserTest, Readahead) {
2841
+ DBOptions base_db_opt;
2842
+ std::vector<ColumnFamilyOptions> base_cf_opts;
2843
+ base_cf_opts.emplace_back();
2844
+ base_cf_opts.emplace_back();
2845
+
2846
+ std::string one_mb_string = std::string(1024 * 1024, 'x');
2847
+ std::vector<std::string> cf_names = {"default", one_mb_string};
2848
+ const std::string kOptionsFileName = "test-persisted-options.ini";
2849
+
2850
+ ASSERT_OK(PersistRocksDBOptions(base_db_opt, cf_names, base_cf_opts,
2851
+ kOptionsFileName, fs_.get()));
2852
+
2853
+ uint64_t file_size = 0;
2854
+ ASSERT_OK(
2855
+ fs_->GetFileSize(kOptionsFileName, IOOptions(), &file_size, nullptr));
2856
+ assert(file_size > 0);
2857
+
2858
+ RocksDBOptionsParser parser;
2859
+
2860
+ fs_->num_seq_file_read_ = 0;
2861
+ size_t readahead_size = 128 * 1024;
2862
+
2863
+ ASSERT_OK(parser.Parse(kOptionsFileName, fs_.get(), false, readahead_size));
2864
+ ASSERT_EQ(fs_->num_seq_file_read_.load(),
2865
+ (file_size - 1) / readahead_size + 1);
2866
+
2867
+ fs_->num_seq_file_read_.store(0);
2868
+ readahead_size = 1024 * 1024;
2869
+ ASSERT_OK(parser.Parse(kOptionsFileName, fs_.get(), false, readahead_size));
2870
+ ASSERT_EQ(fs_->num_seq_file_read_.load(),
2871
+ (file_size - 1) / readahead_size + 1);
2872
+
2873
+ // Tiny readahead. 8 KB is read each time.
2874
+ fs_->num_seq_file_read_.store(0);
2875
+ ASSERT_OK(
2876
+ parser.Parse(kOptionsFileName, fs_.get(), false, 1 /* readahead_size */));
2877
+ ASSERT_GE(fs_->num_seq_file_read_.load(), file_size / (8 * 1024));
2878
+ ASSERT_LT(fs_->num_seq_file_read_.load(), file_size / (8 * 1024) * 2);
2879
+
2880
+ // Disable readahead means 512KB readahead.
2881
+ fs_->num_seq_file_read_.store(0);
2882
+ ASSERT_OK(
2883
+ parser.Parse(kOptionsFileName, fs_.get(), false, 0 /* readahead_size */));
2884
+ ASSERT_GE(fs_->num_seq_file_read_.load(), (file_size - 1) / (512 * 1024) + 1);
2885
+ }
2886
+
2887
+ TEST_F(OptionsParserTest, DumpAndParse) {
2888
+ DBOptions base_db_opt;
2889
+ std::vector<ColumnFamilyOptions> base_cf_opts;
2890
+ std::vector<std::string> cf_names = {"default", "cf1", "cf2", "cf3",
2891
+ "c:f:4:4:4"
2892
+ "p\\i\\k\\a\\chu\\\\\\",
2893
+ "###rocksdb#1-testcf#2###"};
2894
+ const int num_cf = static_cast<int>(cf_names.size());
2895
+ Random rnd(302);
2896
+ test::RandomInitDBOptions(&base_db_opt, &rnd);
2897
+ base_db_opt.db_log_dir += "/#odd #but #could #happen #path #/\\\\#OMG";
2898
+
2899
+ BlockBasedTableOptions special_bbto;
2900
+ special_bbto.cache_index_and_filter_blocks = true;
2901
+ special_bbto.block_size = 999999;
2902
+
2903
+ for (int c = 0; c < num_cf; ++c) {
2904
+ ColumnFamilyOptions cf_opt;
2905
+ Random cf_rnd(0xFB + c);
2906
+ test::RandomInitCFOptions(&cf_opt, base_db_opt, &cf_rnd);
2907
+ if (c < 4) {
2908
+ cf_opt.prefix_extractor.reset(test::RandomSliceTransform(&rnd, c));
2909
+ }
2910
+ if (c < 3) {
2911
+ cf_opt.table_factory.reset(test::RandomTableFactory(&rnd, c));
2912
+ } else if (c == 4) {
2913
+ cf_opt.table_factory.reset(NewBlockBasedTableFactory(special_bbto));
2914
+ }
2915
+ base_cf_opts.emplace_back(cf_opt);
2916
+ }
2917
+
2918
+ const std::string kOptionsFileName = "test-persisted-options.ini";
2919
+ // Use default for escaped(true), unknown(false) and check (exact)
2920
+ ConfigOptions config_options;
2921
+ ASSERT_OK(PersistRocksDBOptions(base_db_opt, cf_names, base_cf_opts,
2922
+ kOptionsFileName, fs_.get()));
2923
+
2924
+ RocksDBOptionsParser parser;
2925
+ ASSERT_OK(parser.Parse(config_options, kOptionsFileName, fs_.get()));
2926
+
2927
+ // Make sure block-based table factory options was deserialized correctly
2928
+ std::shared_ptr<TableFactory> ttf = (*parser.cf_opts())[4].table_factory;
2929
+ ASSERT_EQ(TableFactory::kBlockBasedTableName(), std::string(ttf->Name()));
2930
+ const auto parsed_bbto = ttf->GetOptions<BlockBasedTableOptions>();
2931
+ ASSERT_NE(parsed_bbto, nullptr);
2932
+ ASSERT_EQ(special_bbto.block_size, parsed_bbto->block_size);
2933
+ ASSERT_EQ(special_bbto.cache_index_and_filter_blocks,
2934
+ parsed_bbto->cache_index_and_filter_blocks);
2935
+
2936
+ ASSERT_OK(RocksDBOptionsParser::VerifyRocksDBOptionsFromFile(
2937
+ config_options, base_db_opt, cf_names, base_cf_opts, kOptionsFileName,
2938
+ fs_.get()));
2939
+
2940
+ ASSERT_OK(RocksDBOptionsParser::VerifyDBOptions(
2941
+ config_options, *parser.db_opt(), base_db_opt));
2942
+ for (int c = 0; c < num_cf; ++c) {
2943
+ const auto* cf_opt = parser.GetCFOptions(cf_names[c]);
2944
+ ASSERT_NE(cf_opt, nullptr);
2945
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
2946
+ config_options, base_cf_opts[c], *cf_opt,
2947
+ &(parser.cf_opt_maps()->at(c))));
2948
+ }
2949
+
2950
+ // Further verify pointer-typed options
2951
+ for (int c = 0; c < num_cf; ++c) {
2952
+ const auto* cf_opt = parser.GetCFOptions(cf_names[c]);
2953
+ ASSERT_NE(cf_opt, nullptr);
2954
+ VerifyCFPointerTypedOptions(&base_cf_opts[c], cf_opt,
2955
+ &(parser.cf_opt_maps()->at(c)));
2956
+ }
2957
+
2958
+ ASSERT_EQ(parser.GetCFOptions("does not exist"), nullptr);
2959
+
2960
+ base_db_opt.max_open_files++;
2961
+ ASSERT_NOK(RocksDBOptionsParser::VerifyRocksDBOptionsFromFile(
2962
+ config_options, base_db_opt, cf_names, base_cf_opts, kOptionsFileName,
2963
+ fs_.get()));
2964
+
2965
+ for (int c = 0; c < num_cf; ++c) {
2966
+ if (base_cf_opts[c].compaction_filter) {
2967
+ delete base_cf_opts[c].compaction_filter;
2968
+ }
2969
+ }
2970
+ }
2971
+
2972
+ TEST_F(OptionsParserTest, DifferentDefault) {
2973
+ const std::string kOptionsFileName = "test-persisted-options.ini";
2974
+
2975
+ ColumnFamilyOptions cf_level_opts;
2976
+ ASSERT_EQ(CompactionPri::kMinOverlappingRatio, cf_level_opts.compaction_pri);
2977
+ cf_level_opts.OptimizeLevelStyleCompaction();
2978
+
2979
+ ColumnFamilyOptions cf_univ_opts;
2980
+ cf_univ_opts.OptimizeUniversalStyleCompaction();
2981
+
2982
+ ASSERT_OK(PersistRocksDBOptions(DBOptions(), {"default", "universal"},
2983
+ {cf_level_opts, cf_univ_opts},
2984
+ kOptionsFileName, fs_.get()));
2985
+
2986
+ RocksDBOptionsParser parser;
2987
+ ASSERT_OK(parser.Parse(kOptionsFileName, fs_.get(), false,
2988
+ 4096 /* readahead_size */));
2989
+
2990
+ {
2991
+ Options old_default_opts;
2992
+ old_default_opts.OldDefaults();
2993
+ ASSERT_EQ(10 * 1048576, old_default_opts.max_bytes_for_level_base);
2994
+ ASSERT_EQ(5000, old_default_opts.max_open_files);
2995
+ ASSERT_EQ(2 * 1024U * 1024U, old_default_opts.delayed_write_rate);
2996
+ ASSERT_EQ(WALRecoveryMode::kTolerateCorruptedTailRecords,
2997
+ old_default_opts.wal_recovery_mode);
2998
+ }
2999
+ {
3000
+ Options old_default_opts;
3001
+ old_default_opts.OldDefaults(4, 6);
3002
+ ASSERT_EQ(10 * 1048576, old_default_opts.max_bytes_for_level_base);
3003
+ ASSERT_EQ(5000, old_default_opts.max_open_files);
3004
+ }
3005
+ {
3006
+ Options old_default_opts;
3007
+ old_default_opts.OldDefaults(4, 7);
3008
+ ASSERT_NE(10 * 1048576, old_default_opts.max_bytes_for_level_base);
3009
+ ASSERT_NE(4, old_default_opts.table_cache_numshardbits);
3010
+ ASSERT_EQ(5000, old_default_opts.max_open_files);
3011
+ ASSERT_EQ(2 * 1024U * 1024U, old_default_opts.delayed_write_rate);
3012
+ }
3013
+ {
3014
+ ColumnFamilyOptions old_default_cf_opts;
3015
+ old_default_cf_opts.OldDefaults();
3016
+ ASSERT_EQ(2 * 1048576, old_default_cf_opts.target_file_size_base);
3017
+ ASSERT_EQ(4 << 20, old_default_cf_opts.write_buffer_size);
3018
+ ASSERT_EQ(2 * 1048576, old_default_cf_opts.target_file_size_base);
3019
+ ASSERT_EQ(0, old_default_cf_opts.soft_pending_compaction_bytes_limit);
3020
+ ASSERT_EQ(0, old_default_cf_opts.hard_pending_compaction_bytes_limit);
3021
+ ASSERT_EQ(CompactionPri::kByCompensatedSize,
3022
+ old_default_cf_opts.compaction_pri);
3023
+ }
3024
+ {
3025
+ ColumnFamilyOptions old_default_cf_opts;
3026
+ old_default_cf_opts.OldDefaults(4, 6);
3027
+ ASSERT_EQ(2 * 1048576, old_default_cf_opts.target_file_size_base);
3028
+ ASSERT_EQ(CompactionPri::kByCompensatedSize,
3029
+ old_default_cf_opts.compaction_pri);
3030
+ }
3031
+ {
3032
+ ColumnFamilyOptions old_default_cf_opts;
3033
+ old_default_cf_opts.OldDefaults(4, 7);
3034
+ ASSERT_NE(2 * 1048576, old_default_cf_opts.target_file_size_base);
3035
+ ASSERT_EQ(CompactionPri::kByCompensatedSize,
3036
+ old_default_cf_opts.compaction_pri);
3037
+ }
3038
+ {
3039
+ Options old_default_opts;
3040
+ old_default_opts.OldDefaults(5, 1);
3041
+ ASSERT_EQ(2 * 1024U * 1024U, old_default_opts.delayed_write_rate);
3042
+ }
3043
+ {
3044
+ Options old_default_opts;
3045
+ old_default_opts.OldDefaults(5, 2);
3046
+ ASSERT_EQ(16 * 1024U * 1024U, old_default_opts.delayed_write_rate);
3047
+ ASSERT_TRUE(old_default_opts.compaction_pri ==
3048
+ CompactionPri::kByCompensatedSize);
3049
+ }
3050
+ {
3051
+ Options old_default_opts;
3052
+ old_default_opts.OldDefaults(5, 18);
3053
+ ASSERT_TRUE(old_default_opts.compaction_pri ==
3054
+ CompactionPri::kByCompensatedSize);
3055
+ }
3056
+
3057
+ Options small_opts;
3058
+ small_opts.OptimizeForSmallDb();
3059
+ ASSERT_EQ(2 << 20, small_opts.write_buffer_size);
3060
+ ASSERT_EQ(5000, small_opts.max_open_files);
3061
+ }
3062
+
3063
+ class OptionsSanityCheckTest : public OptionsParserTest {
3064
+ public:
3065
+ OptionsSanityCheckTest() {}
3066
+
3067
+ 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
+
3076
+ return RocksDBOptionsParser::VerifyRocksDBOptionsFromFile(
3077
+ config_options, DBOptions(), {"default"}, {cf_opts}, kOptionsFileName,
3078
+ fs_.get());
3079
+ }
3080
+
3081
+ Status PersistCFOptions(const ColumnFamilyOptions& cf_opts) {
3082
+ Status s = fs_->DeleteFile(kOptionsFileName, IOOptions(), nullptr);
3083
+ if (!s.ok()) {
3084
+ return s;
3085
+ }
3086
+ return PersistRocksDBOptions(DBOptions(), {"default"}, {cf_opts},
3087
+ kOptionsFileName, fs_.get());
3088
+ }
3089
+
3090
+ const std::string kOptionsFileName = "OPTIONS";
3091
+ };
3092
+
3093
+ TEST_F(OptionsSanityCheckTest, SanityCheck) {
3094
+ ColumnFamilyOptions opts;
3095
+ Random rnd(301);
3096
+
3097
+ // default ColumnFamilyOptions
3098
+ {
3099
+ ASSERT_OK(PersistCFOptions(opts));
3100
+ ASSERT_OK(
3101
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3102
+ }
3103
+
3104
+ // prefix_extractor
3105
+ {
3106
+ // Okay to change prefix_extractor form nullptr to non-nullptr
3107
+ ASSERT_EQ(opts.prefix_extractor.get(), nullptr);
3108
+ opts.prefix_extractor.reset(NewCappedPrefixTransform(10));
3109
+ ASSERT_OK(SanityCheckCFOptions(
3110
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3111
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3112
+
3113
+ // persist the change
3114
+ ASSERT_OK(PersistCFOptions(opts));
3115
+ ASSERT_OK(
3116
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3117
+
3118
+ // use same prefix extractor but with different parameter
3119
+ opts.prefix_extractor.reset(NewCappedPrefixTransform(15));
3120
+ // expect pass only in
3121
+ // ConfigOptions::kSanityLevelLooselyCompatible
3122
+ ASSERT_NOK(
3123
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3124
+ ASSERT_OK(SanityCheckCFOptions(
3125
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3126
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3127
+
3128
+ // repeat the test with FixedPrefixTransform
3129
+ opts.prefix_extractor.reset(NewFixedPrefixTransform(10));
3130
+ ASSERT_NOK(
3131
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3132
+ ASSERT_OK(SanityCheckCFOptions(
3133
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3134
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3135
+
3136
+ // persist the change of prefix_extractor
3137
+ ASSERT_OK(PersistCFOptions(opts));
3138
+ ASSERT_OK(
3139
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3140
+
3141
+ // use same prefix extractor but with different parameter
3142
+ opts.prefix_extractor.reset(NewFixedPrefixTransform(15));
3143
+ // expect pass only in
3144
+ // 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));
3150
+
3151
+ // Change prefix extractor from non-nullptr to nullptr
3152
+ opts.prefix_extractor.reset();
3153
+ // expect pass as it's safe to change prefix_extractor
3154
+ // from non-null to null
3155
+ ASSERT_OK(SanityCheckCFOptions(
3156
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3157
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3158
+ }
3159
+ // persist the change
3160
+ ASSERT_OK(PersistCFOptions(opts));
3161
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3162
+
3163
+ // table_factory
3164
+ {
3165
+ for (int tb = 0; tb <= 2; ++tb) {
3166
+ // change the table factory
3167
+ opts.table_factory.reset(test::RandomTableFactory(&rnd, tb));
3168
+ ASSERT_NOK(SanityCheckCFOptions(
3169
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3170
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3171
+
3172
+ // persist the change
3173
+ ASSERT_OK(PersistCFOptions(opts));
3174
+ ASSERT_OK(
3175
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3176
+ }
3177
+ }
3178
+
3179
+ // merge_operator
3180
+ {
3181
+ // Test when going from nullptr -> merge operator
3182
+ opts.merge_operator.reset(test::RandomMergeOperator(&rnd));
3183
+ ASSERT_OK(SanityCheckCFOptions(
3184
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3185
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3186
+
3187
+ // persist the change
3188
+ ASSERT_OK(PersistCFOptions(opts));
3189
+ ASSERT_OK(
3190
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3191
+
3192
+ for (int test = 0; test < 5; ++test) {
3193
+ // change the merge operator
3194
+ opts.merge_operator.reset(test::RandomMergeOperator(&rnd));
3195
+ ASSERT_NOK(SanityCheckCFOptions(
3196
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3197
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3198
+
3199
+ // persist the change
3200
+ ASSERT_OK(PersistCFOptions(opts));
3201
+ ASSERT_OK(
3202
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3203
+ }
3204
+
3205
+ // Test when going from merge operator -> nullptr
3206
+ opts.merge_operator = nullptr;
3207
+ ASSERT_NOK(SanityCheckCFOptions(
3208
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3209
+ ASSERT_OK(SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelNone));
3210
+
3211
+ // persist the change
3212
+ ASSERT_OK(PersistCFOptions(opts));
3213
+ ASSERT_OK(
3214
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3215
+ }
3216
+
3217
+ // compaction_filter
3218
+ {
3219
+ for (int test = 0; test < 5; ++test) {
3220
+ // change the compaction filter
3221
+ opts.compaction_filter = test::RandomCompactionFilter(&rnd);
3222
+ ASSERT_NOK(
3223
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3224
+ ASSERT_OK(SanityCheckCFOptions(
3225
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3226
+
3227
+ // persist the change
3228
+ ASSERT_OK(PersistCFOptions(opts));
3229
+ ASSERT_OK(
3230
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3231
+ delete opts.compaction_filter;
3232
+ opts.compaction_filter = nullptr;
3233
+ }
3234
+ }
3235
+
3236
+ // compaction_filter_factory
3237
+ {
3238
+ for (int test = 0; test < 5; ++test) {
3239
+ // change the compaction filter factory
3240
+ opts.compaction_filter_factory.reset(
3241
+ test::RandomCompactionFilterFactory(&rnd));
3242
+ ASSERT_NOK(
3243
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3244
+ ASSERT_OK(SanityCheckCFOptions(
3245
+ opts, ConfigOptions::kSanityLevelLooselyCompatible));
3246
+
3247
+ // persist the change
3248
+ ASSERT_OK(PersistCFOptions(opts));
3249
+ ASSERT_OK(
3250
+ SanityCheckCFOptions(opts, ConfigOptions::kSanityLevelExactMatch));
3251
+ }
3252
+ }
3253
+ }
3254
+
3255
+ namespace {
3256
+ bool IsEscapedString(const std::string& str) {
3257
+ for (size_t i = 0; i < str.size(); ++i) {
3258
+ if (str[i] == '\\') {
3259
+ // since we already handle those two consecutive '\'s in
3260
+ // the next if-then branch, any '\' appear at the end
3261
+ // of an escaped string in such case is not valid.
3262
+ if (i == str.size() - 1) {
3263
+ return false;
3264
+ }
3265
+ if (str[i + 1] == '\\') {
3266
+ // if there're two consecutive '\'s, skip the second one.
3267
+ i++;
3268
+ continue;
3269
+ }
3270
+ switch (str[i + 1]) {
3271
+ case ':':
3272
+ case '\\':
3273
+ case '#':
3274
+ continue;
3275
+ default:
3276
+ // if true, '\' together with str[i + 1] is not a valid escape.
3277
+ if (UnescapeChar(str[i + 1]) == str[i + 1]) {
3278
+ return false;
3279
+ }
3280
+ }
3281
+ } else if (isSpecialChar(str[i]) && (i == 0 || str[i - 1] != '\\')) {
3282
+ return false;
3283
+ }
3284
+ }
3285
+ return true;
3286
+ }
3287
+ } // namespace
3288
+
3289
+ TEST_F(OptionsParserTest, IntegerParsing) {
3290
+ ASSERT_EQ(ParseUint64("18446744073709551615"), 18446744073709551615U);
3291
+ ASSERT_EQ(ParseUint32("4294967295"), 4294967295U);
3292
+ ASSERT_EQ(ParseSizeT("18446744073709551615"), 18446744073709551615U);
3293
+ ASSERT_EQ(ParseInt64("9223372036854775807"), 9223372036854775807);
3294
+ ASSERT_EQ(ParseInt64("-9223372036854775808"), port::kMinInt64);
3295
+ ASSERT_EQ(ParseInt32("2147483647"), 2147483647);
3296
+ ASSERT_EQ(ParseInt32("-2147483648"), port::kMinInt32);
3297
+ ASSERT_EQ(ParseInt("-32767"), -32767);
3298
+ ASSERT_EQ(ParseDouble("-1.234567"), -1.234567);
3299
+ }
3300
+
3301
+ TEST_F(OptionsParserTest, EscapeOptionString) {
3302
+ ASSERT_EQ(UnescapeOptionString(
3303
+ "This is a test string with \\# \\: and \\\\ escape chars."),
3304
+ "This is a test string with # : and \\ escape chars.");
3305
+
3306
+ ASSERT_EQ(
3307
+ EscapeOptionString("This is a test string with # : and \\ escape chars."),
3308
+ "This is a test string with \\# \\: and \\\\ escape chars.");
3309
+
3310
+ std::string readible_chars =
3311
+ "A String like this \"1234567890-=_)(*&^%$#@!ertyuiop[]{POIU"
3312
+ "YTREWQasdfghjkl;':LKJHGFDSAzxcvbnm,.?>"
3313
+ "<MNBVCXZ\\\" should be okay to \\#\\\\\\:\\#\\#\\#\\ "
3314
+ "be serialized and deserialized";
3315
+
3316
+ std::string escaped_string = EscapeOptionString(readible_chars);
3317
+ ASSERT_TRUE(IsEscapedString(escaped_string));
3318
+ // This two transformations should be canceled and should output
3319
+ // the original input.
3320
+ ASSERT_EQ(UnescapeOptionString(escaped_string), readible_chars);
3321
+
3322
+ std::string all_chars;
3323
+ for (unsigned char c = 0;; ++c) {
3324
+ all_chars += c;
3325
+ if (c == 255) {
3326
+ break;
3327
+ }
3328
+ }
3329
+ escaped_string = EscapeOptionString(all_chars);
3330
+ ASSERT_TRUE(IsEscapedString(escaped_string));
3331
+ ASSERT_EQ(UnescapeOptionString(escaped_string), all_chars);
3332
+
3333
+ ASSERT_EQ(RocksDBOptionsParser::TrimAndRemoveComment(
3334
+ " A simple statement with a comment. # like this :)"),
3335
+ "A simple statement with a comment.");
3336
+
3337
+ ASSERT_EQ(RocksDBOptionsParser::TrimAndRemoveComment(
3338
+ "Escape \\# and # comment together ."),
3339
+ "Escape \\# and");
3340
+ }
3341
+
3342
+ static void TestAndCompareOption(const ConfigOptions& config_options,
3343
+ const OptionTypeInfo& opt_info,
3344
+ const std::string& opt_name, void* base_ptr,
3345
+ void* comp_ptr) {
3346
+ std::string result, mismatch;
3347
+ ASSERT_OK(opt_info.Serialize(config_options, opt_name, base_ptr, &result));
3348
+ ASSERT_OK(opt_info.Parse(config_options, opt_name, result, comp_ptr));
3349
+ ASSERT_TRUE(opt_info.AreEqual(config_options, opt_name, base_ptr, comp_ptr,
3350
+ &mismatch));
3351
+ }
3352
+
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) {
3358
+ 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);
3360
+ }
3361
+
3362
+ template <typename T>
3363
+ void TestOptInfo(const ConfigOptions& config_options, OptionType opt_type,
3364
+ T* base, T* comp) {
3365
+ std::string result;
3366
+ OptionTypeInfo opt_info(0, opt_type);
3367
+ ASSERT_FALSE(opt_info.AreEqual(config_options, "base", base, comp, &result));
3368
+ ASSERT_EQ(result, "base");
3369
+ ASSERT_NE(*base, *comp);
3370
+ TestAndCompareOption(config_options, opt_info, "base", base, comp);
3371
+ ASSERT_EQ(*base, *comp);
3372
+ }
3373
+
3374
+ class OptionTypeInfoTest : public testing::Test {};
3375
+
3376
+ TEST_F(OptionTypeInfoTest, BasicTypes) {
3377
+ ConfigOptions config_options;
3378
+ {
3379
+ bool a = true, b = false;
3380
+ TestOptInfo(config_options, OptionType::kBoolean, &a, &b);
3381
+ }
3382
+ {
3383
+ int a = 100, b = 200;
3384
+ TestOptInfo(config_options, OptionType::kInt, &a, &b);
3385
+ }
3386
+ {
3387
+ int32_t a = 100, b = 200;
3388
+ TestOptInfo(config_options, OptionType::kInt32T, &a, &b);
3389
+ }
3390
+ {
3391
+ int64_t a = 100, b = 200;
3392
+ TestOptInfo(config_options, OptionType::kInt64T, &a, &b);
3393
+ }
3394
+ {
3395
+ unsigned int a = 100, b = 200;
3396
+ TestOptInfo(config_options, OptionType::kUInt, &a, &b);
3397
+ }
3398
+ {
3399
+ uint32_t a = 100, b = 200;
3400
+ TestOptInfo(config_options, OptionType::kUInt32T, &a, &b);
3401
+ }
3402
+ {
3403
+ uint64_t a = 100, b = 200;
3404
+ TestOptInfo(config_options, OptionType::kUInt64T, &a, &b);
3405
+ }
3406
+ {
3407
+ size_t a = 100, b = 200;
3408
+ TestOptInfo(config_options, OptionType::kSizeT, &a, &b);
3409
+ }
3410
+ {
3411
+ std::string a = "100", b = "200";
3412
+ TestOptInfo(config_options, OptionType::kString, &a, &b);
3413
+ }
3414
+ {
3415
+ double a = 1.0, b = 2.0;
3416
+ TestOptInfo(config_options, OptionType::kDouble, &a, &b);
3417
+ }
3418
+ }
3419
+
3420
+ TEST_F(OptionTypeInfoTest, TestInvalidArgs) {
3421
+ ConfigOptions config_options;
3422
+ bool b;
3423
+ int i;
3424
+ int32_t i32;
3425
+ int64_t i64;
3426
+ unsigned int u;
3427
+ int32_t u32;
3428
+ int64_t u64;
3429
+ size_t sz;
3430
+ double d;
3431
+
3432
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kBoolean)
3433
+ .Parse(config_options, "b", "x", &b));
3434
+ ASSERT_NOK(
3435
+ OptionTypeInfo(0, OptionType::kInt).Parse(config_options, "b", "x", &i));
3436
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kInt32T)
3437
+ .Parse(config_options, "b", "x", &i32));
3438
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kInt64T)
3439
+ .Parse(config_options, "b", "x", &i64));
3440
+ ASSERT_NOK(
3441
+ OptionTypeInfo(0, OptionType::kUInt).Parse(config_options, "b", "x", &u));
3442
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kUInt32T)
3443
+ .Parse(config_options, "b", "x", &u32));
3444
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kUInt64T)
3445
+ .Parse(config_options, "b", "x", &u64));
3446
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kSizeT)
3447
+ .Parse(config_options, "b", "x", &sz));
3448
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kDouble)
3449
+ .Parse(config_options, "b", "x", &d));
3450
+
3451
+ // Don't know how to convert Unknowns to anything else
3452
+ ASSERT_NOK(OptionTypeInfo(0, OptionType::kUnknown)
3453
+ .Parse(config_options, "b", "x", &d));
3454
+
3455
+ // Verify that if the parse function throws an exception, it is also trapped
3456
+ OptionTypeInfo func_info(0, OptionType::kUnknown,
3457
+ OptionVerificationType::kNormal,
3458
+ OptionTypeFlags::kNone,
3459
+ [](const ConfigOptions&, const std::string&,
3460
+ const std::string& value, char* addr) {
3461
+ auto ptr = reinterpret_cast<int*>(addr);
3462
+ *ptr = ParseInt(value);
3463
+ return Status::OK();
3464
+ });
3465
+ ASSERT_OK(func_info.Parse(config_options, "b", "1", &i));
3466
+ ASSERT_NOK(func_info.Parse(config_options, "b", "x", &i));
3467
+ }
3468
+
3469
+ TEST_F(OptionTypeInfoTest, TestParseFunc) {
3470
+ OptionTypeInfo opt_info(
3471
+ 0, OptionType::kUnknown, OptionVerificationType::kNormal,
3472
+ OptionTypeFlags::kNone,
3473
+ [](const ConfigOptions& /*opts*/, const std::string& name,
3474
+ const std::string& value, char* addr) {
3475
+ auto ptr = reinterpret_cast<std::string*>(addr);
3476
+ if (name == "Oops") {
3477
+ return Status::InvalidArgument(value);
3478
+ } else {
3479
+ *ptr = value + " " + name;
3480
+ return Status::OK();
3481
+ }
3482
+ });
3483
+ ConfigOptions config_options;
3484
+ std::string base;
3485
+ ASSERT_OK(opt_info.Parse(config_options, "World", "Hello", &base));
3486
+ ASSERT_EQ(base, "Hello World");
3487
+ ASSERT_NOK(opt_info.Parse(config_options, "Oops", "Hello", &base));
3488
+ }
3489
+
3490
+ TEST_F(OptionTypeInfoTest, TestSerializeFunc) {
3491
+ OptionTypeInfo opt_info(
3492
+ 0, OptionType::kString, OptionVerificationType::kNormal,
3493
+ OptionTypeFlags::kNone, nullptr,
3494
+ [](const ConfigOptions& /*opts*/, const std::string& name,
3495
+ const char* /*addr*/, std::string* value) {
3496
+ if (name == "Oops") {
3497
+ return Status::InvalidArgument(name);
3498
+ } else {
3499
+ *value = name;
3500
+ return Status::OK();
3501
+ }
3502
+ },
3503
+ nullptr);
3504
+ ConfigOptions config_options;
3505
+ std::string base;
3506
+ std::string value;
3507
+ ASSERT_OK(opt_info.Serialize(config_options, "Hello", &base, &value));
3508
+ ASSERT_EQ(value, "Hello");
3509
+ ASSERT_NOK(opt_info.Serialize(config_options, "Oops", &base, &value));
3510
+ }
3511
+
3512
+ TEST_F(OptionTypeInfoTest, TestEqualsFunc) {
3513
+ OptionTypeInfo opt_info(
3514
+ 0, OptionType::kInt, OptionVerificationType::kNormal,
3515
+ OptionTypeFlags::kNone, nullptr, nullptr,
3516
+ [](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));
3520
+ if (name == "LT") {
3521
+ return i1 < i2;
3522
+ } else if (name == "GT") {
3523
+ return i1 > i2;
3524
+ } else if (name == "EQ") {
3525
+ return i1 == i2;
3526
+ } else {
3527
+ *mismatch = name + "???";
3528
+ return false;
3529
+ }
3530
+ });
3531
+
3532
+ ConfigOptions config_options;
3533
+ int int1 = 100;
3534
+ int int2 = 200;
3535
+ std::string mismatch;
3536
+ ASSERT_TRUE(opt_info.AreEqual(config_options, "LT", &int1, &int2, &mismatch));
3537
+ ASSERT_EQ(mismatch, "");
3538
+ ASSERT_FALSE(
3539
+ opt_info.AreEqual(config_options, "GT", &int1, &int2, &mismatch));
3540
+ ASSERT_EQ(mismatch, "GT");
3541
+ ASSERT_FALSE(
3542
+ opt_info.AreEqual(config_options, "NO", &int1, &int2, &mismatch));
3543
+ ASSERT_EQ(mismatch, "NO???");
3544
+ }
3545
+
3546
+ TEST_F(OptionTypeInfoTest, TestOptionFlags) {
3547
+ OptionTypeInfo opt_none(0, OptionType::kString,
3548
+ OptionVerificationType::kNormal,
3549
+ OptionTypeFlags::kDontSerialize);
3550
+ OptionTypeInfo opt_never(0, OptionType::kString,
3551
+ OptionVerificationType::kNormal,
3552
+ OptionTypeFlags::kCompareNever);
3553
+ OptionTypeInfo opt_alias(0, OptionType::kString,
3554
+ OptionVerificationType::kAlias,
3555
+ OptionTypeFlags::kNone);
3556
+ OptionTypeInfo opt_deprecated(0, OptionType::kString,
3557
+ OptionVerificationType::kDeprecated,
3558
+ OptionTypeFlags::kNone);
3559
+ ConfigOptions config_options;
3560
+ std::string opts_str;
3561
+ std::string base = "base";
3562
+ std::string comp = "comp";
3563
+
3564
+ // If marked string none, the serialization returns not supported
3565
+ ASSERT_NOK(opt_none.Serialize(config_options, "None", &base, &opts_str));
3566
+ // If marked never compare, they match even when they do not
3567
+ ASSERT_TRUE(opt_never.AreEqual(config_options, "Never", &base, &comp, &base));
3568
+ ASSERT_FALSE(opt_none.AreEqual(config_options, "Never", &base, &comp, &base));
3569
+
3570
+ // An alias can change the value via parse, but does nothing on serialize on
3571
+ // match
3572
+ std::string result;
3573
+ ASSERT_OK(opt_alias.Parse(config_options, "Alias", "Alias",
3574
+ reinterpret_cast<char*>(&base)));
3575
+ ASSERT_OK(opt_alias.Serialize(config_options, "Alias", &base, &result));
3576
+ ASSERT_TRUE(
3577
+ opt_alias.AreEqual(config_options, "Alias", &base, &comp, &result));
3578
+ ASSERT_EQ(base, "Alias");
3579
+ ASSERT_NE(base, comp);
3580
+
3581
+ // Deprecated options do nothing on any of the commands
3582
+ ASSERT_OK(opt_deprecated.Parse(config_options, "Alias", "Deprecated", &base));
3583
+ ASSERT_OK(opt_deprecated.Serialize(config_options, "Alias", &base, &result));
3584
+ ASSERT_TRUE(
3585
+ opt_deprecated.AreEqual(config_options, "Alias", &base, &comp, &result));
3586
+ ASSERT_EQ(base, "Alias");
3587
+ ASSERT_NE(base, comp);
3588
+ }
3589
+
3590
+ TEST_F(OptionTypeInfoTest, TestCustomEnum) {
3591
+ enum TestEnum { kA, kB, kC };
3592
+ std::unordered_map<std::string, TestEnum> enum_map = {
3593
+ {"A", TestEnum::kA},
3594
+ {"B", TestEnum::kB},
3595
+ {"C", TestEnum::kC},
3596
+ };
3597
+ OptionTypeInfo opt_info = OptionTypeInfo::Enum<TestEnum>(0, &enum_map);
3598
+ TestEnum e1, e2;
3599
+ ConfigOptions config_options;
3600
+ std::string result, mismatch;
3601
+
3602
+ e2 = TestEnum::kA;
3603
+
3604
+ ASSERT_OK(opt_info.Parse(config_options, "", "B", &e1));
3605
+ ASSERT_OK(opt_info.Serialize(config_options, "", &e1, &result));
3606
+ ASSERT_EQ(e1, TestEnum::kB);
3607
+ ASSERT_EQ(result, "B");
3608
+
3609
+ ASSERT_FALSE(opt_info.AreEqual(config_options, "Enum", &e1, &e2, &mismatch));
3610
+ ASSERT_EQ(mismatch, "Enum");
3611
+
3612
+ TestAndCompareOption(config_options, opt_info, "", "C", &e1, &e2);
3613
+ ASSERT_EQ(e2, TestEnum::kC);
3614
+
3615
+ ASSERT_NOK(opt_info.Parse(config_options, "", "D", &e1));
3616
+ ASSERT_EQ(e1, TestEnum::kC);
3617
+ }
3618
+
3619
+ TEST_F(OptionTypeInfoTest, TestBuiltinEnum) {
3620
+ ConfigOptions config_options;
3621
+ for (auto iter : OptionsHelper::compaction_style_string_map) {
3622
+ CompactionStyle e1, e2;
3623
+ TestAndCompareOption(config_options,
3624
+ OptionTypeInfo(0, OptionType::kCompactionStyle),
3625
+ "CompactionStyle", iter.first, &e1, &e2);
3626
+ ASSERT_EQ(e1, iter.second);
3627
+ }
3628
+ for (auto iter : OptionsHelper::compaction_pri_string_map) {
3629
+ CompactionPri e1, e2;
3630
+ TestAndCompareOption(config_options,
3631
+ OptionTypeInfo(0, OptionType::kCompactionPri),
3632
+ "CompactionPri", iter.first, &e1, &e2);
3633
+ ASSERT_EQ(e1, iter.second);
3634
+ }
3635
+ for (auto iter : OptionsHelper::compression_type_string_map) {
3636
+ CompressionType e1, e2;
3637
+ TestAndCompareOption(config_options,
3638
+ OptionTypeInfo(0, OptionType::kCompressionType),
3639
+ "CompressionType", iter.first, &e1, &e2);
3640
+ ASSERT_EQ(e1, iter.second);
3641
+ }
3642
+ for (auto iter : OptionsHelper::compaction_stop_style_string_map) {
3643
+ CompactionStopStyle e1, e2;
3644
+ TestAndCompareOption(config_options,
3645
+ OptionTypeInfo(0, OptionType::kCompactionStopStyle),
3646
+ "CompactionStopStyle", iter.first, &e1, &e2);
3647
+ ASSERT_EQ(e1, iter.second);
3648
+ }
3649
+ for (auto iter : OptionsHelper::checksum_type_string_map) {
3650
+ ChecksumType e1, e2;
3651
+ TestAndCompareOption(config_options,
3652
+ OptionTypeInfo(0, OptionType::kChecksumType),
3653
+ "CheckSumType", iter.first, &e1, &e2);
3654
+ ASSERT_EQ(e1, iter.second);
3655
+ }
3656
+ for (auto iter : OptionsHelper::encoding_type_string_map) {
3657
+ EncodingType e1, e2;
3658
+ TestAndCompareOption(config_options,
3659
+ OptionTypeInfo(0, OptionType::kEncodingType),
3660
+ "EncodingType", iter.first, &e1, &e2);
3661
+ ASSERT_EQ(e1, iter.second);
3662
+ }
3663
+ }
3664
+
3665
+ TEST_F(OptionTypeInfoTest, TestStruct) {
3666
+ struct Basic {
3667
+ int i = 42;
3668
+ std::string s = "Hello";
3669
+ };
3670
+
3671
+ struct Extended {
3672
+ int j = 11;
3673
+ Basic b;
3674
+ };
3675
+
3676
+ std::unordered_map<std::string, OptionTypeInfo> basic_type_map = {
3677
+ {"i", {offsetof(struct Basic, i), OptionType::kInt}},
3678
+ {"s", {offsetof(struct Basic, s), OptionType::kString}},
3679
+ };
3680
+ OptionTypeInfo basic_info = OptionTypeInfo::Struct(
3681
+ "b", &basic_type_map, 0, OptionVerificationType::kNormal,
3682
+ OptionTypeFlags::kMutable);
3683
+
3684
+ std::unordered_map<std::string, OptionTypeInfo> extended_type_map = {
3685
+ {"j", {offsetof(struct Extended, j), OptionType::kInt}},
3686
+ {"b", OptionTypeInfo::Struct(
3687
+ "b", &basic_type_map, offsetof(struct Extended, b),
3688
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone)},
3689
+ {"m", OptionTypeInfo::Struct(
3690
+ "m", &basic_type_map, offsetof(struct Extended, b),
3691
+ OptionVerificationType::kNormal, OptionTypeFlags::kMutable)},
3692
+ };
3693
+ OptionTypeInfo extended_info = OptionTypeInfo::Struct(
3694
+ "e", &extended_type_map, 0, OptionVerificationType::kNormal,
3695
+ OptionTypeFlags::kMutable);
3696
+ Extended e1, e2;
3697
+ ConfigOptions config_options;
3698
+ std::string mismatch;
3699
+ TestAndCompareOption(config_options, basic_info, "b", "{i=33;s=33}", &e1.b,
3700
+ &e2.b);
3701
+ ASSERT_EQ(e1.b.i, 33);
3702
+ ASSERT_EQ(e1.b.s, "33");
3703
+
3704
+ TestAndCompareOption(config_options, basic_info, "b.i", "44", &e1.b, &e2.b);
3705
+ ASSERT_EQ(e1.b.i, 44);
3706
+
3707
+ TestAndCompareOption(config_options, basic_info, "i", "55", &e1.b, &e2.b);
3708
+ ASSERT_EQ(e1.b.i, 55);
3709
+
3710
+ e1.b.i = 0;
3711
+
3712
+ ASSERT_FALSE(
3713
+ basic_info.AreEqual(config_options, "b", &e1.b, &e2.b, &mismatch));
3714
+ ASSERT_EQ(mismatch, "b.i");
3715
+ mismatch.clear();
3716
+ ASSERT_FALSE(
3717
+ basic_info.AreEqual(config_options, "b.i", &e1.b, &e2.b, &mismatch));
3718
+ ASSERT_EQ(mismatch, "b.i");
3719
+ mismatch.clear();
3720
+ ASSERT_FALSE(
3721
+ basic_info.AreEqual(config_options, "i", &e1.b, &e2.b, &mismatch));
3722
+ ASSERT_EQ(mismatch, "b.i");
3723
+ mismatch.clear();
3724
+
3725
+ e1 = e2;
3726
+ ASSERT_NOK(basic_info.Parse(config_options, "b", "{i=33;s=33;j=44}", &e1.b));
3727
+ ASSERT_NOK(basic_info.Parse(config_options, "b.j", "44", &e1.b));
3728
+ ASSERT_NOK(basic_info.Parse(config_options, "j", "44", &e1.b));
3729
+
3730
+ TestAndCompareOption(config_options, extended_info, "e",
3731
+ "b={i=55;s=55}; j=22;", &e1, &e2);
3732
+ ASSERT_EQ(e1.b.i, 55);
3733
+ ASSERT_EQ(e1.j, 22);
3734
+ ASSERT_EQ(e1.b.s, "55");
3735
+ TestAndCompareOption(config_options, extended_info, "e.b", "{i=66;s=66;}",
3736
+ &e1, &e2);
3737
+ ASSERT_EQ(e1.b.i, 66);
3738
+ ASSERT_EQ(e1.j, 22);
3739
+ ASSERT_EQ(e1.b.s, "66");
3740
+ TestAndCompareOption(config_options, extended_info, "e.b.i", "77", &e1, &e2);
3741
+ ASSERT_EQ(e1.b.i, 77);
3742
+ ASSERT_EQ(e1.j, 22);
3743
+ ASSERT_EQ(e1.b.s, "66");
3744
+ }
3745
+
3746
+ TEST_F(OptionTypeInfoTest, TestVectorType) {
3747
+ OptionTypeInfo vec_info = OptionTypeInfo::Vector<std::string>(
3748
+ 0, OptionVerificationType::kNormal, OptionTypeFlags::kNone,
3749
+ {0, OptionType::kString});
3750
+ std::vector<std::string> vec1, vec2;
3751
+ std::string mismatch;
3752
+
3753
+ ConfigOptions config_options;
3754
+ TestAndCompareOption(config_options, vec_info, "v", "a:b:c:d", &vec1, &vec2);
3755
+ ASSERT_EQ(vec1.size(), 4);
3756
+ ASSERT_EQ(vec1[0], "a");
3757
+ ASSERT_EQ(vec1[1], "b");
3758
+ ASSERT_EQ(vec1[2], "c");
3759
+ ASSERT_EQ(vec1[3], "d");
3760
+ vec1[3] = "e";
3761
+ ASSERT_FALSE(vec_info.AreEqual(config_options, "v", &vec1, &vec2, &mismatch));
3762
+ ASSERT_EQ(mismatch, "v");
3763
+
3764
+ // Test vectors with inner brackets
3765
+ TestAndCompareOption(config_options, vec_info, "v", "a:{b}:c:d", &vec1,
3766
+ &vec2);
3767
+ ASSERT_EQ(vec1.size(), 4);
3768
+ ASSERT_EQ(vec1[0], "a");
3769
+ ASSERT_EQ(vec1[1], "b");
3770
+ ASSERT_EQ(vec1[2], "c");
3771
+ ASSERT_EQ(vec1[3], "d");
3772
+
3773
+ OptionTypeInfo bar_info = OptionTypeInfo::Vector<std::string>(
3774
+ 0, OptionVerificationType::kNormal, OptionTypeFlags::kNone,
3775
+ {0, OptionType::kString}, '|');
3776
+ TestAndCompareOption(config_options, vec_info, "v", "x|y|z", &vec1, &vec2);
3777
+ // Test vectors with inner vector
3778
+ TestAndCompareOption(config_options, bar_info, "v",
3779
+ "a|{b1|b2}|{c1|c2|{d1|d2}}", &vec1, &vec2);
3780
+ ASSERT_EQ(vec1.size(), 3);
3781
+ ASSERT_EQ(vec1[0], "a");
3782
+ ASSERT_EQ(vec1[1], "b1|b2");
3783
+ ASSERT_EQ(vec1[2], "c1|c2|{d1|d2}");
3784
+ }
3785
+ #endif // !ROCKSDB_LITE
3786
+ } // namespace ROCKSDB_NAMESPACE
3787
+
3788
+ int main(int argc, char** argv) {
3789
+ ::testing::InitGoogleTest(&argc, argv);
3790
+ #ifdef GFLAGS
3791
+ ParseCommandLineFlags(&argc, &argv, true);
3792
+ #endif // GFLAGS
3793
+ return RUN_ALL_TESTS();
3794
+ }