@nxtedition/rocksdb 5.2.1 → 5.2.2

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 (1052) hide show
  1. package/binding.cc +322 -1166
  2. package/binding.gyp +1 -1
  3. package/chained-batch.js +37 -23
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  5. package/deps/rocksdb/rocksdb/COPYING +339 -0
  6. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  7. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  8. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  9. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  10. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  21. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  22. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  23. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  24. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  25. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  26. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  27. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  33. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  58. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  59. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  60. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  61. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  62. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  63. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  64. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  65. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  66. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  67. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  68. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  69. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  70. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  71. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  72. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  73. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  90. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  91. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  92. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  93. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  94. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  95. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  96. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  97. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  98. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  99. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  100. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  101. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  102. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  103. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  104. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  105. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  106. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  107. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  108. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  116. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  117. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  118. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  119. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  120. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  121. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  122. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  123. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  124. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  125. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  126. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  127. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  128. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  129. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  130. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  131. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  132. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  133. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  134. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  135. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  136. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  137. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  138. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  139. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  140. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  141. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  142. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  143. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  144. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  145. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  146. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  147. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  148. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  149. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  150. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  151. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  152. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  153. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  154. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  155. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  156. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  157. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  158. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  159. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  160. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  161. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  162. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  163. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  164. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  165. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  166. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  167. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  168. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  169. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  170. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  171. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  172. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  173. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  174. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  175. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  176. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  177. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  178. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  179. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  180. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  181. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  182. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  183. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  184. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  185. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  186. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  187. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  188. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  189. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  190. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  191. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  192. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  193. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  194. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  195. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  196. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  197. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  198. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  199. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  200. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  201. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  202. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  203. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  204. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  205. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  206. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  207. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  208. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  209. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  210. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  211. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  212. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  213. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  214. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  215. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  216. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  217. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  218. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  219. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  220. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  221. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  222. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  223. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  224. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  225. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  226. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  227. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  228. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  229. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  230. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  231. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  233. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  234. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  235. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  236. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  246. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  248. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  249. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  250. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  251. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  252. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  253. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  254. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  255. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  256. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  257. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  258. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  259. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  260. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  261. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  262. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  263. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  264. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  265. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  266. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  267. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  285. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  286. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  287. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  288. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  289. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  290. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  291. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  292. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  293. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  294. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  295. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  296. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  298. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  299. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  300. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  301. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  302. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  303. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  304. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  305. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  306. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  307. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  308. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  309. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  310. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  311. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  312. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  313. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  314. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  315. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  316. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  317. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  318. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  319. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  320. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  321. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  322. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  323. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  324. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  325. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  326. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  327. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  328. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  329. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  330. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  331. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  332. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  333. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  334. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  418. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  419. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  420. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  421. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  422. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  423. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  424. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  425. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  426. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  427. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  428. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  429. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  430. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  431. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  432. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  433. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  434. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  435. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  436. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  437. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  438. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  439. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  440. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  441. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  442. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  443. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  444. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  445. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  446. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  447. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  448. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  449. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  450. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  451. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  452. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  453. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  454. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  455. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  456. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  457. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  458. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  459. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  460. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  461. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  462. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  463. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  464. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  465. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  466. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  467. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  468. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  469. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  470. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  471. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  472. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  473. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  474. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  475. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  476. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  477. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  478. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  479. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  480. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  481. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  482. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  483. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  484. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  485. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  486. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  487. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  489. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  490. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  491. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  492. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  493. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  494. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  495. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  496. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  497. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  498. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  499. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  500. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  501. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  502. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  503. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  504. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  505. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  506. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  507. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  508. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  509. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  510. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  511. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  512. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  513. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  514. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  515. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  516. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  517. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  518. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  519. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  520. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  521. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  522. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  523. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  524. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  525. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  526. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  527. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  528. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  529. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  530. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  531. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  532. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  533. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  534. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  535. package/deps/rocksdb/rocksdb/src.mk +631 -0
  536. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  537. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  539. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  540. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  541. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  542. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  543. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  599. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  600. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  601. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  602. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  603. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  604. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  605. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  606. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  607. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  608. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  611. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  612. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  613. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  614. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  615. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  616. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  617. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  618. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  619. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  620. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  621. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  622. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  623. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  624. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  625. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  626. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  627. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  628. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  629. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  630. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  631. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  632. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  633. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  634. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  635. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  642. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  643. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  644. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  645. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  646. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  647. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  648. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  649. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  650. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  651. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  652. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  653. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  654. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  655. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  656. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  657. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  658. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  659. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  660. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  661. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  662. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  663. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  664. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  665. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  666. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  667. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  668. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  669. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  670. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  671. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  672. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  673. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  674. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  675. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  676. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  677. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  713. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  714. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  715. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  716. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  717. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  718. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  719. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  720. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  721. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  722. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  726. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  727. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  728. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  729. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  730. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  731. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  732. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  733. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  734. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  735. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  736. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  737. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  738. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  739. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  740. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  741. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  742. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  743. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  744. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  745. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  746. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  747. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  748. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  749. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  750. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  751. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  752. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  753. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  754. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  755. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  756. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  757. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  760. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  761. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  762. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  763. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  764. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  765. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  766. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  767. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  768. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  769. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  770. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  771. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  772. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  773. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  774. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  775. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  776. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  777. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  778. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  779. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  780. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  781. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  782. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  783. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  784. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  785. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  786. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  790. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  791. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  792. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  793. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  794. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  795. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  796. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  797. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  798. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  799. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  800. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  801. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  802. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  803. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  804. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  805. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  806. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  807. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  808. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  809. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  810. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  811. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  812. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  813. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  814. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  815. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  816. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  817. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  818. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  819. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  820. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  821. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  822. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  823. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  824. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  825. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  826. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  827. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  828. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  829. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  830. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  831. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  832. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  833. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  834. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  835. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  836. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  837. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  838. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  839. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  840. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  841. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  842. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  843. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  844. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  845. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  846. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  847. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  848. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  849. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  850. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  851. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  852. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  853. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  854. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  855. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  856. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  857. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  858. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  859. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  860. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  861. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  862. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  872. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  873. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  874. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  875. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  876. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  877. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  885. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  886. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  887. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  888. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  889. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  890. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  891. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  892. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  894. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  895. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  896. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  897. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  898. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  899. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  900. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  901. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  902. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  903. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  904. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  905. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  906. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  907. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  908. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  909. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  910. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  911. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  919. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  920. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  921. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  922. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  923. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  924. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  925. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  926. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  927. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  928. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  929. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  930. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  945. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  946. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  947. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  948. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  949. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  950. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  951. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  952. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  953. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  954. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  955. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  956. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  957. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  958. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  959. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  960. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1041. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1042. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1043. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1044. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1045. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1046. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1047. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1048. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1049. package/iterator.js +39 -34
  1050. package/leveldown.js +33 -84
  1051. package/package-lock.json +23687 -0
  1052. package/package.json +4 -4
@@ -0,0 +1,3427 @@
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 <algorithm>
11
+ #include <string>
12
+ #include <thread>
13
+ #include <vector>
14
+
15
+ #include "db/db_impl/db_impl.h"
16
+ #include "db/db_test_util.h"
17
+ #include "options/options_parser.h"
18
+ #include "port/port.h"
19
+ #include "port/stack_trace.h"
20
+ #include "rocksdb/convenience.h"
21
+ #include "rocksdb/db.h"
22
+ #include "rocksdb/env.h"
23
+ #include "rocksdb/iterator.h"
24
+ #include "rocksdb/utilities/object_registry.h"
25
+ #include "test_util/sync_point.h"
26
+ #include "test_util/testharness.h"
27
+ #include "test_util/testutil.h"
28
+ #include "util/coding.h"
29
+ #include "util/string_util.h"
30
+ #include "utilities/fault_injection_env.h"
31
+ #include "utilities/merge_operators.h"
32
+
33
+ namespace ROCKSDB_NAMESPACE {
34
+
35
+ static const int kValueSize = 1000;
36
+
37
+ // counts how many operations were performed
38
+ class EnvCounter : public SpecialEnv {
39
+ public:
40
+ explicit EnvCounter(Env* base)
41
+ : SpecialEnv(base), num_new_writable_file_(0) {}
42
+ int GetNumberOfNewWritableFileCalls() {
43
+ return num_new_writable_file_;
44
+ }
45
+ Status NewWritableFile(const std::string& f, std::unique_ptr<WritableFile>* r,
46
+ const EnvOptions& soptions) override {
47
+ ++num_new_writable_file_;
48
+ return EnvWrapper::NewWritableFile(f, r, soptions);
49
+ }
50
+
51
+ private:
52
+ std::atomic<int> num_new_writable_file_;
53
+ };
54
+
55
+ class ColumnFamilyTestBase : public testing::Test {
56
+ public:
57
+ explicit ColumnFamilyTestBase(uint32_t format) : rnd_(139), format_(format) {
58
+ Env* base_env = Env::Default();
59
+ #ifndef ROCKSDB_LITE
60
+ const char* test_env_uri = getenv("TEST_ENV_URI");
61
+ if (test_env_uri) {
62
+ Env* test_env = nullptr;
63
+ Status s = Env::LoadEnv(test_env_uri, &test_env, &env_guard_);
64
+ base_env = test_env;
65
+ EXPECT_OK(s);
66
+ EXPECT_NE(Env::Default(), base_env);
67
+ }
68
+ #endif // !ROCKSDB_LITE
69
+ EXPECT_NE(nullptr, base_env);
70
+ env_ = new EnvCounter(base_env);
71
+ env_->skip_fsync_ = true;
72
+ dbname_ = test::PerThreadDBPath("column_family_test");
73
+ db_options_.create_if_missing = true;
74
+ db_options_.fail_if_options_file_error = true;
75
+ db_options_.env = env_;
76
+ EXPECT_OK(DestroyDB(dbname_, Options(db_options_, column_family_options_)));
77
+ }
78
+
79
+ ~ColumnFamilyTestBase() override {
80
+ std::vector<ColumnFamilyDescriptor> column_families;
81
+ for (auto h : handles_) {
82
+ ColumnFamilyDescriptor cfdescriptor;
83
+ Status s = h->GetDescriptor(&cfdescriptor);
84
+ #ifdef ROCKSDB_LITE
85
+ EXPECT_TRUE(s.IsNotSupported());
86
+ #else
87
+ EXPECT_OK(s);
88
+ #endif // ROCKSDB_LITE
89
+ column_families.push_back(cfdescriptor);
90
+ }
91
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
92
+ Destroy(column_families);
93
+ delete env_;
94
+ }
95
+
96
+ BlockBasedTableOptions GetBlockBasedTableOptions() {
97
+ BlockBasedTableOptions options;
98
+ options.format_version = format_;
99
+ return options;
100
+ }
101
+
102
+ // Return the value to associate with the specified key
103
+ Slice Value(int k, std::string* storage) {
104
+ if (k == 0) {
105
+ // Ugh. Random seed of 0 used to produce no entropy. This code
106
+ // preserves the implementation that was in place when all of the
107
+ // magic values in this file were picked.
108
+ *storage = std::string(kValueSize, ' ');
109
+ } else {
110
+ Random r(k);
111
+ *storage = r.RandomString(kValueSize);
112
+ }
113
+ return Slice(*storage);
114
+ }
115
+
116
+ void Build(int base, int n, int flush_every = 0) {
117
+ std::string key_space, value_space;
118
+ WriteBatch batch;
119
+
120
+ for (int i = 0; i < n; i++) {
121
+ if (flush_every != 0 && i != 0 && i % flush_every == 0) {
122
+ DBImpl* dbi = static_cast_with_check<DBImpl>(db_);
123
+ dbi->TEST_FlushMemTable();
124
+ }
125
+
126
+ int keyi = base + i;
127
+ Slice key(DBTestBase::Key(keyi));
128
+
129
+ batch.Clear();
130
+ batch.Put(handles_[0], key, Value(keyi, &value_space));
131
+ batch.Put(handles_[1], key, Value(keyi, &value_space));
132
+ batch.Put(handles_[2], key, Value(keyi, &value_space));
133
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
134
+ }
135
+ }
136
+
137
+ void CheckMissed() {
138
+ uint64_t next_expected = 0;
139
+ uint64_t missed = 0;
140
+ int bad_keys = 0;
141
+ int bad_values = 0;
142
+ int correct = 0;
143
+ std::string value_space;
144
+ for (int cf = 0; cf < 3; cf++) {
145
+ next_expected = 0;
146
+ Iterator* iter = db_->NewIterator(ReadOptions(false, true), handles_[cf]);
147
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
148
+ uint64_t key;
149
+ Slice in(iter->key());
150
+ in.remove_prefix(3);
151
+ if (!ConsumeDecimalNumber(&in, &key) || !in.empty() ||
152
+ key < next_expected) {
153
+ bad_keys++;
154
+ continue;
155
+ }
156
+ missed += (key - next_expected);
157
+ next_expected = key + 1;
158
+ if (iter->value() != Value(static_cast<int>(key), &value_space)) {
159
+ bad_values++;
160
+ } else {
161
+ correct++;
162
+ }
163
+ }
164
+ delete iter;
165
+ }
166
+
167
+ ASSERT_EQ(0, bad_keys);
168
+ ASSERT_EQ(0, bad_values);
169
+ ASSERT_EQ(0, missed);
170
+ (void)correct;
171
+ }
172
+
173
+ void Close() {
174
+ for (auto h : handles_) {
175
+ if (h) {
176
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(h));
177
+ }
178
+ }
179
+ handles_.clear();
180
+ names_.clear();
181
+ delete db_;
182
+ db_ = nullptr;
183
+ }
184
+
185
+ Status TryOpen(std::vector<std::string> cf,
186
+ std::vector<ColumnFamilyOptions> options = {}) {
187
+ std::vector<ColumnFamilyDescriptor> column_families;
188
+ names_.clear();
189
+ for (size_t i = 0; i < cf.size(); ++i) {
190
+ column_families.emplace_back(
191
+ cf[i], options.size() == 0 ? column_family_options_ : options[i]);
192
+ names_.push_back(cf[i]);
193
+ }
194
+ return DB::Open(db_options_, dbname_, column_families, &handles_, &db_);
195
+ }
196
+
197
+ Status OpenReadOnly(std::vector<std::string> cf,
198
+ std::vector<ColumnFamilyOptions> options = {}) {
199
+ std::vector<ColumnFamilyDescriptor> column_families;
200
+ names_.clear();
201
+ for (size_t i = 0; i < cf.size(); ++i) {
202
+ column_families.emplace_back(
203
+ cf[i], options.size() == 0 ? column_family_options_ : options[i]);
204
+ names_.push_back(cf[i]);
205
+ }
206
+ return DB::OpenForReadOnly(db_options_, dbname_, column_families, &handles_,
207
+ &db_);
208
+ }
209
+
210
+ #ifndef ROCKSDB_LITE // ReadOnlyDB is not supported
211
+ void AssertOpenReadOnly(std::vector<std::string> cf,
212
+ std::vector<ColumnFamilyOptions> options = {}) {
213
+ ASSERT_OK(OpenReadOnly(cf, options));
214
+ }
215
+ #endif // !ROCKSDB_LITE
216
+
217
+
218
+ void Open(std::vector<std::string> cf,
219
+ std::vector<ColumnFamilyOptions> options = {}) {
220
+ ASSERT_OK(TryOpen(cf, options));
221
+ }
222
+
223
+ void Open() {
224
+ Open({"default"});
225
+ }
226
+
227
+ DBImpl* dbfull() { return static_cast_with_check<DBImpl>(db_); }
228
+
229
+ int GetProperty(int cf, std::string property) {
230
+ std::string value;
231
+ EXPECT_TRUE(dbfull()->GetProperty(handles_[cf], property, &value));
232
+ #ifndef CYGWIN
233
+ return std::stoi(value);
234
+ #else
235
+ return std::strtol(value.c_str(), 0 /* off */, 10 /* base */);
236
+ #endif
237
+ }
238
+
239
+ bool IsDbWriteStopped() {
240
+ #ifndef ROCKSDB_LITE
241
+ uint64_t v;
242
+ EXPECT_TRUE(dbfull()->GetIntProperty("rocksdb.is-write-stopped", &v));
243
+ return (v == 1);
244
+ #else
245
+ return dbfull()->TEST_write_controler().IsStopped();
246
+ #endif // !ROCKSDB_LITE
247
+ }
248
+
249
+ uint64_t GetDbDelayedWriteRate() {
250
+ #ifndef ROCKSDB_LITE
251
+ uint64_t v;
252
+ EXPECT_TRUE(
253
+ dbfull()->GetIntProperty("rocksdb.actual-delayed-write-rate", &v));
254
+ return v;
255
+ #else
256
+ if (!dbfull()->TEST_write_controler().NeedsDelay()) {
257
+ return 0;
258
+ }
259
+ return dbfull()->TEST_write_controler().delayed_write_rate();
260
+ #endif // !ROCKSDB_LITE
261
+ }
262
+
263
+ void Destroy(const std::vector<ColumnFamilyDescriptor>& column_families =
264
+ std::vector<ColumnFamilyDescriptor>()) {
265
+ Close();
266
+ ASSERT_OK(DestroyDB(dbname_, Options(db_options_, column_family_options_),
267
+ column_families));
268
+ }
269
+
270
+ void CreateColumnFamilies(
271
+ const std::vector<std::string>& cfs,
272
+ const std::vector<ColumnFamilyOptions> options = {}) {
273
+ int cfi = static_cast<int>(handles_.size());
274
+ handles_.resize(cfi + cfs.size());
275
+ names_.resize(cfi + cfs.size());
276
+ for (size_t i = 0; i < cfs.size(); ++i) {
277
+ const auto& current_cf_opt =
278
+ options.size() == 0 ? column_family_options_ : options[i];
279
+ ASSERT_OK(
280
+ db_->CreateColumnFamily(current_cf_opt, cfs[i], &handles_[cfi]));
281
+ names_[cfi] = cfs[i];
282
+
283
+ #ifndef ROCKSDB_LITE // RocksDBLite does not support GetDescriptor
284
+ // Verify the CF options of the returned CF handle.
285
+ ColumnFamilyDescriptor desc;
286
+ ASSERT_OK(handles_[cfi]->GetDescriptor(&desc));
287
+ // Need to sanitize the default column family options before comparing
288
+ // them.
289
+ ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(
290
+ ConfigOptions(), desc.options,
291
+ SanitizeOptions(dbfull()->immutable_db_options(), current_cf_opt)));
292
+ #endif // !ROCKSDB_LITE
293
+ cfi++;
294
+ }
295
+ }
296
+
297
+ void Reopen(const std::vector<ColumnFamilyOptions> options = {}) {
298
+ std::vector<std::string> names;
299
+ for (auto name : names_) {
300
+ if (name != "") {
301
+ names.push_back(name);
302
+ }
303
+ }
304
+ Close();
305
+ assert(options.size() == 0 || names.size() == options.size());
306
+ Open(names, options);
307
+ }
308
+
309
+ void CreateColumnFamiliesAndReopen(const std::vector<std::string>& cfs) {
310
+ CreateColumnFamilies(cfs);
311
+ Reopen();
312
+ }
313
+
314
+ void DropColumnFamilies(const std::vector<int>& cfs) {
315
+ for (auto cf : cfs) {
316
+ ASSERT_OK(db_->DropColumnFamily(handles_[cf]));
317
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(handles_[cf]));
318
+ handles_[cf] = nullptr;
319
+ names_[cf] = "";
320
+ }
321
+ }
322
+
323
+ void PutRandomData(int cf, int num, int key_value_size, bool save = false) {
324
+ if (cf >= static_cast<int>(keys_.size())) {
325
+ keys_.resize(cf + 1);
326
+ }
327
+ for (int i = 0; i < num; ++i) {
328
+ // 10 bytes for key, rest is value
329
+ if (!save) {
330
+ ASSERT_OK(Put(cf, test::RandomKey(&rnd_, 11),
331
+ rnd_.RandomString(key_value_size - 10)));
332
+ } else {
333
+ std::string key = test::RandomKey(&rnd_, 11);
334
+ keys_[cf].insert(key);
335
+ ASSERT_OK(Put(cf, key, rnd_.RandomString(key_value_size - 10)));
336
+ }
337
+ }
338
+ ASSERT_OK(db_->FlushWAL(/*sync=*/false));
339
+ }
340
+
341
+ #ifndef ROCKSDB_LITE // TEST functions in DB are not supported in lite
342
+ void WaitForFlush(int cf) {
343
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[cf]));
344
+ }
345
+
346
+ void WaitForCompaction() {
347
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
348
+ }
349
+
350
+ uint64_t MaxTotalInMemoryState() {
351
+ return dbfull()->TEST_MaxTotalInMemoryState();
352
+ }
353
+
354
+ void AssertMaxTotalInMemoryState(uint64_t value) {
355
+ ASSERT_EQ(value, MaxTotalInMemoryState());
356
+ }
357
+ #endif // !ROCKSDB_LITE
358
+
359
+ Status Put(int cf, const std::string& key, const std::string& value) {
360
+ return db_->Put(WriteOptions(), handles_[cf], Slice(key), Slice(value));
361
+ }
362
+ Status Merge(int cf, const std::string& key, const std::string& value) {
363
+ return db_->Merge(WriteOptions(), handles_[cf], Slice(key), Slice(value));
364
+ }
365
+ Status Flush(int cf) {
366
+ return db_->Flush(FlushOptions(), handles_[cf]);
367
+ }
368
+
369
+ std::string Get(int cf, const std::string& key) {
370
+ ReadOptions options;
371
+ options.verify_checksums = true;
372
+ std::string result;
373
+ Status s = db_->Get(options, handles_[cf], Slice(key), &result);
374
+ if (s.IsNotFound()) {
375
+ result = "NOT_FOUND";
376
+ } else if (!s.ok()) {
377
+ result = s.ToString();
378
+ }
379
+ return result;
380
+ }
381
+
382
+ void CompactAll(int cf) {
383
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[cf], nullptr,
384
+ nullptr));
385
+ }
386
+
387
+ void Compact(int cf, const Slice& start, const Slice& limit) {
388
+ ASSERT_OK(
389
+ db_->CompactRange(CompactRangeOptions(), handles_[cf], &start, &limit));
390
+ }
391
+
392
+ int NumTableFilesAtLevel(int level, int cf) {
393
+ return GetProperty(cf,
394
+ "rocksdb.num-files-at-level" + ToString(level));
395
+ }
396
+
397
+ #ifndef ROCKSDB_LITE
398
+ // Return spread of files per level
399
+ std::string FilesPerLevel(int cf) {
400
+ std::string result;
401
+ int last_non_zero_offset = 0;
402
+ for (int level = 0; level < dbfull()->NumberLevels(handles_[cf]); level++) {
403
+ int f = NumTableFilesAtLevel(level, cf);
404
+ char buf[100];
405
+ snprintf(buf, sizeof(buf), "%s%d", (level ? "," : ""), f);
406
+ result += buf;
407
+ if (f > 0) {
408
+ last_non_zero_offset = static_cast<int>(result.size());
409
+ }
410
+ }
411
+ result.resize(last_non_zero_offset);
412
+ return result;
413
+ }
414
+ #endif
415
+
416
+ void AssertFilesPerLevel(const std::string& value, int cf) {
417
+ #ifndef ROCKSDB_LITE
418
+ ASSERT_EQ(value, FilesPerLevel(cf));
419
+ #else
420
+ (void) value;
421
+ (void) cf;
422
+ #endif
423
+ }
424
+
425
+ #ifndef ROCKSDB_LITE // GetLiveFilesMetaData is not supported
426
+ int CountLiveFiles() {
427
+ std::vector<LiveFileMetaData> metadata;
428
+ db_->GetLiveFilesMetaData(&metadata);
429
+ return static_cast<int>(metadata.size());
430
+ }
431
+ #endif // !ROCKSDB_LITE
432
+
433
+ void AssertCountLiveFiles(int expected_value) {
434
+ #ifndef ROCKSDB_LITE
435
+ ASSERT_EQ(expected_value, CountLiveFiles());
436
+ #else
437
+ (void) expected_value;
438
+ #endif
439
+ }
440
+
441
+ // Do n memtable flushes, each of which produces an sstable
442
+ // covering the range [small,large].
443
+ void MakeTables(int cf, int n, const std::string& small,
444
+ const std::string& large) {
445
+ for (int i = 0; i < n; i++) {
446
+ ASSERT_OK(Put(cf, small, "begin"));
447
+ ASSERT_OK(Put(cf, large, "end"));
448
+ ASSERT_OK(db_->Flush(FlushOptions(), handles_[cf]));
449
+ }
450
+ }
451
+
452
+ #ifndef ROCKSDB_LITE // GetSortedWalFiles is not supported
453
+ int CountLiveLogFiles() {
454
+ int micros_wait_for_log_deletion = 20000;
455
+ env_->SleepForMicroseconds(micros_wait_for_log_deletion);
456
+ int ret = 0;
457
+ VectorLogPtr wal_files;
458
+ Status s;
459
+ // GetSortedWalFiles is a flakey function -- it gets all the wal_dir
460
+ // children files and then later checks for their existence. if some of the
461
+ // log files doesn't exist anymore, it reports an error. it does all of this
462
+ // without DB mutex held, so if a background process deletes the log file
463
+ // while the function is being executed, it returns an error. We retry the
464
+ // function 10 times to avoid the error failing the test
465
+ for (int retries = 0; retries < 10; ++retries) {
466
+ wal_files.clear();
467
+ s = db_->GetSortedWalFiles(wal_files);
468
+ if (s.ok()) {
469
+ break;
470
+ }
471
+ }
472
+ EXPECT_OK(s);
473
+ for (const auto& wal : wal_files) {
474
+ if (wal->Type() == kAliveLogFile) {
475
+ ++ret;
476
+ }
477
+ }
478
+ return ret;
479
+ return 0;
480
+ }
481
+ #endif // !ROCKSDB_LITE
482
+
483
+ void AssertCountLiveLogFiles(int value) {
484
+ #ifndef ROCKSDB_LITE // GetSortedWalFiles is not supported
485
+ ASSERT_EQ(value, CountLiveLogFiles());
486
+ #else
487
+ (void) value;
488
+ #endif // !ROCKSDB_LITE
489
+ }
490
+
491
+ void AssertNumberOfImmutableMemtables(std::vector<int> num_per_cf) {
492
+ assert(num_per_cf.size() == handles_.size());
493
+
494
+ #ifndef ROCKSDB_LITE // GetProperty is not supported in lite
495
+ for (size_t i = 0; i < num_per_cf.size(); ++i) {
496
+ ASSERT_EQ(num_per_cf[i], GetProperty(static_cast<int>(i),
497
+ "rocksdb.num-immutable-mem-table"));
498
+ }
499
+ #endif // !ROCKSDB_LITE
500
+ }
501
+
502
+ void CopyFile(const std::string& source, const std::string& destination,
503
+ uint64_t size = 0) {
504
+ const EnvOptions soptions;
505
+ std::unique_ptr<SequentialFile> srcfile;
506
+ ASSERT_OK(env_->NewSequentialFile(source, &srcfile, soptions));
507
+ std::unique_ptr<WritableFile> destfile;
508
+ ASSERT_OK(env_->NewWritableFile(destination, &destfile, soptions));
509
+
510
+ if (size == 0) {
511
+ // default argument means copy everything
512
+ ASSERT_OK(env_->GetFileSize(source, &size));
513
+ }
514
+
515
+ char buffer[4096];
516
+ Slice slice;
517
+ while (size > 0) {
518
+ uint64_t one = std::min(uint64_t(sizeof(buffer)), size);
519
+ ASSERT_OK(srcfile->Read(one, &slice, buffer));
520
+ ASSERT_OK(destfile->Append(slice));
521
+ size -= slice.size();
522
+ }
523
+ ASSERT_OK(destfile->Close());
524
+ }
525
+
526
+ int GetSstFileCount(std::string path) {
527
+ std::vector<std::string> files;
528
+ DBTestBase::GetSstFiles(env_, path, &files);
529
+ return static_cast<int>(files.size());
530
+ }
531
+
532
+ void RecalculateWriteStallConditions(ColumnFamilyData* cfd,
533
+ const MutableCFOptions& mutable_cf_options) {
534
+ // add lock to avoid race condition between
535
+ // `RecalculateWriteStallConditions` which writes to CFStats and
536
+ // background `DBImpl::DumpStats()` threads which read CFStats
537
+ dbfull()->TEST_LockMutex();
538
+ cfd->RecalculateWriteStallConditions(mutable_cf_options);
539
+ dbfull()-> TEST_UnlockMutex();
540
+ }
541
+
542
+ std::vector<ColumnFamilyHandle*> handles_;
543
+ std::vector<std::string> names_;
544
+ std::vector<std::set<std::string>> keys_;
545
+ ColumnFamilyOptions column_family_options_;
546
+ DBOptions db_options_;
547
+ std::string dbname_;
548
+ DB* db_ = nullptr;
549
+ EnvCounter* env_;
550
+ std::shared_ptr<Env> env_guard_;
551
+ Random rnd_;
552
+ uint32_t format_;
553
+ };
554
+
555
+ class ColumnFamilyTest
556
+ : public ColumnFamilyTestBase,
557
+ virtual public ::testing::WithParamInterface<uint32_t> {
558
+ public:
559
+ ColumnFamilyTest() : ColumnFamilyTestBase(GetParam()) {}
560
+ };
561
+
562
+ INSTANTIATE_TEST_CASE_P(FormatDef, ColumnFamilyTest,
563
+ testing::Values(test::kDefaultFormatVersion));
564
+ INSTANTIATE_TEST_CASE_P(FormatLatest, ColumnFamilyTest,
565
+ testing::Values(test::kLatestFormatVersion));
566
+
567
+ TEST_P(ColumnFamilyTest, DontReuseColumnFamilyID) {
568
+ for (int iter = 0; iter < 3; ++iter) {
569
+ Open();
570
+ CreateColumnFamilies({"one", "two", "three"});
571
+ for (size_t i = 0; i < handles_.size(); ++i) {
572
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(handles_[i]);
573
+ ASSERT_EQ(i, cfh->GetID());
574
+ }
575
+ if (iter == 1) {
576
+ Reopen();
577
+ }
578
+ DropColumnFamilies({3});
579
+ Reopen();
580
+ if (iter == 2) {
581
+ // this tests if max_column_family is correctly persisted with
582
+ // WriteSnapshot()
583
+ Reopen();
584
+ }
585
+ CreateColumnFamilies({"three2"});
586
+ // ID 3 that was used for dropped column family "three" should not be
587
+ // reused
588
+ auto cfh3 = static_cast_with_check<ColumnFamilyHandleImpl>(handles_[3]);
589
+ ASSERT_EQ(4U, cfh3->GetID());
590
+ Close();
591
+ Destroy();
592
+ }
593
+ }
594
+
595
+ #ifndef ROCKSDB_LITE
596
+ TEST_P(ColumnFamilyTest, CreateCFRaceWithGetAggProperty) {
597
+ Open();
598
+
599
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
600
+ {{"DBImpl::WriteOptionsFile:1",
601
+ "ColumnFamilyTest.CreateCFRaceWithGetAggProperty:1"},
602
+ {"ColumnFamilyTest.CreateCFRaceWithGetAggProperty:2",
603
+ "DBImpl::WriteOptionsFile:2"}});
604
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
605
+
606
+ ROCKSDB_NAMESPACE::port::Thread thread(
607
+ [&] { CreateColumnFamilies({"one"}); });
608
+
609
+ TEST_SYNC_POINT("ColumnFamilyTest.CreateCFRaceWithGetAggProperty:1");
610
+ uint64_t pv;
611
+ db_->GetAggregatedIntProperty(DB::Properties::kEstimateTableReadersMem, &pv);
612
+ TEST_SYNC_POINT("ColumnFamilyTest.CreateCFRaceWithGetAggProperty:2");
613
+
614
+ thread.join();
615
+
616
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
617
+ }
618
+ #endif // !ROCKSDB_LITE
619
+
620
+ class FlushEmptyCFTestWithParam
621
+ : public ColumnFamilyTestBase,
622
+ virtual public testing::WithParamInterface<std::tuple<uint32_t, bool>> {
623
+ public:
624
+ FlushEmptyCFTestWithParam()
625
+ : ColumnFamilyTestBase(std::get<0>(GetParam())),
626
+ allow_2pc_(std::get<1>(GetParam())) {}
627
+
628
+ // Required if inheriting from testing::WithParamInterface<>
629
+ static void SetUpTestCase() {}
630
+ static void TearDownTestCase() {}
631
+
632
+ bool allow_2pc_;
633
+ };
634
+
635
+ TEST_P(FlushEmptyCFTestWithParam, FlushEmptyCFTest) {
636
+ std::unique_ptr<FaultInjectionTestEnv> fault_env(
637
+ new FaultInjectionTestEnv(env_));
638
+ db_options_.env = fault_env.get();
639
+ db_options_.allow_2pc = allow_2pc_;
640
+ Open();
641
+ CreateColumnFamilies({"one", "two"});
642
+ // Generate log file A.
643
+ ASSERT_OK(Put(1, "foo", "v1")); // seqID 1
644
+
645
+ Reopen();
646
+ // Log file A is not dropped after reopening because default column family's
647
+ // min log number is 0.
648
+ // It flushes to SST file X
649
+ ASSERT_OK(Put(1, "foo", "v1")); // seqID 2
650
+ ASSERT_OK(Put(1, "bar", "v2")); // seqID 3
651
+ // Current log file is file B now. While flushing, a new log file C is created
652
+ // and is set to current. Boths' min log number is set to file C in memory, so
653
+ // after flushing file B is deleted. At the same time, the min log number of
654
+ // default CF is not written to manifest. Log file A still remains.
655
+ // Flushed to SST file Y.
656
+ ASSERT_OK(Flush(1));
657
+ ASSERT_OK(Flush(0));
658
+ ASSERT_OK(Put(1, "bar", "v3")); // seqID 4
659
+ ASSERT_OK(Put(1, "foo", "v4")); // seqID 5
660
+ ASSERT_OK(db_->FlushWAL(/*sync=*/false));
661
+
662
+ // Preserve file system state up to here to simulate a crash condition.
663
+ fault_env->SetFilesystemActive(false);
664
+ std::vector<std::string> names;
665
+ for (auto name : names_) {
666
+ if (name != "") {
667
+ names.push_back(name);
668
+ }
669
+ }
670
+
671
+ Close();
672
+ fault_env->ResetState();
673
+
674
+ // Before opening, there are four files:
675
+ // Log file A contains seqID 1
676
+ // Log file C contains seqID 4, 5
677
+ // SST file X contains seqID 1
678
+ // SST file Y contains seqID 2, 3
679
+ // Min log number:
680
+ // default CF: 0
681
+ // CF one, two: C
682
+ // When opening the DB, all the seqID should be preserved.
683
+ Open(names, {});
684
+ ASSERT_EQ("v4", Get(1, "foo"));
685
+ ASSERT_EQ("v3", Get(1, "bar"));
686
+ Close();
687
+
688
+ db_options_.env = env_;
689
+ }
690
+
691
+ TEST_P(FlushEmptyCFTestWithParam, FlushEmptyCFTest2) {
692
+ std::unique_ptr<FaultInjectionTestEnv> fault_env(
693
+ new FaultInjectionTestEnv(env_));
694
+ db_options_.env = fault_env.get();
695
+ db_options_.allow_2pc = allow_2pc_;
696
+ Open();
697
+ CreateColumnFamilies({"one", "two"});
698
+ // Generate log file A.
699
+ ASSERT_OK(Put(1, "foo", "v1")); // seqID 1
700
+
701
+ Reopen();
702
+ // Log file A is not dropped after reopening because default column family's
703
+ // min log number is 0.
704
+ // It flushes to SST file X
705
+ ASSERT_OK(Put(1, "foo", "v1")); // seqID 2
706
+ ASSERT_OK(Put(1, "bar", "v2")); // seqID 3
707
+ // Current log file is file B now. While flushing, a new log file C is created
708
+ // and is set to current. Both CFs' min log number is set to file C so after
709
+ // flushing file B is deleted. Log file A still remains.
710
+ // Flushed to SST file Y.
711
+ ASSERT_OK(Flush(1));
712
+ ASSERT_OK(Put(0, "bar", "v2")); // seqID 4
713
+ ASSERT_OK(Put(2, "bar", "v2")); // seqID 5
714
+ ASSERT_OK(Put(1, "bar", "v3")); // seqID 6
715
+ // Flushing all column families. This forces all CFs' min log to current. This
716
+ // is written to the manifest file. Log file C is cleared.
717
+ ASSERT_OK(Flush(0));
718
+ ASSERT_OK(Flush(1));
719
+ ASSERT_OK(Flush(2));
720
+ // Write to log file D
721
+ ASSERT_OK(Put(1, "bar", "v4")); // seqID 7
722
+ ASSERT_OK(Put(1, "bar", "v5")); // seqID 8
723
+ ASSERT_OK(db_->FlushWAL(/*sync=*/false));
724
+ // Preserve file system state up to here to simulate a crash condition.
725
+ fault_env->SetFilesystemActive(false);
726
+ std::vector<std::string> names;
727
+ for (auto name : names_) {
728
+ if (name != "") {
729
+ names.push_back(name);
730
+ }
731
+ }
732
+
733
+ Close();
734
+ fault_env->ResetState();
735
+ // Before opening, there are two logfiles:
736
+ // Log file A contains seqID 1
737
+ // Log file D contains seqID 7, 8
738
+ // Min log number:
739
+ // default CF: D
740
+ // CF one, two: D
741
+ // When opening the DB, log file D should be replayed using the seqID
742
+ // specified in the file.
743
+ Open(names, {});
744
+ ASSERT_EQ("v1", Get(1, "foo"));
745
+ ASSERT_EQ("v5", Get(1, "bar"));
746
+ Close();
747
+
748
+ db_options_.env = env_;
749
+ }
750
+
751
+ INSTANTIATE_TEST_CASE_P(
752
+ FormatDef, FlushEmptyCFTestWithParam,
753
+ testing::Values(std::make_tuple(test::kDefaultFormatVersion, true),
754
+ std::make_tuple(test::kDefaultFormatVersion, false)));
755
+ INSTANTIATE_TEST_CASE_P(
756
+ FormatLatest, FlushEmptyCFTestWithParam,
757
+ testing::Values(std::make_tuple(test::kLatestFormatVersion, true),
758
+ std::make_tuple(test::kLatestFormatVersion, false)));
759
+
760
+ TEST_P(ColumnFamilyTest, AddDrop) {
761
+ Open();
762
+ CreateColumnFamilies({"one", "two", "three"});
763
+ ASSERT_EQ("NOT_FOUND", Get(1, "fodor"));
764
+ ASSERT_EQ("NOT_FOUND", Get(2, "fodor"));
765
+ DropColumnFamilies({2});
766
+ ASSERT_EQ("NOT_FOUND", Get(1, "fodor"));
767
+ CreateColumnFamilies({"four"});
768
+ ASSERT_EQ("NOT_FOUND", Get(3, "fodor"));
769
+ ASSERT_OK(Put(1, "fodor", "mirko"));
770
+ ASSERT_EQ("mirko", Get(1, "fodor"));
771
+ ASSERT_EQ("NOT_FOUND", Get(3, "fodor"));
772
+ Close();
773
+ ASSERT_TRUE(TryOpen({"default"}).IsInvalidArgument());
774
+ Open({"default", "one", "three", "four"});
775
+ DropColumnFamilies({1});
776
+ Reopen();
777
+ Close();
778
+
779
+ std::vector<std::string> families;
780
+ ASSERT_OK(DB::ListColumnFamilies(db_options_, dbname_, &families));
781
+ std::sort(families.begin(), families.end());
782
+ ASSERT_TRUE(families ==
783
+ std::vector<std::string>({"default", "four", "three"}));
784
+ }
785
+
786
+ TEST_P(ColumnFamilyTest, BulkAddDrop) {
787
+ constexpr int kNumCF = 1000;
788
+ ColumnFamilyOptions cf_options;
789
+ WriteOptions write_options;
790
+ Open();
791
+ std::vector<std::string> cf_names;
792
+ std::vector<ColumnFamilyHandle*> cf_handles;
793
+ for (int i = 1; i <= kNumCF; i++) {
794
+ cf_names.push_back("cf1-" + ToString(i));
795
+ }
796
+ ASSERT_OK(db_->CreateColumnFamilies(cf_options, cf_names, &cf_handles));
797
+ for (int i = 1; i <= kNumCF; i++) {
798
+ ASSERT_OK(db_->Put(write_options, cf_handles[i - 1], "foo", "bar"));
799
+ }
800
+ ASSERT_OK(db_->DropColumnFamilies(cf_handles));
801
+ std::vector<ColumnFamilyDescriptor> cf_descriptors;
802
+ for (auto* handle : cf_handles) {
803
+ delete handle;
804
+ }
805
+ cf_handles.clear();
806
+ for (int i = 1; i <= kNumCF; i++) {
807
+ cf_descriptors.emplace_back("cf2-" + ToString(i), ColumnFamilyOptions());
808
+ }
809
+ ASSERT_OK(db_->CreateColumnFamilies(cf_descriptors, &cf_handles));
810
+ for (int i = 1; i <= kNumCF; i++) {
811
+ ASSERT_OK(db_->Put(write_options, cf_handles[i - 1], "foo", "bar"));
812
+ }
813
+ ASSERT_OK(db_->DropColumnFamilies(cf_handles));
814
+ for (auto* handle : cf_handles) {
815
+ delete handle;
816
+ }
817
+ Close();
818
+ std::vector<std::string> families;
819
+ ASSERT_OK(DB::ListColumnFamilies(db_options_, dbname_, &families));
820
+ std::sort(families.begin(), families.end());
821
+ ASSERT_TRUE(families == std::vector<std::string>({"default"}));
822
+ }
823
+
824
+ TEST_P(ColumnFamilyTest, DropTest) {
825
+ // first iteration - don't reopen DB before dropping
826
+ // second iteration - reopen DB before dropping
827
+ for (int iter = 0; iter < 2; ++iter) {
828
+ Open({"default"});
829
+ CreateColumnFamiliesAndReopen({"pikachu"});
830
+ for (int i = 0; i < 100; ++i) {
831
+ ASSERT_OK(Put(1, ToString(i), "bar" + ToString(i)));
832
+ }
833
+ ASSERT_OK(Flush(1));
834
+
835
+ if (iter == 1) {
836
+ Reopen();
837
+ }
838
+ ASSERT_EQ("bar1", Get(1, "1"));
839
+
840
+ AssertCountLiveFiles(1);
841
+ DropColumnFamilies({1});
842
+ // make sure that all files are deleted when we drop the column family
843
+ AssertCountLiveFiles(0);
844
+ Destroy();
845
+ }
846
+ }
847
+
848
+ TEST_P(ColumnFamilyTest, WriteBatchFailure) {
849
+ Open();
850
+ CreateColumnFamiliesAndReopen({"one", "two"});
851
+ WriteBatch batch;
852
+ ASSERT_OK(batch.Put(handles_[0], Slice("existing"), Slice("column-family")));
853
+ ASSERT_OK(
854
+ batch.Put(handles_[1], Slice("non-existing"), Slice("column-family")));
855
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
856
+ DropColumnFamilies({1});
857
+ WriteOptions woptions_ignore_missing_cf;
858
+ woptions_ignore_missing_cf.ignore_missing_column_families = true;
859
+ ASSERT_OK(
860
+ batch.Put(handles_[0], Slice("still here"), Slice("column-family")));
861
+ ASSERT_OK(db_->Write(woptions_ignore_missing_cf, &batch));
862
+ ASSERT_EQ("column-family", Get(0, "still here"));
863
+ Status s = db_->Write(WriteOptions(), &batch);
864
+ ASSERT_TRUE(s.IsInvalidArgument());
865
+ Close();
866
+ }
867
+
868
+ TEST_P(ColumnFamilyTest, ReadWrite) {
869
+ Open();
870
+ CreateColumnFamiliesAndReopen({"one", "two"});
871
+ ASSERT_OK(Put(0, "foo", "v1"));
872
+ ASSERT_OK(Put(0, "bar", "v2"));
873
+ ASSERT_OK(Put(1, "mirko", "v3"));
874
+ ASSERT_OK(Put(0, "foo", "v2"));
875
+ ASSERT_OK(Put(2, "fodor", "v5"));
876
+
877
+ for (int iter = 0; iter <= 3; ++iter) {
878
+ ASSERT_EQ("v2", Get(0, "foo"));
879
+ ASSERT_EQ("v2", Get(0, "bar"));
880
+ ASSERT_EQ("v3", Get(1, "mirko"));
881
+ ASSERT_EQ("v5", Get(2, "fodor"));
882
+ ASSERT_EQ("NOT_FOUND", Get(0, "fodor"));
883
+ ASSERT_EQ("NOT_FOUND", Get(1, "fodor"));
884
+ ASSERT_EQ("NOT_FOUND", Get(2, "foo"));
885
+ if (iter <= 1) {
886
+ Reopen();
887
+ }
888
+ }
889
+ Close();
890
+ }
891
+
892
+ TEST_P(ColumnFamilyTest, IgnoreRecoveredLog) {
893
+ std::string backup_logs = dbname_ + "/backup_logs";
894
+
895
+ // delete old files in backup_logs directory
896
+ ASSERT_OK(env_->CreateDirIfMissing(dbname_));
897
+ ASSERT_OK(env_->CreateDirIfMissing(backup_logs));
898
+ std::vector<std::string> old_files;
899
+ ASSERT_OK(env_->GetChildren(backup_logs, &old_files));
900
+ for (auto& file : old_files) {
901
+ ASSERT_OK(env_->DeleteFile(backup_logs + "/" + file));
902
+ }
903
+
904
+ column_family_options_.merge_operator =
905
+ MergeOperators::CreateUInt64AddOperator();
906
+ db_options_.wal_dir = dbname_ + "/logs";
907
+ Destroy();
908
+ Open();
909
+ CreateColumnFamilies({"cf1", "cf2"});
910
+
911
+ // fill up the DB
912
+ std::string one, two, three;
913
+ PutFixed64(&one, 1);
914
+ PutFixed64(&two, 2);
915
+ PutFixed64(&three, 3);
916
+ ASSERT_OK(Merge(0, "foo", one));
917
+ ASSERT_OK(Merge(1, "mirko", one));
918
+ ASSERT_OK(Merge(0, "foo", one));
919
+ ASSERT_OK(Merge(2, "bla", one));
920
+ ASSERT_OK(Merge(2, "fodor", one));
921
+ ASSERT_OK(Merge(0, "bar", one));
922
+ ASSERT_OK(Merge(2, "bla", one));
923
+ ASSERT_OK(Merge(1, "mirko", two));
924
+ ASSERT_OK(Merge(1, "franjo", one));
925
+
926
+ // copy the logs to backup
927
+ std::vector<std::string> logs;
928
+ ASSERT_OK(env_->GetChildren(db_options_.wal_dir, &logs));
929
+ for (auto& log : logs) {
930
+ CopyFile(db_options_.wal_dir + "/" + log, backup_logs + "/" + log);
931
+ }
932
+
933
+ // recover the DB
934
+ Close();
935
+
936
+ // 1. check consistency
937
+ // 2. copy the logs from backup back to WAL dir. if the recovery happens
938
+ // again on the same log files, this should lead to incorrect results
939
+ // due to applying merge operator twice
940
+ // 3. check consistency
941
+ for (int iter = 0; iter < 2; ++iter) {
942
+ // assert consistency
943
+ Open({"default", "cf1", "cf2"});
944
+ ASSERT_EQ(two, Get(0, "foo"));
945
+ ASSERT_EQ(one, Get(0, "bar"));
946
+ ASSERT_EQ(three, Get(1, "mirko"));
947
+ ASSERT_EQ(one, Get(1, "franjo"));
948
+ ASSERT_EQ(one, Get(2, "fodor"));
949
+ ASSERT_EQ(two, Get(2, "bla"));
950
+ Close();
951
+
952
+ if (iter == 0) {
953
+ // copy the logs from backup back to wal dir
954
+ for (auto& log : logs) {
955
+ CopyFile(backup_logs + "/" + log, db_options_.wal_dir + "/" + log);
956
+ }
957
+ }
958
+ }
959
+ }
960
+
961
+ #ifndef ROCKSDB_LITE // TEST functions used are not supported
962
+ TEST_P(ColumnFamilyTest, FlushTest) {
963
+ Open();
964
+ CreateColumnFamiliesAndReopen({"one", "two"});
965
+ ASSERT_OK(Put(0, "foo", "v1"));
966
+ ASSERT_OK(Put(0, "bar", "v2"));
967
+ ASSERT_OK(Put(1, "mirko", "v3"));
968
+ ASSERT_OK(Put(0, "foo", "v2"));
969
+ ASSERT_OK(Put(2, "fodor", "v5"));
970
+
971
+ for (int j = 0; j < 2; j++) {
972
+ ReadOptions ro;
973
+ std::vector<Iterator*> iterators;
974
+ // Hold super version.
975
+ if (j == 0) {
976
+ ASSERT_OK(db_->NewIterators(ro, handles_, &iterators));
977
+ }
978
+
979
+ for (int i = 0; i < 3; ++i) {
980
+ uint64_t max_total_in_memory_state =
981
+ MaxTotalInMemoryState();
982
+ ASSERT_OK(Flush(i));
983
+ AssertMaxTotalInMemoryState(max_total_in_memory_state);
984
+ }
985
+ ASSERT_OK(Put(1, "foofoo", "bar"));
986
+ ASSERT_OK(Put(0, "foofoo", "bar"));
987
+
988
+ for (auto* it : iterators) {
989
+ ASSERT_OK(it->status());
990
+ delete it;
991
+ }
992
+ }
993
+ Reopen();
994
+
995
+ for (int iter = 0; iter <= 2; ++iter) {
996
+ ASSERT_EQ("v2", Get(0, "foo"));
997
+ ASSERT_EQ("v2", Get(0, "bar"));
998
+ ASSERT_EQ("v3", Get(1, "mirko"));
999
+ ASSERT_EQ("v5", Get(2, "fodor"));
1000
+ ASSERT_EQ("NOT_FOUND", Get(0, "fodor"));
1001
+ ASSERT_EQ("NOT_FOUND", Get(1, "fodor"));
1002
+ ASSERT_EQ("NOT_FOUND", Get(2, "foo"));
1003
+ if (iter <= 1) {
1004
+ Reopen();
1005
+ }
1006
+ }
1007
+ Close();
1008
+ }
1009
+
1010
+ // Makes sure that obsolete log files get deleted
1011
+ TEST_P(ColumnFamilyTest, LogDeletionTest) {
1012
+ db_options_.max_total_wal_size = std::numeric_limits<uint64_t>::max();
1013
+ column_family_options_.arena_block_size = 4 * 1024;
1014
+ column_family_options_.write_buffer_size = 128000; // 128KB
1015
+ Open();
1016
+ CreateColumnFamilies({"one", "two", "three", "four"});
1017
+ // Each bracket is one log file. if number is in (), it means
1018
+ // we don't need it anymore (it's been flushed)
1019
+ // []
1020
+ AssertCountLiveLogFiles(0);
1021
+ PutRandomData(0, 1, 128);
1022
+ // [0]
1023
+ PutRandomData(1, 1, 128);
1024
+ // [0, 1]
1025
+ PutRandomData(1, 1000, 128);
1026
+ WaitForFlush(1);
1027
+ // [0, (1)] [1]
1028
+ AssertCountLiveLogFiles(2);
1029
+ PutRandomData(0, 1, 128);
1030
+ // [0, (1)] [0, 1]
1031
+ AssertCountLiveLogFiles(2);
1032
+ PutRandomData(2, 1, 128);
1033
+ // [0, (1)] [0, 1, 2]
1034
+ PutRandomData(2, 1000, 128);
1035
+ WaitForFlush(2);
1036
+ // [0, (1)] [0, 1, (2)] [2]
1037
+ AssertCountLiveLogFiles(3);
1038
+ PutRandomData(2, 1000, 128);
1039
+ WaitForFlush(2);
1040
+ // [0, (1)] [0, 1, (2)] [(2)] [2]
1041
+ AssertCountLiveLogFiles(4);
1042
+ PutRandomData(3, 1, 128);
1043
+ // [0, (1)] [0, 1, (2)] [(2)] [2, 3]
1044
+ PutRandomData(1, 1, 128);
1045
+ // [0, (1)] [0, 1, (2)] [(2)] [1, 2, 3]
1046
+ AssertCountLiveLogFiles(4);
1047
+ PutRandomData(1, 1000, 128);
1048
+ WaitForFlush(1);
1049
+ // [0, (1)] [0, (1), (2)] [(2)] [(1), 2, 3] [1]
1050
+ AssertCountLiveLogFiles(5);
1051
+ PutRandomData(0, 1000, 128);
1052
+ WaitForFlush(0);
1053
+ // [(0), (1)] [(0), (1), (2)] [(2)] [(1), 2, 3] [1, (0)] [0]
1054
+ // delete obsolete logs -->
1055
+ // [(1), 2, 3] [1, (0)] [0]
1056
+ AssertCountLiveLogFiles(3);
1057
+ PutRandomData(0, 1000, 128);
1058
+ WaitForFlush(0);
1059
+ // [(1), 2, 3] [1, (0)], [(0)] [0]
1060
+ AssertCountLiveLogFiles(4);
1061
+ PutRandomData(1, 1000, 128);
1062
+ WaitForFlush(1);
1063
+ // [(1), 2, 3] [(1), (0)] [(0)] [0, (1)] [1]
1064
+ AssertCountLiveLogFiles(5);
1065
+ PutRandomData(2, 1000, 128);
1066
+ WaitForFlush(2);
1067
+ // [(1), (2), 3] [(1), (0)] [(0)] [0, (1)] [1, (2)], [2]
1068
+ AssertCountLiveLogFiles(6);
1069
+ PutRandomData(3, 1000, 128);
1070
+ WaitForFlush(3);
1071
+ // [(1), (2), (3)] [(1), (0)] [(0)] [0, (1)] [1, (2)], [2, (3)] [3]
1072
+ // delete obsolete logs -->
1073
+ // [0, (1)] [1, (2)], [2, (3)] [3]
1074
+ AssertCountLiveLogFiles(4);
1075
+ Close();
1076
+ }
1077
+ #endif // !ROCKSDB_LITE
1078
+
1079
+ TEST_P(ColumnFamilyTest, CrashAfterFlush) {
1080
+ std::unique_ptr<FaultInjectionTestEnv> fault_env(
1081
+ new FaultInjectionTestEnv(env_));
1082
+ db_options_.env = fault_env.get();
1083
+ Open();
1084
+ CreateColumnFamilies({"one"});
1085
+
1086
+ WriteBatch batch;
1087
+ ASSERT_OK(batch.Put(handles_[0], Slice("foo"), Slice("bar")));
1088
+ ASSERT_OK(batch.Put(handles_[1], Slice("foo"), Slice("bar")));
1089
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
1090
+ ASSERT_OK(Flush(0));
1091
+ fault_env->SetFilesystemActive(false);
1092
+
1093
+ std::vector<std::string> names;
1094
+ for (auto name : names_) {
1095
+ if (name != "") {
1096
+ names.push_back(name);
1097
+ }
1098
+ }
1099
+ Close();
1100
+ ASSERT_OK(fault_env->DropUnsyncedFileData());
1101
+ fault_env->ResetState();
1102
+ Open(names, {});
1103
+
1104
+ // Write batch should be atomic.
1105
+ ASSERT_EQ(Get(0, "foo"), Get(1, "foo"));
1106
+
1107
+ Close();
1108
+ db_options_.env = env_;
1109
+ }
1110
+
1111
+ TEST_P(ColumnFamilyTest, OpenNonexistentColumnFamily) {
1112
+ ASSERT_OK(TryOpen({"default"}));
1113
+ Close();
1114
+ ASSERT_TRUE(TryOpen({"default", "dne"}).IsInvalidArgument());
1115
+ }
1116
+
1117
+ #ifndef ROCKSDB_LITE // WaitForFlush() is not supported
1118
+ // Makes sure that obsolete log files get deleted
1119
+ TEST_P(ColumnFamilyTest, DifferentWriteBufferSizes) {
1120
+ // disable flushing stale column families
1121
+ db_options_.max_total_wal_size = std::numeric_limits<uint64_t>::max();
1122
+ Open();
1123
+ CreateColumnFamilies({"one", "two", "three"});
1124
+ ColumnFamilyOptions default_cf, one, two, three;
1125
+ // setup options. all column families have max_write_buffer_number setup to 10
1126
+ // "default" -> 100KB memtable, start flushing immediatelly
1127
+ // "one" -> 200KB memtable, start flushing with two immutable memtables
1128
+ // "two" -> 1MB memtable, start flushing with three immutable memtables
1129
+ // "three" -> 90KB memtable, start flushing with four immutable memtables
1130
+ default_cf.write_buffer_size = 100000;
1131
+ default_cf.arena_block_size = 4 * 4096;
1132
+ default_cf.max_write_buffer_number = 10;
1133
+ default_cf.min_write_buffer_number_to_merge = 1;
1134
+ default_cf.max_write_buffer_size_to_maintain = 0;
1135
+ one.write_buffer_size = 200000;
1136
+ one.arena_block_size = 4 * 4096;
1137
+ one.max_write_buffer_number = 10;
1138
+ one.min_write_buffer_number_to_merge = 2;
1139
+ one.max_write_buffer_size_to_maintain =
1140
+ static_cast<int>(one.write_buffer_size);
1141
+ two.write_buffer_size = 1000000;
1142
+ two.arena_block_size = 4 * 4096;
1143
+ two.max_write_buffer_number = 10;
1144
+ two.min_write_buffer_number_to_merge = 3;
1145
+ two.max_write_buffer_size_to_maintain =
1146
+ static_cast<int>(two.write_buffer_size);
1147
+ three.write_buffer_size = 4096 * 22;
1148
+ three.arena_block_size = 4096;
1149
+ three.max_write_buffer_number = 10;
1150
+ three.min_write_buffer_number_to_merge = 4;
1151
+ three.max_write_buffer_size_to_maintain =
1152
+ static_cast<int>(three.write_buffer_size);
1153
+
1154
+ Reopen({default_cf, one, two, three});
1155
+
1156
+ int micros_wait_for_flush = 10000;
1157
+ PutRandomData(0, 100, 1000);
1158
+ WaitForFlush(0);
1159
+ AssertNumberOfImmutableMemtables({0, 0, 0, 0});
1160
+ AssertCountLiveLogFiles(1);
1161
+ PutRandomData(1, 200, 1000);
1162
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1163
+ AssertNumberOfImmutableMemtables({0, 1, 0, 0});
1164
+ AssertCountLiveLogFiles(2);
1165
+ PutRandomData(2, 1000, 1000);
1166
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1167
+ AssertNumberOfImmutableMemtables({0, 1, 1, 0});
1168
+ AssertCountLiveLogFiles(3);
1169
+ PutRandomData(2, 1000, 1000);
1170
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1171
+ AssertNumberOfImmutableMemtables({0, 1, 2, 0});
1172
+ AssertCountLiveLogFiles(4);
1173
+ PutRandomData(3, 93, 990);
1174
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1175
+ AssertNumberOfImmutableMemtables({0, 1, 2, 1});
1176
+ AssertCountLiveLogFiles(5);
1177
+ PutRandomData(3, 88, 990);
1178
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1179
+ AssertNumberOfImmutableMemtables({0, 1, 2, 2});
1180
+ AssertCountLiveLogFiles(6);
1181
+ PutRandomData(3, 88, 990);
1182
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1183
+ AssertNumberOfImmutableMemtables({0, 1, 2, 3});
1184
+ AssertCountLiveLogFiles(7);
1185
+ PutRandomData(0, 100, 1000);
1186
+ WaitForFlush(0);
1187
+ AssertNumberOfImmutableMemtables({0, 1, 2, 3});
1188
+ AssertCountLiveLogFiles(8);
1189
+ PutRandomData(2, 100, 10000);
1190
+ WaitForFlush(2);
1191
+ AssertNumberOfImmutableMemtables({0, 1, 0, 3});
1192
+ AssertCountLiveLogFiles(9);
1193
+ PutRandomData(3, 88, 990);
1194
+ WaitForFlush(3);
1195
+ AssertNumberOfImmutableMemtables({0, 1, 0, 0});
1196
+ AssertCountLiveLogFiles(10);
1197
+ PutRandomData(3, 88, 990);
1198
+ env_->SleepForMicroseconds(micros_wait_for_flush);
1199
+ AssertNumberOfImmutableMemtables({0, 1, 0, 1});
1200
+ AssertCountLiveLogFiles(11);
1201
+ PutRandomData(1, 200, 1000);
1202
+ WaitForFlush(1);
1203
+ AssertNumberOfImmutableMemtables({0, 0, 0, 1});
1204
+ AssertCountLiveLogFiles(5);
1205
+ PutRandomData(3, 88 * 3, 990);
1206
+ WaitForFlush(3);
1207
+ PutRandomData(3, 88 * 4, 990);
1208
+ WaitForFlush(3);
1209
+ AssertNumberOfImmutableMemtables({0, 0, 0, 0});
1210
+ AssertCountLiveLogFiles(12);
1211
+ PutRandomData(0, 100, 1000);
1212
+ WaitForFlush(0);
1213
+ AssertNumberOfImmutableMemtables({0, 0, 0, 0});
1214
+ AssertCountLiveLogFiles(12);
1215
+ PutRandomData(2, 3 * 1000, 1000);
1216
+ WaitForFlush(2);
1217
+ AssertNumberOfImmutableMemtables({0, 0, 0, 0});
1218
+ AssertCountLiveLogFiles(12);
1219
+ PutRandomData(1, 2*200, 1000);
1220
+ WaitForFlush(1);
1221
+ AssertNumberOfImmutableMemtables({0, 0, 0, 0});
1222
+ AssertCountLiveLogFiles(7);
1223
+ Close();
1224
+ }
1225
+ #endif // !ROCKSDB_LITE
1226
+
1227
+ // The test is commented out because we want to test that snapshot is
1228
+ // not created for memtables not supported it, but There isn't a memtable
1229
+ // that doesn't support snapshot right now. If we have one later, we can
1230
+ // re-enable the test.
1231
+ //
1232
+ // #ifndef ROCKSDB_LITE // Cuckoo is not supported in lite
1233
+ // TEST_P(ColumnFamilyTest, MemtableNotSupportSnapshot) {
1234
+ // db_options_.allow_concurrent_memtable_write = false;
1235
+ // Open();
1236
+ // auto* s1 = dbfull()->GetSnapshot();
1237
+ // ASSERT_TRUE(s1 != nullptr);
1238
+ // dbfull()->ReleaseSnapshot(s1);
1239
+
1240
+ // // Add a column family that doesn't support snapshot
1241
+ // ColumnFamilyOptions first;
1242
+ // first.memtable_factory.reset(new DummyMemtableNotSupportingSnapshot());
1243
+ // CreateColumnFamilies({"first"}, {first});
1244
+ // auto* s2 = dbfull()->GetSnapshot();
1245
+ // ASSERT_TRUE(s2 == nullptr);
1246
+
1247
+ // // Add a column family that supports snapshot. Snapshot stays not
1248
+ // supported. ColumnFamilyOptions second; CreateColumnFamilies({"second"},
1249
+ // {second}); auto* s3 = dbfull()->GetSnapshot(); ASSERT_TRUE(s3 == nullptr);
1250
+ // Close();
1251
+ // }
1252
+ // #endif // !ROCKSDB_LITE
1253
+
1254
+ class TestComparator : public Comparator {
1255
+ int Compare(const ROCKSDB_NAMESPACE::Slice& /*a*/,
1256
+ const ROCKSDB_NAMESPACE::Slice& /*b*/) const override {
1257
+ return 0;
1258
+ }
1259
+ const char* Name() const override { return "Test"; }
1260
+ void FindShortestSeparator(
1261
+ std::string* /*start*/,
1262
+ const ROCKSDB_NAMESPACE::Slice& /*limit*/) const override {}
1263
+ void FindShortSuccessor(std::string* /*key*/) const override {}
1264
+ };
1265
+
1266
+ static TestComparator third_comparator;
1267
+ static TestComparator fourth_comparator;
1268
+
1269
+ // Test that we can retrieve the comparator from a created CF
1270
+ TEST_P(ColumnFamilyTest, GetComparator) {
1271
+ Open();
1272
+ // Add a column family with no comparator specified
1273
+ CreateColumnFamilies({"first"});
1274
+ const Comparator* comp = handles_[0]->GetComparator();
1275
+ ASSERT_EQ(comp, BytewiseComparator());
1276
+
1277
+ // Add three column families - one with no comparator and two
1278
+ // with comparators specified
1279
+ ColumnFamilyOptions second, third, fourth;
1280
+ second.comparator = &third_comparator;
1281
+ third.comparator = &fourth_comparator;
1282
+ CreateColumnFamilies({"second", "third", "fourth"}, {second, third, fourth});
1283
+ ASSERT_EQ(handles_[1]->GetComparator(), BytewiseComparator());
1284
+ ASSERT_EQ(handles_[2]->GetComparator(), &third_comparator);
1285
+ ASSERT_EQ(handles_[3]->GetComparator(), &fourth_comparator);
1286
+ Close();
1287
+ }
1288
+
1289
+ TEST_P(ColumnFamilyTest, DifferentMergeOperators) {
1290
+ Open();
1291
+ CreateColumnFamilies({"first", "second"});
1292
+ ColumnFamilyOptions default_cf, first, second;
1293
+ first.merge_operator = MergeOperators::CreateUInt64AddOperator();
1294
+ second.merge_operator = MergeOperators::CreateStringAppendOperator();
1295
+ Reopen({default_cf, first, second});
1296
+
1297
+ std::string one, two, three;
1298
+ PutFixed64(&one, 1);
1299
+ PutFixed64(&two, 2);
1300
+ PutFixed64(&three, 3);
1301
+
1302
+ ASSERT_OK(Put(0, "foo", two));
1303
+ ASSERT_OK(Put(0, "foo", one));
1304
+ ASSERT_TRUE(Merge(0, "foo", two).IsNotSupported());
1305
+ ASSERT_EQ(Get(0, "foo"), one);
1306
+
1307
+ ASSERT_OK(Put(1, "foo", two));
1308
+ ASSERT_OK(Put(1, "foo", one));
1309
+ ASSERT_OK(Merge(1, "foo", two));
1310
+ ASSERT_EQ(Get(1, "foo"), three);
1311
+
1312
+ ASSERT_OK(Put(2, "foo", two));
1313
+ ASSERT_OK(Put(2, "foo", one));
1314
+ ASSERT_OK(Merge(2, "foo", two));
1315
+ ASSERT_EQ(Get(2, "foo"), one + "," + two);
1316
+ Close();
1317
+ }
1318
+
1319
+ #ifndef ROCKSDB_LITE // WaitForFlush() is not supported
1320
+ TEST_P(ColumnFamilyTest, DifferentCompactionStyles) {
1321
+ Open();
1322
+ CreateColumnFamilies({"one", "two"});
1323
+ ColumnFamilyOptions default_cf, one, two;
1324
+ db_options_.max_open_files = 20; // only 10 files in file cache
1325
+
1326
+ default_cf.compaction_style = kCompactionStyleLevel;
1327
+ default_cf.num_levels = 3;
1328
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1329
+ default_cf.target_file_size_base = 30 << 10;
1330
+ default_cf.max_compaction_bytes = static_cast<uint64_t>(1) << 60;
1331
+
1332
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1333
+ table_options.no_block_cache = true;
1334
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1335
+
1336
+ one.compaction_style = kCompactionStyleUniversal;
1337
+
1338
+ one.num_levels = 1;
1339
+ // trigger compaction if there are >= 4 files
1340
+ one.level0_file_num_compaction_trigger = 4;
1341
+ one.write_buffer_size = 120000;
1342
+
1343
+ two.compaction_style = kCompactionStyleLevel;
1344
+ two.num_levels = 4;
1345
+ two.level0_file_num_compaction_trigger = 3;
1346
+ two.write_buffer_size = 100000;
1347
+
1348
+ Reopen({default_cf, one, two});
1349
+
1350
+ // SETUP column family "one" -- universal style
1351
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 1; ++i) {
1352
+ PutRandomData(1, 10, 12000);
1353
+ PutRandomData(1, 1, 10);
1354
+ WaitForFlush(1);
1355
+ AssertFilesPerLevel(ToString(i + 1), 1);
1356
+ }
1357
+
1358
+ // SETUP column family "two" -- level style with 4 levels
1359
+ for (int i = 0; i < two.level0_file_num_compaction_trigger - 1; ++i) {
1360
+ PutRandomData(2, 10, 12000);
1361
+ PutRandomData(2, 1, 10);
1362
+ WaitForFlush(2);
1363
+ AssertFilesPerLevel(ToString(i + 1), 2);
1364
+ }
1365
+
1366
+ // TRIGGER compaction "one"
1367
+ PutRandomData(1, 10, 12000);
1368
+ PutRandomData(1, 1, 10);
1369
+
1370
+ // TRIGGER compaction "two"
1371
+ PutRandomData(2, 10, 12000);
1372
+ PutRandomData(2, 1, 10);
1373
+
1374
+ // WAIT for compactions
1375
+ WaitForCompaction();
1376
+
1377
+ // VERIFY compaction "one"
1378
+ AssertFilesPerLevel("1", 1);
1379
+
1380
+ // VERIFY compaction "two"
1381
+ AssertFilesPerLevel("0,1", 2);
1382
+ CompactAll(2);
1383
+ AssertFilesPerLevel("0,1", 2);
1384
+
1385
+ Close();
1386
+ }
1387
+ #endif // !ROCKSDB_LITE
1388
+
1389
+ #ifndef ROCKSDB_LITE
1390
+ // Sync points not supported in RocksDB Lite
1391
+
1392
+ TEST_P(ColumnFamilyTest, MultipleManualCompactions) {
1393
+ Open();
1394
+ CreateColumnFamilies({"one", "two"});
1395
+ ColumnFamilyOptions default_cf, one, two;
1396
+ db_options_.max_open_files = 20; // only 10 files in file cache
1397
+ db_options_.max_background_compactions = 3;
1398
+
1399
+ default_cf.compaction_style = kCompactionStyleLevel;
1400
+ default_cf.num_levels = 3;
1401
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1402
+ default_cf.target_file_size_base = 30 << 10;
1403
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1404
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1405
+ table_options.no_block_cache = true;
1406
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1407
+
1408
+ one.compaction_style = kCompactionStyleUniversal;
1409
+
1410
+ one.num_levels = 1;
1411
+ // trigger compaction if there are >= 4 files
1412
+ one.level0_file_num_compaction_trigger = 4;
1413
+ one.write_buffer_size = 120000;
1414
+
1415
+ two.compaction_style = kCompactionStyleLevel;
1416
+ two.num_levels = 4;
1417
+ two.level0_file_num_compaction_trigger = 3;
1418
+ two.write_buffer_size = 100000;
1419
+
1420
+ Reopen({default_cf, one, two});
1421
+
1422
+ // SETUP column family "one" -- universal style
1423
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1424
+ PutRandomData(1, 10, 12000, true);
1425
+ PutRandomData(1, 1, 10, true);
1426
+ WaitForFlush(1);
1427
+ AssertFilesPerLevel(ToString(i + 1), 1);
1428
+ }
1429
+ bool cf_1_1 = true;
1430
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1431
+ {{"ColumnFamilyTest::MultiManual:4", "ColumnFamilyTest::MultiManual:1"},
1432
+ {"ColumnFamilyTest::MultiManual:2", "ColumnFamilyTest::MultiManual:5"},
1433
+ {"ColumnFamilyTest::MultiManual:2", "ColumnFamilyTest::MultiManual:3"}});
1434
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1435
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1436
+ if (cf_1_1) {
1437
+ TEST_SYNC_POINT("ColumnFamilyTest::MultiManual:4");
1438
+ cf_1_1 = false;
1439
+ TEST_SYNC_POINT("ColumnFamilyTest::MultiManual:3");
1440
+ }
1441
+ });
1442
+
1443
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1444
+ std::vector<port::Thread> threads;
1445
+ threads.emplace_back([&] {
1446
+ CompactRangeOptions compact_options;
1447
+ compact_options.exclusive_manual_compaction = false;
1448
+ ASSERT_OK(
1449
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1450
+ });
1451
+
1452
+ // SETUP column family "two" -- level style with 4 levels
1453
+ for (int i = 0; i < two.level0_file_num_compaction_trigger - 2; ++i) {
1454
+ PutRandomData(2, 10, 12000);
1455
+ PutRandomData(2, 1, 10);
1456
+ WaitForFlush(2);
1457
+ AssertFilesPerLevel(ToString(i + 1), 2);
1458
+ }
1459
+ threads.emplace_back([&] {
1460
+ TEST_SYNC_POINT("ColumnFamilyTest::MultiManual:1");
1461
+ CompactRangeOptions compact_options;
1462
+ compact_options.exclusive_manual_compaction = false;
1463
+ ASSERT_OK(
1464
+ db_->CompactRange(compact_options, handles_[2], nullptr, nullptr));
1465
+ TEST_SYNC_POINT("ColumnFamilyTest::MultiManual:2");
1466
+ });
1467
+
1468
+ TEST_SYNC_POINT("ColumnFamilyTest::MultiManual:5");
1469
+ for (auto& t : threads) {
1470
+ t.join();
1471
+ }
1472
+
1473
+ // VERIFY compaction "one"
1474
+ AssertFilesPerLevel("1", 1);
1475
+
1476
+ // VERIFY compaction "two"
1477
+ AssertFilesPerLevel("0,1", 2);
1478
+ CompactAll(2);
1479
+ AssertFilesPerLevel("0,1", 2);
1480
+ // Compare against saved keys
1481
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1482
+ while (key_iter != keys_[1].end()) {
1483
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1484
+ key_iter++;
1485
+ }
1486
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1487
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1488
+ Close();
1489
+ }
1490
+
1491
+ TEST_P(ColumnFamilyTest, AutomaticAndManualCompactions) {
1492
+ Open();
1493
+ CreateColumnFamilies({"one", "two"});
1494
+ ColumnFamilyOptions default_cf, one, two;
1495
+ db_options_.max_open_files = 20; // only 10 files in file cache
1496
+ db_options_.max_background_compactions = 3;
1497
+
1498
+ default_cf.compaction_style = kCompactionStyleLevel;
1499
+ default_cf.num_levels = 3;
1500
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1501
+ default_cf.target_file_size_base = 30 << 10;
1502
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1503
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1504
+ ;
1505
+ table_options.no_block_cache = true;
1506
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1507
+
1508
+ one.compaction_style = kCompactionStyleUniversal;
1509
+
1510
+ one.num_levels = 1;
1511
+ // trigger compaction if there are >= 4 files
1512
+ one.level0_file_num_compaction_trigger = 4;
1513
+ one.write_buffer_size = 120000;
1514
+
1515
+ two.compaction_style = kCompactionStyleLevel;
1516
+ two.num_levels = 4;
1517
+ two.level0_file_num_compaction_trigger = 3;
1518
+ two.write_buffer_size = 100000;
1519
+
1520
+ Reopen({default_cf, one, two});
1521
+ // make sure all background compaction jobs can be scheduled
1522
+ auto stop_token =
1523
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1524
+
1525
+ bool cf_1_1 = true;
1526
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1527
+ {{"ColumnFamilyTest::AutoManual:4", "ColumnFamilyTest::AutoManual:1"},
1528
+ {"ColumnFamilyTest::AutoManual:2", "ColumnFamilyTest::AutoManual:5"},
1529
+ {"ColumnFamilyTest::AutoManual:2", "ColumnFamilyTest::AutoManual:3"}});
1530
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1531
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1532
+ if (cf_1_1) {
1533
+ cf_1_1 = false;
1534
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:4");
1535
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:3");
1536
+ }
1537
+ });
1538
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1539
+ // SETUP column family "one" -- universal style
1540
+ for (int i = 0; i < one.level0_file_num_compaction_trigger; ++i) {
1541
+ PutRandomData(1, 10, 12000, true);
1542
+ PutRandomData(1, 1, 10, true);
1543
+ WaitForFlush(1);
1544
+ AssertFilesPerLevel(ToString(i + 1), 1);
1545
+ }
1546
+
1547
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:1");
1548
+
1549
+ // SETUP column family "two" -- level style with 4 levels
1550
+ for (int i = 0; i < two.level0_file_num_compaction_trigger - 2; ++i) {
1551
+ PutRandomData(2, 10, 12000);
1552
+ PutRandomData(2, 1, 10);
1553
+ WaitForFlush(2);
1554
+ AssertFilesPerLevel(ToString(i + 1), 2);
1555
+ }
1556
+ ROCKSDB_NAMESPACE::port::Thread threads([&] {
1557
+ CompactRangeOptions compact_options;
1558
+ compact_options.exclusive_manual_compaction = false;
1559
+ ASSERT_OK(
1560
+ db_->CompactRange(compact_options, handles_[2], nullptr, nullptr));
1561
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:2");
1562
+ });
1563
+
1564
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:5");
1565
+ threads.join();
1566
+
1567
+ // WAIT for compactions
1568
+ WaitForCompaction();
1569
+
1570
+ // VERIFY compaction "one"
1571
+ AssertFilesPerLevel("1", 1);
1572
+
1573
+ // VERIFY compaction "two"
1574
+ AssertFilesPerLevel("0,1", 2);
1575
+ CompactAll(2);
1576
+ AssertFilesPerLevel("0,1", 2);
1577
+ // Compare against saved keys
1578
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1579
+ while (key_iter != keys_[1].end()) {
1580
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1581
+ key_iter++;
1582
+ }
1583
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1584
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1585
+ }
1586
+
1587
+ TEST_P(ColumnFamilyTest, ManualAndAutomaticCompactions) {
1588
+ Open();
1589
+ CreateColumnFamilies({"one", "two"});
1590
+ ColumnFamilyOptions default_cf, one, two;
1591
+ db_options_.max_open_files = 20; // only 10 files in file cache
1592
+ db_options_.max_background_compactions = 3;
1593
+
1594
+ default_cf.compaction_style = kCompactionStyleLevel;
1595
+ default_cf.num_levels = 3;
1596
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1597
+ default_cf.target_file_size_base = 30 << 10;
1598
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1599
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1600
+ ;
1601
+ table_options.no_block_cache = true;
1602
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1603
+
1604
+ one.compaction_style = kCompactionStyleUniversal;
1605
+
1606
+ one.num_levels = 1;
1607
+ // trigger compaction if there are >= 4 files
1608
+ one.level0_file_num_compaction_trigger = 4;
1609
+ one.write_buffer_size = 120000;
1610
+
1611
+ two.compaction_style = kCompactionStyleLevel;
1612
+ two.num_levels = 4;
1613
+ two.level0_file_num_compaction_trigger = 3;
1614
+ two.write_buffer_size = 100000;
1615
+
1616
+ Reopen({default_cf, one, two});
1617
+ // make sure all background compaction jobs can be scheduled
1618
+ auto stop_token =
1619
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1620
+
1621
+ // SETUP column family "one" -- universal style
1622
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1623
+ PutRandomData(1, 10, 12000, true);
1624
+ PutRandomData(1, 1, 10, true);
1625
+ WaitForFlush(1);
1626
+ AssertFilesPerLevel(ToString(i + 1), 1);
1627
+ }
1628
+ bool cf_1_1 = true;
1629
+ bool cf_1_2 = true;
1630
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1631
+ {{"ColumnFamilyTest::ManualAuto:4", "ColumnFamilyTest::ManualAuto:1"},
1632
+ {"ColumnFamilyTest::ManualAuto:5", "ColumnFamilyTest::ManualAuto:2"},
1633
+ {"ColumnFamilyTest::ManualAuto:2", "ColumnFamilyTest::ManualAuto:3"}});
1634
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1635
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1636
+ if (cf_1_1) {
1637
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:4");
1638
+ cf_1_1 = false;
1639
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:3");
1640
+ } else if (cf_1_2) {
1641
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:2");
1642
+ cf_1_2 = false;
1643
+ }
1644
+ });
1645
+
1646
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1647
+ ROCKSDB_NAMESPACE::port::Thread threads([&] {
1648
+ CompactRangeOptions compact_options;
1649
+ compact_options.exclusive_manual_compaction = false;
1650
+ ASSERT_OK(
1651
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1652
+ });
1653
+
1654
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:1");
1655
+
1656
+ // SETUP column family "two" -- level style with 4 levels
1657
+ for (int i = 0; i < two.level0_file_num_compaction_trigger; ++i) {
1658
+ PutRandomData(2, 10, 12000);
1659
+ PutRandomData(2, 1, 10);
1660
+ WaitForFlush(2);
1661
+ AssertFilesPerLevel(ToString(i + 1), 2);
1662
+ }
1663
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:5");
1664
+ threads.join();
1665
+
1666
+ // WAIT for compactions
1667
+ WaitForCompaction();
1668
+
1669
+ // VERIFY compaction "one"
1670
+ AssertFilesPerLevel("1", 1);
1671
+
1672
+ // VERIFY compaction "two"
1673
+ AssertFilesPerLevel("0,1", 2);
1674
+ CompactAll(2);
1675
+ AssertFilesPerLevel("0,1", 2);
1676
+ // Compare against saved keys
1677
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1678
+ while (key_iter != keys_[1].end()) {
1679
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1680
+ key_iter++;
1681
+ }
1682
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1683
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1684
+ }
1685
+
1686
+ TEST_P(ColumnFamilyTest, SameCFManualManualCompactions) {
1687
+ Open();
1688
+ CreateColumnFamilies({"one"});
1689
+ ColumnFamilyOptions default_cf, one;
1690
+ db_options_.max_open_files = 20; // only 10 files in file cache
1691
+ db_options_.max_background_compactions = 3;
1692
+
1693
+ default_cf.compaction_style = kCompactionStyleLevel;
1694
+ default_cf.num_levels = 3;
1695
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1696
+ default_cf.target_file_size_base = 30 << 10;
1697
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1698
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1699
+ ;
1700
+ table_options.no_block_cache = true;
1701
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1702
+
1703
+ one.compaction_style = kCompactionStyleUniversal;
1704
+
1705
+ one.num_levels = 1;
1706
+ // trigger compaction if there are >= 4 files
1707
+ one.level0_file_num_compaction_trigger = 4;
1708
+ one.write_buffer_size = 120000;
1709
+
1710
+ Reopen({default_cf, one});
1711
+ // make sure all background compaction jobs can be scheduled
1712
+ auto stop_token =
1713
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1714
+
1715
+ // SETUP column family "one" -- universal style
1716
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1717
+ PutRandomData(1, 10, 12000, true);
1718
+ PutRandomData(1, 1, 10, true);
1719
+ WaitForFlush(1);
1720
+ AssertFilesPerLevel(ToString(i + 1), 1);
1721
+ }
1722
+ bool cf_1_1 = true;
1723
+ bool cf_1_2 = true;
1724
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1725
+ {{"ColumnFamilyTest::ManualManual:4", "ColumnFamilyTest::ManualManual:2"},
1726
+ {"ColumnFamilyTest::ManualManual:4", "ColumnFamilyTest::ManualManual:5"},
1727
+ {"ColumnFamilyTest::ManualManual:1", "ColumnFamilyTest::ManualManual:2"},
1728
+ {"ColumnFamilyTest::ManualManual:1",
1729
+ "ColumnFamilyTest::ManualManual:3"}});
1730
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1731
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1732
+ if (cf_1_1) {
1733
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualManual:4");
1734
+ cf_1_1 = false;
1735
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualManual:3");
1736
+ } else if (cf_1_2) {
1737
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualManual:2");
1738
+ cf_1_2 = false;
1739
+ }
1740
+ });
1741
+
1742
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1743
+ ROCKSDB_NAMESPACE::port::Thread threads([&] {
1744
+ CompactRangeOptions compact_options;
1745
+ compact_options.exclusive_manual_compaction = true;
1746
+ ASSERT_OK(
1747
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1748
+ });
1749
+
1750
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualManual:5");
1751
+
1752
+ WaitForFlush(1);
1753
+
1754
+ // Add more L0 files and force another manual compaction
1755
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1756
+ PutRandomData(1, 10, 12000, true);
1757
+ PutRandomData(1, 1, 10, true);
1758
+ WaitForFlush(1);
1759
+ AssertFilesPerLevel(ToString(one.level0_file_num_compaction_trigger + i),
1760
+ 1);
1761
+ }
1762
+
1763
+ ROCKSDB_NAMESPACE::port::Thread threads1([&] {
1764
+ CompactRangeOptions compact_options;
1765
+ compact_options.exclusive_manual_compaction = false;
1766
+ ASSERT_OK(
1767
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1768
+ });
1769
+
1770
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualManual:1");
1771
+
1772
+ threads.join();
1773
+ threads1.join();
1774
+ WaitForCompaction();
1775
+ // VERIFY compaction "one"
1776
+ ASSERT_LE(NumTableFilesAtLevel(0, 1), 2);
1777
+
1778
+ // Compare against saved keys
1779
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1780
+ while (key_iter != keys_[1].end()) {
1781
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1782
+ key_iter++;
1783
+ }
1784
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1785
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1786
+ }
1787
+
1788
+ TEST_P(ColumnFamilyTest, SameCFManualAutomaticCompactions) {
1789
+ Open();
1790
+ CreateColumnFamilies({"one"});
1791
+ ColumnFamilyOptions default_cf, one;
1792
+ db_options_.max_open_files = 20; // only 10 files in file cache
1793
+ db_options_.max_background_compactions = 3;
1794
+
1795
+ default_cf.compaction_style = kCompactionStyleLevel;
1796
+ default_cf.num_levels = 3;
1797
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1798
+ default_cf.target_file_size_base = 30 << 10;
1799
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1800
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1801
+ ;
1802
+ table_options.no_block_cache = true;
1803
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1804
+
1805
+ one.compaction_style = kCompactionStyleUniversal;
1806
+
1807
+ one.num_levels = 1;
1808
+ // trigger compaction if there are >= 4 files
1809
+ one.level0_file_num_compaction_trigger = 4;
1810
+ one.write_buffer_size = 120000;
1811
+
1812
+ Reopen({default_cf, one});
1813
+ // make sure all background compaction jobs can be scheduled
1814
+ auto stop_token =
1815
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1816
+
1817
+ // SETUP column family "one" -- universal style
1818
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1819
+ PutRandomData(1, 10, 12000, true);
1820
+ PutRandomData(1, 1, 10, true);
1821
+ WaitForFlush(1);
1822
+ AssertFilesPerLevel(ToString(i + 1), 1);
1823
+ }
1824
+ bool cf_1_1 = true;
1825
+ bool cf_1_2 = true;
1826
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1827
+ {{"ColumnFamilyTest::ManualAuto:4", "ColumnFamilyTest::ManualAuto:2"},
1828
+ {"ColumnFamilyTest::ManualAuto:4", "ColumnFamilyTest::ManualAuto:5"},
1829
+ {"ColumnFamilyTest::ManualAuto:1", "ColumnFamilyTest::ManualAuto:2"},
1830
+ {"ColumnFamilyTest::ManualAuto:1", "ColumnFamilyTest::ManualAuto:3"}});
1831
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1832
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1833
+ if (cf_1_1) {
1834
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:4");
1835
+ cf_1_1 = false;
1836
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:3");
1837
+ } else if (cf_1_2) {
1838
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:2");
1839
+ cf_1_2 = false;
1840
+ }
1841
+ });
1842
+
1843
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1844
+ ROCKSDB_NAMESPACE::port::Thread threads([&] {
1845
+ CompactRangeOptions compact_options;
1846
+ compact_options.exclusive_manual_compaction = false;
1847
+ ASSERT_OK(
1848
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1849
+ });
1850
+
1851
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:5");
1852
+
1853
+ WaitForFlush(1);
1854
+
1855
+ // Add more L0 files and force automatic compaction
1856
+ for (int i = 0; i < one.level0_file_num_compaction_trigger; ++i) {
1857
+ PutRandomData(1, 10, 12000, true);
1858
+ PutRandomData(1, 1, 10, true);
1859
+ WaitForFlush(1);
1860
+ AssertFilesPerLevel(ToString(one.level0_file_num_compaction_trigger + i),
1861
+ 1);
1862
+ }
1863
+
1864
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:1");
1865
+
1866
+ threads.join();
1867
+ WaitForCompaction();
1868
+ // VERIFY compaction "one"
1869
+ ASSERT_LE(NumTableFilesAtLevel(0, 1), 2);
1870
+
1871
+ // Compare against saved keys
1872
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1873
+ while (key_iter != keys_[1].end()) {
1874
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1875
+ key_iter++;
1876
+ }
1877
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1878
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1879
+ }
1880
+
1881
+ TEST_P(ColumnFamilyTest, SameCFManualAutomaticCompactionsLevel) {
1882
+ Open();
1883
+ CreateColumnFamilies({"one"});
1884
+ ColumnFamilyOptions default_cf, one;
1885
+ db_options_.max_open_files = 20; // only 10 files in file cache
1886
+ db_options_.max_background_compactions = 3;
1887
+
1888
+ default_cf.compaction_style = kCompactionStyleLevel;
1889
+ default_cf.num_levels = 3;
1890
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1891
+ default_cf.target_file_size_base = 30 << 10;
1892
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1893
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1894
+ ;
1895
+ table_options.no_block_cache = true;
1896
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1897
+
1898
+ one.compaction_style = kCompactionStyleLevel;
1899
+
1900
+ one.num_levels = 1;
1901
+ // trigger compaction if there are >= 4 files
1902
+ one.level0_file_num_compaction_trigger = 3;
1903
+ one.write_buffer_size = 120000;
1904
+
1905
+ Reopen({default_cf, one});
1906
+ // make sure all background compaction jobs can be scheduled
1907
+ auto stop_token =
1908
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1909
+
1910
+ // SETUP column family "one" -- level style
1911
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
1912
+ PutRandomData(1, 10, 12000, true);
1913
+ PutRandomData(1, 1, 10, true);
1914
+ WaitForFlush(1);
1915
+ AssertFilesPerLevel(ToString(i + 1), 1);
1916
+ }
1917
+ bool cf_1_1 = true;
1918
+ bool cf_1_2 = true;
1919
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1920
+ {{"ColumnFamilyTest::ManualAuto:4", "ColumnFamilyTest::ManualAuto:2"},
1921
+ {"ColumnFamilyTest::ManualAuto:4", "ColumnFamilyTest::ManualAuto:5"},
1922
+ {"ColumnFamilyTest::ManualAuto:3", "ColumnFamilyTest::ManualAuto:2"},
1923
+ {"LevelCompactionPicker::PickCompactionBySize:0",
1924
+ "ColumnFamilyTest::ManualAuto:3"},
1925
+ {"ColumnFamilyTest::ManualAuto:1", "ColumnFamilyTest::ManualAuto:3"}});
1926
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1927
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
1928
+ if (cf_1_1) {
1929
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:4");
1930
+ cf_1_1 = false;
1931
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:3");
1932
+ } else if (cf_1_2) {
1933
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:2");
1934
+ cf_1_2 = false;
1935
+ }
1936
+ });
1937
+
1938
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1939
+ ROCKSDB_NAMESPACE::port::Thread threads([&] {
1940
+ CompactRangeOptions compact_options;
1941
+ compact_options.exclusive_manual_compaction = false;
1942
+ ASSERT_OK(
1943
+ db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
1944
+ });
1945
+
1946
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:5");
1947
+
1948
+ // Add more L0 files and force automatic compaction
1949
+ for (int i = 0; i < one.level0_file_num_compaction_trigger; ++i) {
1950
+ PutRandomData(1, 10, 12000, true);
1951
+ PutRandomData(1, 1, 10, true);
1952
+ WaitForFlush(1);
1953
+ AssertFilesPerLevel(ToString(one.level0_file_num_compaction_trigger + i),
1954
+ 1);
1955
+ }
1956
+
1957
+ TEST_SYNC_POINT("ColumnFamilyTest::ManualAuto:1");
1958
+
1959
+ threads.join();
1960
+ WaitForCompaction();
1961
+ // VERIFY compaction "one"
1962
+ AssertFilesPerLevel("0,1", 1);
1963
+
1964
+ // Compare against saved keys
1965
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
1966
+ while (key_iter != keys_[1].end()) {
1967
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
1968
+ key_iter++;
1969
+ }
1970
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1971
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1972
+ }
1973
+
1974
+ // In this test, we generate enough files to trigger automatic compactions.
1975
+ // The automatic compaction waits in NonTrivial:AfterRun
1976
+ // We generate more files and then trigger an automatic compaction
1977
+ // This will wait because the automatic compaction has files it needs.
1978
+ // Once the conflict is hit, the automatic compaction starts and ends
1979
+ // Then the manual will run and end.
1980
+ TEST_P(ColumnFamilyTest, SameCFAutomaticManualCompactions) {
1981
+ Open();
1982
+ CreateColumnFamilies({"one"});
1983
+ ColumnFamilyOptions default_cf, one;
1984
+ db_options_.max_open_files = 20; // only 10 files in file cache
1985
+ db_options_.max_background_compactions = 3;
1986
+
1987
+ default_cf.compaction_style = kCompactionStyleLevel;
1988
+ default_cf.num_levels = 3;
1989
+ default_cf.write_buffer_size = 64 << 10; // 64KB
1990
+ default_cf.target_file_size_base = 30 << 10;
1991
+ default_cf.max_compaction_bytes = default_cf.target_file_size_base * 1100;
1992
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1993
+ ;
1994
+ table_options.no_block_cache = true;
1995
+ default_cf.table_factory.reset(NewBlockBasedTableFactory(table_options));
1996
+
1997
+ one.compaction_style = kCompactionStyleUniversal;
1998
+
1999
+ one.num_levels = 1;
2000
+ // trigger compaction if there are >= 4 files
2001
+ one.level0_file_num_compaction_trigger = 4;
2002
+ one.write_buffer_size = 120000;
2003
+
2004
+ Reopen({default_cf, one});
2005
+ // make sure all background compaction jobs can be scheduled
2006
+ auto stop_token =
2007
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
2008
+
2009
+ bool cf_1_1 = true;
2010
+ bool cf_1_2 = true;
2011
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
2012
+ {{"ColumnFamilyTest::AutoManual:4", "ColumnFamilyTest::AutoManual:2"},
2013
+ {"ColumnFamilyTest::AutoManual:4", "ColumnFamilyTest::AutoManual:5"},
2014
+ {"CompactionPicker::CompactRange:Conflict",
2015
+ "ColumnFamilyTest::AutoManual:3"}});
2016
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2017
+ "DBImpl::BackgroundCompaction:NonTrivial:AfterRun", [&](void* /*arg*/) {
2018
+ if (cf_1_1) {
2019
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:4");
2020
+ cf_1_1 = false;
2021
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:3");
2022
+ } else if (cf_1_2) {
2023
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:2");
2024
+ cf_1_2 = false;
2025
+ }
2026
+ });
2027
+
2028
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2029
+
2030
+ // SETUP column family "one" -- universal style
2031
+ for (int i = 0; i < one.level0_file_num_compaction_trigger; ++i) {
2032
+ PutRandomData(1, 10, 12000, true);
2033
+ PutRandomData(1, 1, 10, true);
2034
+ WaitForFlush(1);
2035
+ AssertFilesPerLevel(ToString(i + 1), 1);
2036
+ }
2037
+
2038
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:5");
2039
+
2040
+ // Add another L0 file and force automatic compaction
2041
+ for (int i = 0; i < one.level0_file_num_compaction_trigger - 2; ++i) {
2042
+ PutRandomData(1, 10, 12000, true);
2043
+ PutRandomData(1, 1, 10, true);
2044
+ WaitForFlush(1);
2045
+ }
2046
+
2047
+ CompactRangeOptions compact_options;
2048
+ compact_options.exclusive_manual_compaction = false;
2049
+ ASSERT_OK(db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
2050
+
2051
+ TEST_SYNC_POINT("ColumnFamilyTest::AutoManual:1");
2052
+
2053
+ WaitForCompaction();
2054
+ // VERIFY compaction "one"
2055
+ AssertFilesPerLevel("1", 1);
2056
+ // Compare against saved keys
2057
+ std::set<std::string>::iterator key_iter = keys_[1].begin();
2058
+ while (key_iter != keys_[1].end()) {
2059
+ ASSERT_NE("NOT_FOUND", Get(1, *key_iter));
2060
+ key_iter++;
2061
+ }
2062
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2063
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2064
+ }
2065
+ #endif // !ROCKSDB_LITE
2066
+
2067
+ #ifndef ROCKSDB_LITE // Tailing iterator not supported
2068
+ namespace {
2069
+ std::string IterStatus(Iterator* iter) {
2070
+ std::string result;
2071
+ if (iter->Valid()) {
2072
+ result = iter->key().ToString() + "->" + iter->value().ToString();
2073
+ } else {
2074
+ EXPECT_OK(iter->status());
2075
+ result = "(invalid)";
2076
+ }
2077
+ return result;
2078
+ }
2079
+ } // anonymous namespace
2080
+
2081
+ TEST_P(ColumnFamilyTest, NewIteratorsTest) {
2082
+ // iter == 0 -- no tailing
2083
+ // iter == 2 -- tailing
2084
+ for (int iter = 0; iter < 2; ++iter) {
2085
+ Open();
2086
+ CreateColumnFamiliesAndReopen({"one", "two"});
2087
+ ASSERT_OK(Put(0, "a", "b"));
2088
+ ASSERT_OK(Put(1, "b", "a"));
2089
+ ASSERT_OK(Put(2, "c", "m"));
2090
+ ASSERT_OK(Put(2, "v", "t"));
2091
+ std::vector<Iterator*> iterators;
2092
+ ReadOptions options;
2093
+ options.tailing = (iter == 1);
2094
+ ASSERT_OK(db_->NewIterators(options, handles_, &iterators));
2095
+
2096
+ for (auto it : iterators) {
2097
+ it->SeekToFirst();
2098
+ }
2099
+ ASSERT_EQ(IterStatus(iterators[0]), "a->b");
2100
+ ASSERT_EQ(IterStatus(iterators[1]), "b->a");
2101
+ ASSERT_EQ(IterStatus(iterators[2]), "c->m");
2102
+
2103
+ ASSERT_OK(Put(1, "x", "x"));
2104
+
2105
+ for (auto it : iterators) {
2106
+ it->Next();
2107
+ }
2108
+
2109
+ ASSERT_EQ(IterStatus(iterators[0]), "(invalid)");
2110
+ if (iter == 0) {
2111
+ // no tailing
2112
+ ASSERT_EQ(IterStatus(iterators[1]), "(invalid)");
2113
+ } else {
2114
+ // tailing
2115
+ ASSERT_EQ(IterStatus(iterators[1]), "x->x");
2116
+ }
2117
+ ASSERT_EQ(IterStatus(iterators[2]), "v->t");
2118
+
2119
+ for (auto it : iterators) {
2120
+ delete it;
2121
+ }
2122
+ Destroy();
2123
+ }
2124
+ }
2125
+ #endif // !ROCKSDB_LITE
2126
+
2127
+ #ifndef ROCKSDB_LITE // ReadOnlyDB is not supported
2128
+ TEST_P(ColumnFamilyTest, ReadOnlyDBTest) {
2129
+ Open();
2130
+ CreateColumnFamiliesAndReopen({"one", "two", "three", "four"});
2131
+ ASSERT_OK(Put(0, "a", "b"));
2132
+ ASSERT_OK(Put(1, "foo", "bla"));
2133
+ ASSERT_OK(Put(2, "foo", "blabla"));
2134
+ ASSERT_OK(Put(3, "foo", "blablabla"));
2135
+ ASSERT_OK(Put(4, "foo", "blablablabla"));
2136
+
2137
+ DropColumnFamilies({2});
2138
+ Close();
2139
+ // open only a subset of column families
2140
+ AssertOpenReadOnly({"default", "one", "four"});
2141
+ ASSERT_EQ("NOT_FOUND", Get(0, "foo"));
2142
+ ASSERT_EQ("bla", Get(1, "foo"));
2143
+ ASSERT_EQ("blablablabla", Get(2, "foo"));
2144
+
2145
+
2146
+ // test newiterators
2147
+ {
2148
+ std::vector<Iterator*> iterators;
2149
+ ASSERT_OK(db_->NewIterators(ReadOptions(), handles_, &iterators));
2150
+ for (auto it : iterators) {
2151
+ it->SeekToFirst();
2152
+ }
2153
+ ASSERT_EQ(IterStatus(iterators[0]), "a->b");
2154
+ ASSERT_EQ(IterStatus(iterators[1]), "foo->bla");
2155
+ ASSERT_EQ(IterStatus(iterators[2]), "foo->blablablabla");
2156
+ for (auto it : iterators) {
2157
+ it->Next();
2158
+ }
2159
+ ASSERT_EQ(IterStatus(iterators[0]), "(invalid)");
2160
+ ASSERT_EQ(IterStatus(iterators[1]), "(invalid)");
2161
+ ASSERT_EQ(IterStatus(iterators[2]), "(invalid)");
2162
+
2163
+ for (auto it : iterators) {
2164
+ delete it;
2165
+ }
2166
+ }
2167
+
2168
+ Close();
2169
+ // can't open dropped column family
2170
+ Status s = OpenReadOnly({"default", "one", "two"});
2171
+ ASSERT_TRUE(!s.ok());
2172
+
2173
+ // Can't open without specifying default column family
2174
+ s = OpenReadOnly({"one", "four"});
2175
+ ASSERT_TRUE(!s.ok());
2176
+ }
2177
+ #endif // !ROCKSDB_LITE
2178
+
2179
+ #ifndef ROCKSDB_LITE // WaitForFlush() is not supported in lite
2180
+ TEST_P(ColumnFamilyTest, DontRollEmptyLogs) {
2181
+ Open();
2182
+ CreateColumnFamiliesAndReopen({"one", "two", "three", "four"});
2183
+
2184
+ for (size_t i = 0; i < handles_.size(); ++i) {
2185
+ PutRandomData(static_cast<int>(i), 10, 100);
2186
+ }
2187
+ int num_writable_file_start = env_->GetNumberOfNewWritableFileCalls();
2188
+ // this will trigger the flushes
2189
+ for (int i = 0; i <= 4; ++i) {
2190
+ ASSERT_OK(Flush(i));
2191
+ }
2192
+
2193
+ for (int i = 0; i < 4; ++i) {
2194
+ WaitForFlush(i);
2195
+ }
2196
+ int total_new_writable_files =
2197
+ env_->GetNumberOfNewWritableFileCalls() - num_writable_file_start;
2198
+ ASSERT_EQ(static_cast<size_t>(total_new_writable_files), handles_.size() + 1);
2199
+ Close();
2200
+ }
2201
+ #endif // !ROCKSDB_LITE
2202
+
2203
+ #ifndef ROCKSDB_LITE // WaitForCompaction() is not supported in lite
2204
+ TEST_P(ColumnFamilyTest, FlushStaleColumnFamilies) {
2205
+ Open();
2206
+ CreateColumnFamilies({"one", "two"});
2207
+ ColumnFamilyOptions default_cf, one, two;
2208
+ default_cf.write_buffer_size = 100000; // small write buffer size
2209
+ default_cf.arena_block_size = 4096;
2210
+ default_cf.disable_auto_compactions = true;
2211
+ one.disable_auto_compactions = true;
2212
+ two.disable_auto_compactions = true;
2213
+ db_options_.max_total_wal_size = 210000;
2214
+
2215
+ Reopen({default_cf, one, two});
2216
+
2217
+ PutRandomData(2, 1, 10); // 10 bytes
2218
+ for (int i = 0; i < 2; ++i) {
2219
+ PutRandomData(0, 100, 1000); // flush
2220
+ WaitForFlush(0);
2221
+
2222
+ AssertCountLiveFiles(i + 1);
2223
+ }
2224
+ // third flush. now, CF [two] should be detected as stale and flushed
2225
+ // column family 1 should not be flushed since it's empty
2226
+ PutRandomData(0, 100, 1000); // flush
2227
+ WaitForFlush(0);
2228
+ WaitForFlush(2);
2229
+ // 3 files for default column families, 1 file for column family [two], zero
2230
+ // files for column family [one], because it's empty
2231
+ AssertCountLiveFiles(4);
2232
+
2233
+ ASSERT_OK(Flush(0));
2234
+ ASSERT_EQ(0, dbfull()->TEST_total_log_size());
2235
+ Close();
2236
+ }
2237
+ #endif // !ROCKSDB_LITE
2238
+
2239
+ TEST_P(ColumnFamilyTest, CreateMissingColumnFamilies) {
2240
+ Status s = TryOpen({"one", "two"});
2241
+ ASSERT_TRUE(!s.ok());
2242
+ db_options_.create_missing_column_families = true;
2243
+ s = TryOpen({"default", "one", "two"});
2244
+ ASSERT_TRUE(s.ok());
2245
+ Close();
2246
+ }
2247
+
2248
+ TEST_P(ColumnFamilyTest, SanitizeOptions) {
2249
+ DBOptions db_options;
2250
+ for (int s = kCompactionStyleLevel; s <= kCompactionStyleUniversal; ++s) {
2251
+ for (int l = 0; l <= 2; l++) {
2252
+ for (int i = 1; i <= 3; i++) {
2253
+ for (int j = 1; j <= 3; j++) {
2254
+ for (int k = 1; k <= 3; k++) {
2255
+ ColumnFamilyOptions original;
2256
+ original.compaction_style = static_cast<CompactionStyle>(s);
2257
+ original.num_levels = l;
2258
+ original.level0_stop_writes_trigger = i;
2259
+ original.level0_slowdown_writes_trigger = j;
2260
+ original.level0_file_num_compaction_trigger = k;
2261
+ original.write_buffer_size =
2262
+ l * 4 * 1024 * 1024 + i * 1024 * 1024 + j * 1024 + k;
2263
+
2264
+ ColumnFamilyOptions result =
2265
+ SanitizeOptions(ImmutableDBOptions(db_options), original);
2266
+ ASSERT_TRUE(result.level0_stop_writes_trigger >=
2267
+ result.level0_slowdown_writes_trigger);
2268
+ ASSERT_TRUE(result.level0_slowdown_writes_trigger >=
2269
+ result.level0_file_num_compaction_trigger);
2270
+ ASSERT_TRUE(result.level0_file_num_compaction_trigger ==
2271
+ original.level0_file_num_compaction_trigger);
2272
+ if (s == kCompactionStyleLevel) {
2273
+ ASSERT_GE(result.num_levels, 2);
2274
+ } else {
2275
+ ASSERT_GE(result.num_levels, 1);
2276
+ if (original.num_levels >= 1) {
2277
+ ASSERT_EQ(result.num_levels, original.num_levels);
2278
+ }
2279
+ }
2280
+
2281
+ // Make sure Sanitize options sets arena_block_size to 1/8 of
2282
+ // the write_buffer_size, rounded up to a multiple of 4k.
2283
+ size_t expected_arena_block_size =
2284
+ l * 4 * 1024 * 1024 / 8 + i * 1024 * 1024 / 8;
2285
+ if (j + k != 0) {
2286
+ // not a multiple of 4k, round up 4k
2287
+ expected_arena_block_size += 4 * 1024;
2288
+ }
2289
+ ASSERT_EQ(expected_arena_block_size, result.arena_block_size);
2290
+ }
2291
+ }
2292
+ }
2293
+ }
2294
+ }
2295
+ }
2296
+
2297
+ TEST_P(ColumnFamilyTest, ReadDroppedColumnFamily) {
2298
+ // iter 0 -- drop CF, don't reopen
2299
+ // iter 1 -- delete CF, reopen
2300
+ for (int iter = 0; iter < 2; ++iter) {
2301
+ db_options_.create_missing_column_families = true;
2302
+ db_options_.max_open_files = 20;
2303
+ // delete obsolete files always
2304
+ db_options_.delete_obsolete_files_period_micros = 0;
2305
+ Open({"default", "one", "two"});
2306
+ ColumnFamilyOptions options;
2307
+ options.level0_file_num_compaction_trigger = 100;
2308
+ options.level0_slowdown_writes_trigger = 200;
2309
+ options.level0_stop_writes_trigger = 200;
2310
+ options.write_buffer_size = 100000; // small write buffer size
2311
+ Reopen({options, options, options});
2312
+
2313
+ // 1MB should create ~10 files for each CF
2314
+ int kKeysNum = 10000;
2315
+ PutRandomData(0, kKeysNum, 100);
2316
+ PutRandomData(1, kKeysNum, 100);
2317
+ PutRandomData(2, kKeysNum, 100);
2318
+
2319
+ {
2320
+ std::unique_ptr<Iterator> iterator(
2321
+ db_->NewIterator(ReadOptions(), handles_[2]));
2322
+ iterator->SeekToFirst();
2323
+
2324
+ if (iter == 0) {
2325
+ // Drop CF two
2326
+ ASSERT_OK(db_->DropColumnFamily(handles_[2]));
2327
+ } else {
2328
+ // delete CF two
2329
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(handles_[2]));
2330
+ handles_[2] = nullptr;
2331
+ }
2332
+ // Make sure iterator created can still be used.
2333
+ int count = 0;
2334
+ for (; iterator->Valid(); iterator->Next()) {
2335
+ ASSERT_OK(iterator->status());
2336
+ ++count;
2337
+ }
2338
+ ASSERT_OK(iterator->status());
2339
+ ASSERT_EQ(count, kKeysNum);
2340
+ }
2341
+
2342
+ // Add bunch more data to other CFs
2343
+ PutRandomData(0, kKeysNum, 100);
2344
+ PutRandomData(1, kKeysNum, 100);
2345
+
2346
+ if (iter == 1) {
2347
+ Reopen();
2348
+ }
2349
+
2350
+ // Since we didn't delete CF handle, RocksDB's contract guarantees that
2351
+ // we're still able to read dropped CF
2352
+ for (int i = 0; i < 3; ++i) {
2353
+ std::unique_ptr<Iterator> iterator(
2354
+ db_->NewIterator(ReadOptions(), handles_[i]));
2355
+ int count = 0;
2356
+ for (iterator->SeekToFirst(); iterator->Valid(); iterator->Next()) {
2357
+ ASSERT_OK(iterator->status());
2358
+ ++count;
2359
+ }
2360
+ ASSERT_OK(iterator->status());
2361
+ ASSERT_EQ(count, kKeysNum * ((i == 2) ? 1 : 2));
2362
+ }
2363
+
2364
+ Close();
2365
+ Destroy();
2366
+ }
2367
+ }
2368
+
2369
+ TEST_P(ColumnFamilyTest, LiveIteratorWithDroppedColumnFamily) {
2370
+ db_options_.create_missing_column_families = true;
2371
+ db_options_.max_open_files = 20;
2372
+ // delete obsolete files always
2373
+ db_options_.delete_obsolete_files_period_micros = 0;
2374
+ Open({"default", "one", "two"});
2375
+ ColumnFamilyOptions options;
2376
+ options.level0_file_num_compaction_trigger = 100;
2377
+ options.level0_slowdown_writes_trigger = 200;
2378
+ options.level0_stop_writes_trigger = 200;
2379
+ options.write_buffer_size = 100000; // small write buffer size
2380
+ Reopen({options, options, options});
2381
+
2382
+ // 1MB should create ~10 files for each CF
2383
+ int kKeysNum = 10000;
2384
+ PutRandomData(1, kKeysNum, 100);
2385
+ {
2386
+ std::unique_ptr<Iterator> iterator(
2387
+ db_->NewIterator(ReadOptions(), handles_[1]));
2388
+ iterator->SeekToFirst();
2389
+
2390
+ DropColumnFamilies({1});
2391
+
2392
+ // Make sure iterator created can still be used.
2393
+ int count = 0;
2394
+ for (; iterator->Valid(); iterator->Next()) {
2395
+ ASSERT_OK(iterator->status());
2396
+ ++count;
2397
+ }
2398
+ ASSERT_OK(iterator->status());
2399
+ ASSERT_EQ(count, kKeysNum);
2400
+ }
2401
+
2402
+ Reopen();
2403
+ Close();
2404
+ Destroy();
2405
+ }
2406
+
2407
+ TEST_P(ColumnFamilyTest, FlushAndDropRaceCondition) {
2408
+ db_options_.create_missing_column_families = true;
2409
+ Open({"default", "one"});
2410
+ ColumnFamilyOptions options;
2411
+ options.level0_file_num_compaction_trigger = 100;
2412
+ options.level0_slowdown_writes_trigger = 200;
2413
+ options.level0_stop_writes_trigger = 200;
2414
+ options.max_write_buffer_number = 20;
2415
+ options.write_buffer_size = 100000; // small write buffer size
2416
+ Reopen({options, options});
2417
+
2418
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
2419
+ {{"VersionSet::LogAndApply::ColumnFamilyDrop:0",
2420
+ "FlushJob::WriteLevel0Table"},
2421
+ {"VersionSet::LogAndApply::ColumnFamilyDrop:1",
2422
+ "FlushJob::InstallResults"},
2423
+ {"FlushJob::InstallResults",
2424
+ "VersionSet::LogAndApply::ColumnFamilyDrop:2"}});
2425
+
2426
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2427
+ test::SleepingBackgroundTask sleeping_task;
2428
+
2429
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
2430
+ Env::Priority::HIGH);
2431
+ // Make sure the task is sleeping. Otherwise, it might start to execute
2432
+ // after sleeping_task.WaitUntilDone() and cause TSAN warning.
2433
+ sleeping_task.WaitUntilSleeping();
2434
+
2435
+ // 1MB should create ~10 files for each CF
2436
+ int kKeysNum = 10000;
2437
+ PutRandomData(1, kKeysNum, 100);
2438
+
2439
+ std::vector<port::Thread> threads;
2440
+ threads.emplace_back([&] { ASSERT_OK(db_->DropColumnFamily(handles_[1])); });
2441
+
2442
+ sleeping_task.WakeUp();
2443
+ sleeping_task.WaitUntilDone();
2444
+ sleeping_task.Reset();
2445
+ // now we sleep again. this is just so we're certain that flush job finished
2446
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
2447
+ Env::Priority::HIGH);
2448
+ // Make sure the task is sleeping. Otherwise, it might start to execute
2449
+ // after sleeping_task.WaitUntilDone() and cause TSAN warning.
2450
+ sleeping_task.WaitUntilSleeping();
2451
+ sleeping_task.WakeUp();
2452
+ sleeping_task.WaitUntilDone();
2453
+
2454
+ {
2455
+ // Since we didn't delete CF handle, RocksDB's contract guarantees that
2456
+ // we're still able to read dropped CF
2457
+ std::unique_ptr<Iterator> iterator(
2458
+ db_->NewIterator(ReadOptions(), handles_[1]));
2459
+ int count = 0;
2460
+ for (iterator->SeekToFirst(); iterator->Valid(); iterator->Next()) {
2461
+ ASSERT_OK(iterator->status());
2462
+ ++count;
2463
+ }
2464
+ ASSERT_OK(iterator->status());
2465
+ ASSERT_EQ(count, kKeysNum);
2466
+ }
2467
+ for (auto& t : threads) {
2468
+ t.join();
2469
+ }
2470
+
2471
+ Close();
2472
+ Destroy();
2473
+ }
2474
+
2475
+ #ifndef ROCKSDB_LITE
2476
+ // skipped as persisting options is not supported in ROCKSDB_LITE
2477
+ namespace {
2478
+ std::atomic<int> test_stage(0);
2479
+ std::atomic<bool> ordered_by_writethread(false);
2480
+ const int kMainThreadStartPersistingOptionsFile = 1;
2481
+ const int kChildThreadFinishDroppingColumnFamily = 2;
2482
+ void DropSingleColumnFamily(ColumnFamilyTest* cf_test, int cf_id,
2483
+ std::vector<Comparator*>* comparators) {
2484
+ while (test_stage < kMainThreadStartPersistingOptionsFile &&
2485
+ !ordered_by_writethread) {
2486
+ Env::Default()->SleepForMicroseconds(100);
2487
+ }
2488
+ cf_test->DropColumnFamilies({cf_id});
2489
+ if ((*comparators)[cf_id]) {
2490
+ delete (*comparators)[cf_id];
2491
+ (*comparators)[cf_id] = nullptr;
2492
+ }
2493
+ test_stage = kChildThreadFinishDroppingColumnFamily;
2494
+ }
2495
+ } // namespace
2496
+
2497
+ TEST_P(ColumnFamilyTest, CreateAndDropRace) {
2498
+ const int kCfCount = 5;
2499
+ std::vector<ColumnFamilyOptions> cf_opts;
2500
+ std::vector<Comparator*> comparators;
2501
+ for (int i = 0; i < kCfCount; ++i) {
2502
+ cf_opts.emplace_back();
2503
+ comparators.push_back(new test::SimpleSuffixReverseComparator());
2504
+ cf_opts.back().comparator = comparators.back();
2505
+ }
2506
+ db_options_.create_if_missing = true;
2507
+ db_options_.create_missing_column_families = true;
2508
+
2509
+ auto main_thread_id = std::this_thread::get_id();
2510
+
2511
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2512
+ "PersistRocksDBOptions:start", [&](void* /*arg*/) {
2513
+ auto current_thread_id = std::this_thread::get_id();
2514
+ // If it's the main thread hitting this sync-point, then it
2515
+ // will be blocked until some other thread update the test_stage.
2516
+ if (main_thread_id == current_thread_id) {
2517
+ test_stage = kMainThreadStartPersistingOptionsFile;
2518
+ while (test_stage < kChildThreadFinishDroppingColumnFamily &&
2519
+ !ordered_by_writethread) {
2520
+ Env::Default()->SleepForMicroseconds(100);
2521
+ }
2522
+ }
2523
+ });
2524
+
2525
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2526
+ "WriteThread::EnterUnbatched:Wait", [&](void* /*arg*/) {
2527
+ // This means a thread doing DropColumnFamily() is waiting for
2528
+ // other thread to finish persisting options.
2529
+ // In such case, we update the test_stage to unblock the main thread.
2530
+ ordered_by_writethread = true;
2531
+ });
2532
+
2533
+ // Create a database with four column families
2534
+ Open({"default", "one", "two", "three"},
2535
+ {cf_opts[0], cf_opts[1], cf_opts[2], cf_opts[3]});
2536
+
2537
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2538
+
2539
+ // Start a thread that will drop the first column family
2540
+ // and its comparator
2541
+ ROCKSDB_NAMESPACE::port::Thread drop_cf_thread(DropSingleColumnFamily, this,
2542
+ 1, &comparators);
2543
+
2544
+ DropColumnFamilies({2});
2545
+
2546
+ drop_cf_thread.join();
2547
+ Close();
2548
+ Destroy();
2549
+ for (auto* comparator : comparators) {
2550
+ if (comparator) {
2551
+ delete comparator;
2552
+ }
2553
+ }
2554
+
2555
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2556
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2557
+ }
2558
+ #endif // !ROCKSDB_LITE
2559
+
2560
+ TEST_P(ColumnFamilyTest, WriteStallSingleColumnFamily) {
2561
+ const uint64_t kBaseRate = 800000u;
2562
+ db_options_.delayed_write_rate = kBaseRate;
2563
+ db_options_.max_background_compactions = 6;
2564
+
2565
+ Open({"default"});
2566
+ ColumnFamilyData* cfd =
2567
+ static_cast<ColumnFamilyHandleImpl*>(db_->DefaultColumnFamily())->cfd();
2568
+
2569
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2570
+
2571
+ MutableCFOptions mutable_cf_options(column_family_options_);
2572
+
2573
+ mutable_cf_options.level0_slowdown_writes_trigger = 20;
2574
+ mutable_cf_options.level0_stop_writes_trigger = 10000;
2575
+ mutable_cf_options.soft_pending_compaction_bytes_limit = 200;
2576
+ mutable_cf_options.hard_pending_compaction_bytes_limit = 2000;
2577
+ mutable_cf_options.disable_auto_compactions = false;
2578
+
2579
+ vstorage->TEST_set_estimated_compaction_needed_bytes(50);
2580
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2581
+ ASSERT_TRUE(!IsDbWriteStopped());
2582
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2583
+
2584
+ vstorage->TEST_set_estimated_compaction_needed_bytes(201);
2585
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2586
+ ASSERT_TRUE(!IsDbWriteStopped());
2587
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2588
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2589
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2590
+
2591
+ vstorage->TEST_set_estimated_compaction_needed_bytes(400);
2592
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2593
+ ASSERT_TRUE(!IsDbWriteStopped());
2594
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2595
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2596
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2597
+
2598
+ vstorage->TEST_set_estimated_compaction_needed_bytes(500);
2599
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2600
+ ASSERT_TRUE(!IsDbWriteStopped());
2601
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2602
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate());
2603
+
2604
+ vstorage->TEST_set_estimated_compaction_needed_bytes(450);
2605
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2606
+ ASSERT_TRUE(!IsDbWriteStopped());
2607
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2608
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2609
+
2610
+ vstorage->TEST_set_estimated_compaction_needed_bytes(205);
2611
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2612
+ ASSERT_TRUE(!IsDbWriteStopped());
2613
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2614
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2615
+
2616
+ vstorage->TEST_set_estimated_compaction_needed_bytes(202);
2617
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2618
+ ASSERT_TRUE(!IsDbWriteStopped());
2619
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2620
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2621
+
2622
+ vstorage->TEST_set_estimated_compaction_needed_bytes(201);
2623
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2624
+ ASSERT_TRUE(!IsDbWriteStopped());
2625
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2626
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2627
+
2628
+ vstorage->TEST_set_estimated_compaction_needed_bytes(198);
2629
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2630
+ ASSERT_TRUE(!IsDbWriteStopped());
2631
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2632
+
2633
+ vstorage->TEST_set_estimated_compaction_needed_bytes(399);
2634
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2635
+ ASSERT_TRUE(!IsDbWriteStopped());
2636
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2637
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2638
+
2639
+ vstorage->TEST_set_estimated_compaction_needed_bytes(599);
2640
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2641
+ ASSERT_TRUE(!IsDbWriteStopped());
2642
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2643
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2644
+
2645
+ vstorage->TEST_set_estimated_compaction_needed_bytes(2001);
2646
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2647
+ ASSERT_TRUE(IsDbWriteStopped());
2648
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2649
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2650
+
2651
+ vstorage->TEST_set_estimated_compaction_needed_bytes(3001);
2652
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2653
+ ASSERT_TRUE(IsDbWriteStopped());
2654
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2655
+
2656
+ vstorage->TEST_set_estimated_compaction_needed_bytes(390);
2657
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2658
+ ASSERT_TRUE(!IsDbWriteStopped());
2659
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2660
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2661
+
2662
+ vstorage->TEST_set_estimated_compaction_needed_bytes(100);
2663
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2664
+ ASSERT_TRUE(!IsDbWriteStopped());
2665
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2666
+
2667
+ vstorage->set_l0_delay_trigger_count(100);
2668
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2669
+ ASSERT_TRUE(!IsDbWriteStopped());
2670
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2671
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2672
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2673
+
2674
+ vstorage->set_l0_delay_trigger_count(101);
2675
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2676
+ ASSERT_TRUE(!IsDbWriteStopped());
2677
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2678
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2679
+
2680
+ vstorage->set_l0_delay_trigger_count(0);
2681
+ vstorage->TEST_set_estimated_compaction_needed_bytes(300);
2682
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2683
+ ASSERT_TRUE(!IsDbWriteStopped());
2684
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2685
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate());
2686
+
2687
+ vstorage->set_l0_delay_trigger_count(101);
2688
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2689
+ ASSERT_TRUE(!IsDbWriteStopped());
2690
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2691
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25 / 1.25, GetDbDelayedWriteRate());
2692
+
2693
+ vstorage->TEST_set_estimated_compaction_needed_bytes(200);
2694
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2695
+ ASSERT_TRUE(!IsDbWriteStopped());
2696
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2697
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate());
2698
+
2699
+ vstorage->set_l0_delay_trigger_count(0);
2700
+ vstorage->TEST_set_estimated_compaction_needed_bytes(0);
2701
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2702
+ ASSERT_TRUE(!IsDbWriteStopped());
2703
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2704
+
2705
+ mutable_cf_options.disable_auto_compactions = true;
2706
+ dbfull()->TEST_write_controler().set_delayed_write_rate(kBaseRate);
2707
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2708
+ ASSERT_TRUE(!IsDbWriteStopped());
2709
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2710
+
2711
+ vstorage->set_l0_delay_trigger_count(50);
2712
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2713
+ ASSERT_TRUE(!IsDbWriteStopped());
2714
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2715
+ ASSERT_EQ(0, GetDbDelayedWriteRate());
2716
+ ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate());
2717
+
2718
+ vstorage->set_l0_delay_trigger_count(60);
2719
+ vstorage->TEST_set_estimated_compaction_needed_bytes(300);
2720
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2721
+ ASSERT_TRUE(!IsDbWriteStopped());
2722
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2723
+ ASSERT_EQ(0, GetDbDelayedWriteRate());
2724
+ ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate());
2725
+
2726
+ mutable_cf_options.disable_auto_compactions = false;
2727
+ vstorage->set_l0_delay_trigger_count(70);
2728
+ vstorage->TEST_set_estimated_compaction_needed_bytes(500);
2729
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2730
+ ASSERT_TRUE(!IsDbWriteStopped());
2731
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2732
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2733
+
2734
+ vstorage->set_l0_delay_trigger_count(71);
2735
+ vstorage->TEST_set_estimated_compaction_needed_bytes(501);
2736
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2737
+ ASSERT_TRUE(!IsDbWriteStopped());
2738
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2739
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2740
+ }
2741
+
2742
+ TEST_P(ColumnFamilyTest, CompactionSpeedupSingleColumnFamily) {
2743
+ db_options_.max_background_compactions = 6;
2744
+ Open({"default"});
2745
+ ColumnFamilyData* cfd =
2746
+ static_cast<ColumnFamilyHandleImpl*>(db_->DefaultColumnFamily())->cfd();
2747
+
2748
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2749
+
2750
+ MutableCFOptions mutable_cf_options(column_family_options_);
2751
+
2752
+ // Speed up threshold = min(4 * 2, 4 + (36 - 4)/4) = 8
2753
+ mutable_cf_options.level0_file_num_compaction_trigger = 4;
2754
+ mutable_cf_options.level0_slowdown_writes_trigger = 36;
2755
+ mutable_cf_options.level0_stop_writes_trigger = 50;
2756
+ // Speedup threshold = 200 / 4 = 50
2757
+ mutable_cf_options.soft_pending_compaction_bytes_limit = 200;
2758
+ mutable_cf_options.hard_pending_compaction_bytes_limit = 2000;
2759
+
2760
+ vstorage->TEST_set_estimated_compaction_needed_bytes(40);
2761
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2762
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2763
+
2764
+ vstorage->TEST_set_estimated_compaction_needed_bytes(50);
2765
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2766
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2767
+
2768
+ vstorage->TEST_set_estimated_compaction_needed_bytes(300);
2769
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2770
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2771
+
2772
+ vstorage->TEST_set_estimated_compaction_needed_bytes(45);
2773
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2774
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2775
+
2776
+ vstorage->set_l0_delay_trigger_count(7);
2777
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2778
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2779
+
2780
+ vstorage->set_l0_delay_trigger_count(9);
2781
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2782
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2783
+
2784
+ vstorage->set_l0_delay_trigger_count(6);
2785
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2786
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2787
+
2788
+ // Speed up threshold = min(4 * 2, 4 + (12 - 4)/4) = 6
2789
+ mutable_cf_options.level0_file_num_compaction_trigger = 4;
2790
+ mutable_cf_options.level0_slowdown_writes_trigger = 16;
2791
+ mutable_cf_options.level0_stop_writes_trigger = 30;
2792
+
2793
+ vstorage->set_l0_delay_trigger_count(5);
2794
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2795
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2796
+
2797
+ vstorage->set_l0_delay_trigger_count(7);
2798
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2799
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2800
+
2801
+ vstorage->set_l0_delay_trigger_count(3);
2802
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2803
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2804
+ }
2805
+
2806
+ TEST_P(ColumnFamilyTest, WriteStallTwoColumnFamilies) {
2807
+ const uint64_t kBaseRate = 810000u;
2808
+ db_options_.delayed_write_rate = kBaseRate;
2809
+ Open();
2810
+ CreateColumnFamilies({"one"});
2811
+ ColumnFamilyData* cfd =
2812
+ static_cast<ColumnFamilyHandleImpl*>(db_->DefaultColumnFamily())->cfd();
2813
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2814
+
2815
+ ColumnFamilyData* cfd1 =
2816
+ static_cast<ColumnFamilyHandleImpl*>(handles_[1])->cfd();
2817
+ VersionStorageInfo* vstorage1 = cfd1->current()->storage_info();
2818
+
2819
+ MutableCFOptions mutable_cf_options(column_family_options_);
2820
+ mutable_cf_options.level0_slowdown_writes_trigger = 20;
2821
+ mutable_cf_options.level0_stop_writes_trigger = 10000;
2822
+ mutable_cf_options.soft_pending_compaction_bytes_limit = 200;
2823
+ mutable_cf_options.hard_pending_compaction_bytes_limit = 2000;
2824
+
2825
+ MutableCFOptions mutable_cf_options1 = mutable_cf_options;
2826
+ mutable_cf_options1.soft_pending_compaction_bytes_limit = 500;
2827
+
2828
+ vstorage->TEST_set_estimated_compaction_needed_bytes(50);
2829
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2830
+ ASSERT_TRUE(!IsDbWriteStopped());
2831
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2832
+
2833
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(201);
2834
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2835
+ ASSERT_TRUE(!IsDbWriteStopped());
2836
+ ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay());
2837
+
2838
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(600);
2839
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2840
+ ASSERT_TRUE(!IsDbWriteStopped());
2841
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2842
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2843
+
2844
+ vstorage->TEST_set_estimated_compaction_needed_bytes(70);
2845
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2846
+ ASSERT_TRUE(!IsDbWriteStopped());
2847
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2848
+ ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate());
2849
+
2850
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(800);
2851
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2852
+ ASSERT_TRUE(!IsDbWriteStopped());
2853
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2854
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2855
+
2856
+ vstorage->TEST_set_estimated_compaction_needed_bytes(300);
2857
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2858
+ ASSERT_TRUE(!IsDbWriteStopped());
2859
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2860
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate());
2861
+
2862
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(700);
2863
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2864
+ ASSERT_TRUE(!IsDbWriteStopped());
2865
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2866
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2867
+
2868
+ vstorage->TEST_set_estimated_compaction_needed_bytes(500);
2869
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2870
+ ASSERT_TRUE(!IsDbWriteStopped());
2871
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2872
+ ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate());
2873
+
2874
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(600);
2875
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2876
+ ASSERT_TRUE(!IsDbWriteStopped());
2877
+ ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay());
2878
+ ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate());
2879
+ }
2880
+
2881
+ TEST_P(ColumnFamilyTest, CompactionSpeedupTwoColumnFamilies) {
2882
+ db_options_.max_background_compactions = 6;
2883
+ column_family_options_.soft_pending_compaction_bytes_limit = 200;
2884
+ column_family_options_.hard_pending_compaction_bytes_limit = 2000;
2885
+ Open();
2886
+ CreateColumnFamilies({"one"});
2887
+ ColumnFamilyData* cfd =
2888
+ static_cast<ColumnFamilyHandleImpl*>(db_->DefaultColumnFamily())->cfd();
2889
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2890
+
2891
+ ColumnFamilyData* cfd1 =
2892
+ static_cast<ColumnFamilyHandleImpl*>(handles_[1])->cfd();
2893
+ VersionStorageInfo* vstorage1 = cfd1->current()->storage_info();
2894
+
2895
+ MutableCFOptions mutable_cf_options(column_family_options_);
2896
+ // Speed up threshold = min(4 * 2, 4 + (36 - 4)/4) = 8
2897
+ mutable_cf_options.level0_file_num_compaction_trigger = 4;
2898
+ mutable_cf_options.level0_slowdown_writes_trigger = 36;
2899
+ mutable_cf_options.level0_stop_writes_trigger = 30;
2900
+ // Speedup threshold = 200 / 4 = 50
2901
+ mutable_cf_options.soft_pending_compaction_bytes_limit = 200;
2902
+ mutable_cf_options.hard_pending_compaction_bytes_limit = 2000;
2903
+
2904
+ MutableCFOptions mutable_cf_options1 = mutable_cf_options;
2905
+ mutable_cf_options1.level0_slowdown_writes_trigger = 16;
2906
+
2907
+ vstorage->TEST_set_estimated_compaction_needed_bytes(40);
2908
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2909
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2910
+
2911
+ vstorage->TEST_set_estimated_compaction_needed_bytes(60);
2912
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2913
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2914
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2915
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2916
+
2917
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(30);
2918
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2919
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2920
+
2921
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(70);
2922
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2923
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2924
+
2925
+ vstorage->TEST_set_estimated_compaction_needed_bytes(20);
2926
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2927
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2928
+
2929
+ vstorage1->TEST_set_estimated_compaction_needed_bytes(3);
2930
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2931
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2932
+
2933
+ vstorage->set_l0_delay_trigger_count(9);
2934
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2935
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2936
+
2937
+ vstorage1->set_l0_delay_trigger_count(2);
2938
+ RecalculateWriteStallConditions(cfd1, mutable_cf_options);
2939
+ ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed());
2940
+
2941
+ vstorage->set_l0_delay_trigger_count(0);
2942
+ RecalculateWriteStallConditions(cfd, mutable_cf_options);
2943
+ ASSERT_EQ(1, dbfull()->TEST_BGCompactionsAllowed());
2944
+ }
2945
+
2946
+ TEST_P(ColumnFamilyTest, CreateAndDestoryOptions) {
2947
+ std::unique_ptr<ColumnFamilyOptions> cfo(new ColumnFamilyOptions());
2948
+ ColumnFamilyHandle* cfh;
2949
+ Open();
2950
+ ASSERT_OK(db_->CreateColumnFamily(*(cfo.get()), "yoyo", &cfh));
2951
+ cfo.reset();
2952
+ ASSERT_OK(db_->Put(WriteOptions(), cfh, "foo", "bar"));
2953
+ ASSERT_OK(db_->Flush(FlushOptions(), cfh));
2954
+ ASSERT_OK(db_->DropColumnFamily(cfh));
2955
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(cfh));
2956
+ }
2957
+
2958
+ TEST_P(ColumnFamilyTest, CreateDropAndDestroy) {
2959
+ ColumnFamilyHandle* cfh;
2960
+ Open();
2961
+ ASSERT_OK(db_->CreateColumnFamily(ColumnFamilyOptions(), "yoyo", &cfh));
2962
+ ASSERT_OK(db_->Put(WriteOptions(), cfh, "foo", "bar"));
2963
+ ASSERT_OK(db_->Flush(FlushOptions(), cfh));
2964
+ ASSERT_OK(db_->DropColumnFamily(cfh));
2965
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(cfh));
2966
+ }
2967
+
2968
+ #ifndef ROCKSDB_LITE
2969
+ TEST_P(ColumnFamilyTest, CreateDropAndDestroyWithoutFileDeletion) {
2970
+ ColumnFamilyHandle* cfh;
2971
+ Open();
2972
+ ASSERT_OK(db_->CreateColumnFamily(ColumnFamilyOptions(), "yoyo", &cfh));
2973
+ ASSERT_OK(db_->Put(WriteOptions(), cfh, "foo", "bar"));
2974
+ ASSERT_OK(db_->Flush(FlushOptions(), cfh));
2975
+ ASSERT_OK(db_->DisableFileDeletions());
2976
+ ASSERT_OK(db_->DropColumnFamily(cfh));
2977
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(cfh));
2978
+ }
2979
+
2980
+ TEST_P(ColumnFamilyTest, FlushCloseWALFiles) {
2981
+ SpecialEnv env(Env::Default());
2982
+ db_options_.env = &env;
2983
+ db_options_.max_background_flushes = 1;
2984
+ column_family_options_.memtable_factory.reset(new SpecialSkipListFactory(2));
2985
+ Open();
2986
+ CreateColumnFamilies({"one"});
2987
+ ASSERT_OK(Put(1, "fodor", "mirko"));
2988
+ ASSERT_OK(Put(0, "fodor", "mirko"));
2989
+ ASSERT_OK(Put(1, "fodor", "mirko"));
2990
+
2991
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
2992
+ {"DBImpl::BGWorkFlush:done", "FlushCloseWALFiles:0"},
2993
+ });
2994
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2995
+
2996
+ // Block flush jobs from running
2997
+ test::SleepingBackgroundTask sleeping_task;
2998
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
2999
+ Env::Priority::HIGH);
3000
+ // Make sure the task is sleeping. Otherwise, it might start to execute
3001
+ // after sleeping_task.WaitUntilDone() and cause TSAN warning.
3002
+ sleeping_task.WaitUntilSleeping();
3003
+
3004
+ WriteOptions wo;
3005
+ wo.sync = true;
3006
+ ASSERT_OK(db_->Put(wo, handles_[1], "fodor", "mirko"));
3007
+
3008
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3009
+
3010
+ sleeping_task.WakeUp();
3011
+ sleeping_task.WaitUntilDone();
3012
+ TEST_SYNC_POINT("FlushCloseWALFiles:0");
3013
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3014
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3015
+
3016
+ Reopen();
3017
+ ASSERT_EQ("mirko", Get(0, "fodor"));
3018
+ ASSERT_EQ("mirko", Get(1, "fodor"));
3019
+ db_options_.env = env_;
3020
+ Close();
3021
+ }
3022
+ #endif // !ROCKSDB_LITE
3023
+
3024
+ #ifndef ROCKSDB_LITE // WaitForFlush() is not supported
3025
+ TEST_P(ColumnFamilyTest, IteratorCloseWALFile1) {
3026
+ SpecialEnv env(Env::Default());
3027
+ db_options_.env = &env;
3028
+ db_options_.max_background_flushes = 1;
3029
+ column_family_options_.memtable_factory.reset(new SpecialSkipListFactory(2));
3030
+ Open();
3031
+ CreateColumnFamilies({"one"});
3032
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3033
+ // Create an iterator holding the current super version.
3034
+ Iterator* it = db_->NewIterator(ReadOptions(), handles_[1]);
3035
+ ASSERT_OK(it->status());
3036
+ // A flush will make `it` hold the last reference of its super version.
3037
+ ASSERT_OK(Flush(1));
3038
+
3039
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3040
+ ASSERT_OK(Put(0, "fodor", "mirko"));
3041
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3042
+
3043
+ // Flush jobs will close previous WAL files after finishing. By
3044
+ // block flush jobs from running, we trigger a condition where
3045
+ // the iterator destructor should close the WAL files.
3046
+ test::SleepingBackgroundTask sleeping_task;
3047
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
3048
+ Env::Priority::HIGH);
3049
+ // Make sure the task is sleeping. Otherwise, it might start to execute
3050
+ // after sleeping_task.WaitUntilDone() and cause TSAN warning.
3051
+ sleeping_task.WaitUntilSleeping();
3052
+
3053
+ WriteOptions wo;
3054
+ wo.sync = true;
3055
+ ASSERT_OK(db_->Put(wo, handles_[1], "fodor", "mirko"));
3056
+
3057
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3058
+ // Deleting the iterator will clear its super version, triggering
3059
+ // closing all files
3060
+ delete it;
3061
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3062
+
3063
+ sleeping_task.WakeUp();
3064
+ sleeping_task.WaitUntilDone();
3065
+ WaitForFlush(1);
3066
+
3067
+ Reopen();
3068
+ ASSERT_EQ("mirko", Get(0, "fodor"));
3069
+ ASSERT_EQ("mirko", Get(1, "fodor"));
3070
+ db_options_.env = env_;
3071
+ Close();
3072
+ }
3073
+
3074
+ TEST_P(ColumnFamilyTest, IteratorCloseWALFile2) {
3075
+ SpecialEnv env(Env::Default());
3076
+ // Allow both of flush and purge job to schedule.
3077
+ env.SetBackgroundThreads(2, Env::HIGH);
3078
+ db_options_.env = &env;
3079
+ db_options_.max_background_flushes = 1;
3080
+ column_family_options_.memtable_factory.reset(new SpecialSkipListFactory(2));
3081
+ Open();
3082
+ CreateColumnFamilies({"one"});
3083
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3084
+ // Create an iterator holding the current super version.
3085
+ ReadOptions ro;
3086
+ ro.background_purge_on_iterator_cleanup = true;
3087
+ Iterator* it = db_->NewIterator(ro, handles_[1]);
3088
+ ASSERT_OK(it->status());
3089
+ // A flush will make `it` hold the last reference of its super version.
3090
+ ASSERT_OK(Flush(1));
3091
+
3092
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3093
+ ASSERT_OK(Put(0, "fodor", "mirko"));
3094
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3095
+
3096
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
3097
+ {"ColumnFamilyTest::IteratorCloseWALFile2:0",
3098
+ "DBImpl::BGWorkPurge:start"},
3099
+ {"ColumnFamilyTest::IteratorCloseWALFile2:2",
3100
+ "DBImpl::BackgroundCallFlush:start"},
3101
+ {"DBImpl::BGWorkPurge:end", "ColumnFamilyTest::IteratorCloseWALFile2:1"},
3102
+ });
3103
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3104
+
3105
+ WriteOptions wo;
3106
+ wo.sync = true;
3107
+ ASSERT_OK(db_->Put(wo, handles_[1], "fodor", "mirko"));
3108
+
3109
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3110
+ // Deleting the iterator will clear its super version, triggering
3111
+ // closing all files
3112
+ delete it;
3113
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3114
+
3115
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:0");
3116
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:1");
3117
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3118
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:2");
3119
+ WaitForFlush(1);
3120
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3121
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3122
+
3123
+ Reopen();
3124
+ ASSERT_EQ("mirko", Get(0, "fodor"));
3125
+ ASSERT_EQ("mirko", Get(1, "fodor"));
3126
+ db_options_.env = env_;
3127
+ Close();
3128
+ }
3129
+ #endif // !ROCKSDB_LITE
3130
+
3131
+ #ifndef ROCKSDB_LITE // TEST functions are not supported in lite
3132
+ TEST_P(ColumnFamilyTest, ForwardIteratorCloseWALFile) {
3133
+ SpecialEnv env(Env::Default());
3134
+ // Allow both of flush and purge job to schedule.
3135
+ env.SetBackgroundThreads(2, Env::HIGH);
3136
+ db_options_.env = &env;
3137
+ db_options_.max_background_flushes = 1;
3138
+ column_family_options_.memtable_factory.reset(new SpecialSkipListFactory(3));
3139
+ column_family_options_.level0_file_num_compaction_trigger = 2;
3140
+ Open();
3141
+ CreateColumnFamilies({"one"});
3142
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3143
+ ASSERT_OK(Put(1, "fodar2", "mirko"));
3144
+ ASSERT_OK(Flush(1));
3145
+
3146
+ // Create an iterator holding the current super version, as well as
3147
+ // the SST file just flushed.
3148
+ ReadOptions ro;
3149
+ ro.tailing = true;
3150
+ ro.background_purge_on_iterator_cleanup = true;
3151
+ Iterator* it = db_->NewIterator(ro, handles_[1]);
3152
+ // A flush will make `it` hold the last reference of its super version.
3153
+
3154
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3155
+ ASSERT_OK(Put(1, "fodar2", "mirko"));
3156
+ ASSERT_OK(Flush(1));
3157
+
3158
+ WaitForCompaction();
3159
+
3160
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3161
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3162
+ ASSERT_OK(Put(0, "fodor", "mirko"));
3163
+ ASSERT_OK(Put(1, "fodor", "mirko"));
3164
+
3165
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
3166
+ {"ColumnFamilyTest::IteratorCloseWALFile2:0",
3167
+ "DBImpl::BGWorkPurge:start"},
3168
+ {"ColumnFamilyTest::IteratorCloseWALFile2:2",
3169
+ "DBImpl::BackgroundCallFlush:start"},
3170
+ {"DBImpl::BGWorkPurge:end", "ColumnFamilyTest::IteratorCloseWALFile2:1"},
3171
+ });
3172
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3173
+
3174
+ WriteOptions wo;
3175
+ wo.sync = true;
3176
+ ASSERT_OK(db_->Put(wo, handles_[1], "fodor", "mirko"));
3177
+
3178
+ env.delete_count_.store(0);
3179
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3180
+ // Deleting the iterator will clear its super version, triggering
3181
+ // closing all files
3182
+ it->Seek("");
3183
+ ASSERT_OK(it->status());
3184
+
3185
+ ASSERT_EQ(2, env.num_open_wal_file_.load());
3186
+ ASSERT_EQ(0, env.delete_count_.load());
3187
+
3188
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:0");
3189
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:1");
3190
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3191
+ ASSERT_EQ(1, env.delete_count_.load());
3192
+ TEST_SYNC_POINT("ColumnFamilyTest::IteratorCloseWALFile2:2");
3193
+ WaitForFlush(1);
3194
+ ASSERT_EQ(1, env.num_open_wal_file_.load());
3195
+ ASSERT_EQ(1, env.delete_count_.load());
3196
+
3197
+ delete it;
3198
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3199
+
3200
+ Reopen();
3201
+ ASSERT_EQ("mirko", Get(0, "fodor"));
3202
+ ASSERT_EQ("mirko", Get(1, "fodor"));
3203
+ db_options_.env = env_;
3204
+ Close();
3205
+ }
3206
+ #endif // !ROCKSDB_LITE
3207
+
3208
+ // Disable on windows because SyncWAL requires env->IsSyncThreadSafe()
3209
+ // to return true which is not so in unbuffered mode.
3210
+ #ifndef OS_WIN
3211
+ TEST_P(ColumnFamilyTest, LogSyncConflictFlush) {
3212
+ Open();
3213
+ CreateColumnFamiliesAndReopen({"one", "two"});
3214
+
3215
+ ASSERT_OK(Put(0, "", ""));
3216
+ ASSERT_OK(Put(1, "foo", "bar"));
3217
+
3218
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
3219
+ {{"DBImpl::SyncWAL:BeforeMarkLogsSynced:1",
3220
+ "ColumnFamilyTest::LogSyncConflictFlush:1"},
3221
+ {"ColumnFamilyTest::LogSyncConflictFlush:2",
3222
+ "DBImpl::SyncWAL:BeforeMarkLogsSynced:2"}});
3223
+
3224
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3225
+
3226
+ ROCKSDB_NAMESPACE::port::Thread thread([&] { ASSERT_OK(db_->SyncWAL()); });
3227
+
3228
+ TEST_SYNC_POINT("ColumnFamilyTest::LogSyncConflictFlush:1");
3229
+ ASSERT_OK(Flush(1));
3230
+ ASSERT_OK(Put(1, "foo", "bar"));
3231
+ ASSERT_OK(Flush(1));
3232
+
3233
+ TEST_SYNC_POINT("ColumnFamilyTest::LogSyncConflictFlush:2");
3234
+
3235
+ thread.join();
3236
+
3237
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3238
+ Close();
3239
+ }
3240
+ #endif
3241
+
3242
+ // this test is placed here, because the infrastructure for Column Family
3243
+ // test is being used to ensure a roll of wal files.
3244
+ // Basic idea is to test that WAL truncation is being detected and not
3245
+ // ignored
3246
+ TEST_P(ColumnFamilyTest, DISABLED_LogTruncationTest) {
3247
+ Open();
3248
+ CreateColumnFamiliesAndReopen({"one", "two"});
3249
+
3250
+ Build(0, 100);
3251
+
3252
+ // Flush the 0th column family to force a roll of the wal log
3253
+ ASSERT_OK(Flush(0));
3254
+
3255
+ // Add some more entries
3256
+ Build(100, 100);
3257
+
3258
+ std::vector<std::string> filenames;
3259
+ ASSERT_OK(env_->GetChildren(dbname_, &filenames));
3260
+
3261
+ // collect wal files
3262
+ std::vector<std::string> logfs;
3263
+ for (size_t i = 0; i < filenames.size(); i++) {
3264
+ uint64_t number;
3265
+ FileType type;
3266
+ if (!(ParseFileName(filenames[i], &number, &type))) continue;
3267
+
3268
+ if (type != kWalFile) continue;
3269
+
3270
+ logfs.push_back(filenames[i]);
3271
+ }
3272
+
3273
+ std::sort(logfs.begin(), logfs.end());
3274
+ ASSERT_GE(logfs.size(), 2);
3275
+
3276
+ // Take the last but one file, and truncate it
3277
+ std::string fpath = dbname_ + "/" + logfs[logfs.size() - 2];
3278
+ std::vector<std::string> names_save = names_;
3279
+
3280
+ uint64_t fsize;
3281
+ ASSERT_OK(env_->GetFileSize(fpath, &fsize));
3282
+ ASSERT_GT(fsize, 0);
3283
+
3284
+ Close();
3285
+
3286
+ std::string backup_logs = dbname_ + "/backup_logs";
3287
+ std::string t_fpath = backup_logs + "/" + logfs[logfs.size() - 2];
3288
+
3289
+ ASSERT_OK(env_->CreateDirIfMissing(backup_logs));
3290
+ // Not sure how easy it is to make this data driven.
3291
+ // need to read back the WAL file and truncate last 10
3292
+ // entries
3293
+ CopyFile(fpath, t_fpath, fsize - 9180);
3294
+
3295
+ ASSERT_OK(env_->DeleteFile(fpath));
3296
+ ASSERT_OK(env_->RenameFile(t_fpath, fpath));
3297
+
3298
+ db_options_.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
3299
+
3300
+ OpenReadOnly(names_save);
3301
+
3302
+ CheckMissed();
3303
+
3304
+ Close();
3305
+
3306
+ Open(names_save);
3307
+
3308
+ CheckMissed();
3309
+
3310
+ Close();
3311
+
3312
+ // cleanup
3313
+ ASSERT_OK(env_->DeleteDir(backup_logs));
3314
+ }
3315
+
3316
+ TEST_P(ColumnFamilyTest, DefaultCfPathsTest) {
3317
+ Open();
3318
+ // Leave cf_paths for one column families to be empty.
3319
+ // Files should be generated according to db_paths for that
3320
+ // column family.
3321
+ ColumnFamilyOptions cf_opt1, cf_opt2;
3322
+ cf_opt1.cf_paths.emplace_back(dbname_ + "_one_1",
3323
+ std::numeric_limits<uint64_t>::max());
3324
+ CreateColumnFamilies({"one", "two"}, {cf_opt1, cf_opt2});
3325
+ Reopen({ColumnFamilyOptions(), cf_opt1, cf_opt2});
3326
+
3327
+ // Fill Column family 1.
3328
+ PutRandomData(1, 100, 100);
3329
+ ASSERT_OK(Flush(1));
3330
+
3331
+ ASSERT_EQ(1, GetSstFileCount(cf_opt1.cf_paths[0].path));
3332
+ ASSERT_EQ(0, GetSstFileCount(dbname_));
3333
+
3334
+ // Fill column family 2
3335
+ PutRandomData(2, 100, 100);
3336
+ ASSERT_OK(Flush(2));
3337
+
3338
+ // SST from Column family 2 should be generated in
3339
+ // db_paths which is dbname_ in this case.
3340
+ ASSERT_EQ(1, GetSstFileCount(dbname_));
3341
+ }
3342
+
3343
+ TEST_P(ColumnFamilyTest, MultipleCFPathsTest) {
3344
+ Open();
3345
+ // Configure Column family specific paths.
3346
+ ColumnFamilyOptions cf_opt1, cf_opt2;
3347
+ cf_opt1.cf_paths.emplace_back(dbname_ + "_one_1",
3348
+ std::numeric_limits<uint64_t>::max());
3349
+ cf_opt2.cf_paths.emplace_back(dbname_ + "_two_1",
3350
+ std::numeric_limits<uint64_t>::max());
3351
+ CreateColumnFamilies({"one", "two"}, {cf_opt1, cf_opt2});
3352
+ Reopen({ColumnFamilyOptions(), cf_opt1, cf_opt2});
3353
+
3354
+ PutRandomData(1, 100, 100, true /* save */);
3355
+ ASSERT_OK(Flush(1));
3356
+
3357
+ // Check that files are generated in appropriate paths.
3358
+ ASSERT_EQ(1, GetSstFileCount(cf_opt1.cf_paths[0].path));
3359
+ ASSERT_EQ(0, GetSstFileCount(dbname_));
3360
+
3361
+ PutRandomData(2, 100, 100, true /* save */);
3362
+ ASSERT_OK(Flush(2));
3363
+
3364
+ ASSERT_EQ(1, GetSstFileCount(cf_opt2.cf_paths[0].path));
3365
+ ASSERT_EQ(0, GetSstFileCount(dbname_));
3366
+
3367
+ // Re-open and verify the keys.
3368
+ Reopen({ColumnFamilyOptions(), cf_opt1, cf_opt2});
3369
+ DBImpl* dbi = static_cast_with_check<DBImpl>(db_);
3370
+ for (int cf = 1; cf != 3; ++cf) {
3371
+ ReadOptions read_options;
3372
+ read_options.readahead_size = 0;
3373
+ auto it = dbi->NewIterator(read_options, handles_[cf]);
3374
+ for (it->SeekToFirst(); it->Valid(); it->Next()) {
3375
+ ASSERT_OK(it->status());
3376
+ Slice key(it->key());
3377
+ ASSERT_NE(keys_[cf].end(), keys_[cf].find(key.ToString()));
3378
+ }
3379
+ ASSERT_OK(it->status());
3380
+ delete it;
3381
+
3382
+ for (const auto& key : keys_[cf]) {
3383
+ ASSERT_NE("NOT_FOUND", Get(cf, key));
3384
+ }
3385
+ }
3386
+ }
3387
+
3388
+ TEST(ColumnFamilyTest, ValidateBlobGCCutoff) {
3389
+ DBOptions db_options;
3390
+
3391
+ ColumnFamilyOptions cf_options;
3392
+ cf_options.enable_blob_garbage_collection = true;
3393
+
3394
+ cf_options.blob_garbage_collection_age_cutoff = -0.5;
3395
+ ASSERT_TRUE(ColumnFamilyData::ValidateOptions(db_options, cf_options)
3396
+ .IsInvalidArgument());
3397
+
3398
+ cf_options.blob_garbage_collection_age_cutoff = 0.0;
3399
+ ASSERT_OK(ColumnFamilyData::ValidateOptions(db_options, cf_options));
3400
+
3401
+ cf_options.blob_garbage_collection_age_cutoff = 0.5;
3402
+ ASSERT_OK(ColumnFamilyData::ValidateOptions(db_options, cf_options));
3403
+
3404
+ cf_options.blob_garbage_collection_age_cutoff = 1.0;
3405
+ ASSERT_OK(ColumnFamilyData::ValidateOptions(db_options, cf_options));
3406
+
3407
+ cf_options.blob_garbage_collection_age_cutoff = 1.5;
3408
+ ASSERT_TRUE(ColumnFamilyData::ValidateOptions(db_options, cf_options)
3409
+ .IsInvalidArgument());
3410
+ }
3411
+
3412
+ } // namespace ROCKSDB_NAMESPACE
3413
+
3414
+ #ifdef ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
3415
+ extern "C" {
3416
+ void RegisterCustomObjects(int argc, char** argv);
3417
+ }
3418
+ #else
3419
+ void RegisterCustomObjects(int /*argc*/, char** /*argv*/) {}
3420
+ #endif // !ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
3421
+
3422
+ int main(int argc, char** argv) {
3423
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3424
+ ::testing::InitGoogleTest(&argc, argv);
3425
+ RegisterCustomObjects(argc, argv);
3426
+ return RUN_ALL_TESTS();
3427
+ }