@nxtedition/rocksdb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1088) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/UPGRADING.md +91 -0
  5. package/binding.cc +1276 -0
  6. package/binding.gyp +73 -0
  7. package/binding.js +1 -0
  8. package/chained-batch.js +44 -0
  9. package/deps/rocksdb/build_version.cc +4 -0
  10. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  11. package/deps/rocksdb/rocksdb/COPYING +339 -0
  12. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  13. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  14. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  15. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  16. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  20. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  22. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  23. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  24. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  25. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  26. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  27. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  37. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  38. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  60. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  61. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  64. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  65. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  67. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  68. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  69. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  71. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  74. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  75. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  95. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  96. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  97. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  98. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  99. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  100. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  101. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  102. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  103. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  104. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  105. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  106. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  107. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  108. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  122. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  123. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  124. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  125. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  126. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  127. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  128. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  129. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  130. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  131. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  132. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  133. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  134. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  135. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  136. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  137. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  138. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  139. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  140. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  141. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  142. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  143. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  144. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  145. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  146. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  147. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  148. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  149. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  150. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  151. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  152. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  153. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  154. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  155. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  156. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  157. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  158. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  159. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  160. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  161. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  162. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  163. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  164. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  165. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  166. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  167. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  168. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  169. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  170. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  171. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  172. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  174. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  175. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  176. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  178. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  179. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  184. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  186. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  187. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  188. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  189. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  190. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  191. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  192. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  193. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  194. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  195. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  196. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  197. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  198. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  199. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  200. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  201. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  202. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  203. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  204. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  205. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  206. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  207. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  210. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  212. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  213. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  216. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  217. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  218. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  219. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  220. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  223. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  224. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  226. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  227. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  228. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  229. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  230. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  231. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  232. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  233. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  234. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  235. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  236. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  237. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  238. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  239. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  240. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  241. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  242. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  243. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  244. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  245. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  246. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  247. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  248. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  249. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  250. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  251. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  252. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  253. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  254. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  255. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  256. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  257. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  258. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  260. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  261. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  262. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  263. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  264. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  290. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  291. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  292. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  293. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  294. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  295. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  296. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  297. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  298. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  299. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  300. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  301. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  302. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  303. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  304. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  305. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  306. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  307. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  308. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  309. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  310. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  313. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  315. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  316. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  317. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  318. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  319. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  320. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  321. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  324. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  325. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  326. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  327. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  334. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  418. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  419. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  420. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  422. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  423. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  425. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  426. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  427. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  428. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  429. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  430. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  431. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  432. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  433. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  434. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  435. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  436. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  437. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  438. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  439. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  440. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  441. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  442. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  443. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  444. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  445. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  446. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  447. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  448. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  449. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  450. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  451. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  452. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  453. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  454. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  455. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  456. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  457. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  458. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  459. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  460. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  461. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  462. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  463. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  464. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  465. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  466. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  467. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  468. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  469. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  470. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  471. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  472. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  473. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  474. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  475. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  476. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  477. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  478. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  479. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  480. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  481. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  482. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  483. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  484. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  485. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  486. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  487. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  489. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  490. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  491. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  492. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  493. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  494. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  495. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  496. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  497. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  498. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  499. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  500. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  501. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  502. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  503. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  504. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  505. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  506. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  507. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  508. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  509. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  510. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  511. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  512. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  513. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  514. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  515. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  516. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  517. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  518. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  519. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  520. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  521. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  522. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  523. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  524. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  525. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  526. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  527. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  528. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  529. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  530. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  531. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  532. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  533. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  534. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  535. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  536. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  537. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  538. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  539. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  540. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  541. package/deps/rocksdb/rocksdb/src.mk +631 -0
  542. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  543. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  599. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  600. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  601. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  602. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  603. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  604. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  605. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  606. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  607. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  608. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  611. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  612. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  613. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  614. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  615. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  616. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  617. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  618. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  619. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  620. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  621. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  622. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  623. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  624. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  625. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  626. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  627. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  628. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  629. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  630. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  631. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  632. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  633. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  634. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  635. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  642. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  643. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  644. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  645. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  646. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  647. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  648. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  649. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  650. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  651. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  652. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  653. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  654. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  655. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  656. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  657. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  658. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  659. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  660. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  661. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  662. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  663. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  664. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  665. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  666. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  667. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  668. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  669. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  670. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  671. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  672. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  673. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  674. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  675. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  676. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  677. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  713. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  714. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  715. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  716. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  717. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  718. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  719. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  720. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  721. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  722. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  726. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  727. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  728. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  729. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  730. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  731. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  732. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  733. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  734. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  735. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  736. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  737. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  738. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  739. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  740. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  741. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  742. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  743. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  744. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  745. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  746. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  747. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  748. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  749. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  750. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  751. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  752. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  753. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  754. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  755. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  756. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  757. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  760. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  761. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  762. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  763. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  764. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  765. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  766. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  767. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  768. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  769. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  770. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  771. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  772. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  773. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  774. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  775. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  776. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  777. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  778. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  779. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  780. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  781. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  782. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  783. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  784. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  785. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  786. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  790. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  791. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  792. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  793. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  794. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  795. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  796. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  797. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  798. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  799. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  800. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  801. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  802. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  803. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  804. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  805. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  806. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  807. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  808. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  809. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  810. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  811. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  812. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  813. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  814. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  815. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  816. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  817. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  818. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  819. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  820. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  821. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  822. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  823. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  824. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  825. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  826. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  827. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  828. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  829. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  830. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  831. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  832. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  833. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  834. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  835. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  836. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  837. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  838. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  839. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  840. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  841. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  842. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  843. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  844. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  845. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  846. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  847. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  848. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  849. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  850. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  851. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  852. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  853. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  854. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  855. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  856. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  857. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  858. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  859. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  860. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  861. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  862. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  872. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  873. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  874. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  875. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  876. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  877. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  885. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  886. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  887. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  888. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  889. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  890. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  891. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  892. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  894. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  895. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  896. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  897. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  898. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  899. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  900. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  901. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  902. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  903. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  904. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  905. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  906. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  907. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  908. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  909. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  910. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  911. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  919. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  920. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  921. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  922. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  923. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  924. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  925. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  926. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  927. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  928. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  929. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  930. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  945. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  946. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  947. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  948. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  949. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  950. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  951. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  952. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  953. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  954. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  955. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  956. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  957. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  958. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  959. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  960. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1041. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1042. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1043. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1044. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1045. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1046. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1047. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1048. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1049. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1050. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1051. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1052. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1053. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1054. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1055. package/deps/rocksdb/rocksdb.gyp +475 -0
  1056. package/deps/snappy/freebsd/config.h +135 -0
  1057. package/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
  1058. package/deps/snappy/linux/config.h +135 -0
  1059. package/deps/snappy/linux/snappy-stubs-public.h +100 -0
  1060. package/deps/snappy/mac/config.h +137 -0
  1061. package/deps/snappy/mac/snappy-stubs-public.h +100 -0
  1062. package/deps/snappy/openbsd/config.h +135 -0
  1063. package/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
  1064. package/deps/snappy/snappy-1.1.7/COPYING +54 -0
  1065. package/deps/snappy/snappy-1.1.7/cmake/SnappyConfig.cmake +1 -0
  1066. package/deps/snappy/snappy-1.1.7/cmake/config.h.in +62 -0
  1067. package/deps/snappy/snappy-1.1.7/snappy-c.cc +90 -0
  1068. package/deps/snappy/snappy-1.1.7/snappy-c.h +138 -0
  1069. package/deps/snappy/snappy-1.1.7/snappy-internal.h +224 -0
  1070. package/deps/snappy/snappy-1.1.7/snappy-sinksource.cc +104 -0
  1071. package/deps/snappy/snappy-1.1.7/snappy-sinksource.h +182 -0
  1072. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.cc +42 -0
  1073. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.h +561 -0
  1074. package/deps/snappy/snappy-1.1.7/snappy-stubs-public.h.in +94 -0
  1075. package/deps/snappy/snappy-1.1.7/snappy-test.cc +612 -0
  1076. package/deps/snappy/snappy-1.1.7/snappy-test.h +573 -0
  1077. package/deps/snappy/snappy-1.1.7/snappy.cc +1515 -0
  1078. package/deps/snappy/snappy-1.1.7/snappy.h +203 -0
  1079. package/deps/snappy/snappy-1.1.7/snappy_unittest.cc +1410 -0
  1080. package/deps/snappy/snappy.gyp +90 -0
  1081. package/deps/snappy/solaris/config.h +135 -0
  1082. package/deps/snappy/solaris/snappy-stubs-public.h +100 -0
  1083. package/deps/snappy/win32/config.h +29 -0
  1084. package/deps/snappy/win32/snappy-stubs-public.h +100 -0
  1085. package/iterator.js +55 -0
  1086. package/leveldown.js +113 -0
  1087. package/package-lock.json +23687 -0
  1088. package/package.json +70 -0
@@ -0,0 +1,3035 @@
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 "db/version_set.h"
11
+
12
+ #include "db/db_impl/db_impl.h"
13
+ #include "db/log_writer.h"
14
+ #include "table/block_based/block_based_table_factory.h"
15
+ #include "table/mock_table.h"
16
+ #include "test_util/testharness.h"
17
+ #include "test_util/testutil.h"
18
+ #include "util/string_util.h"
19
+
20
+ namespace ROCKSDB_NAMESPACE {
21
+
22
+ class GenerateLevelFilesBriefTest : public testing::Test {
23
+ public:
24
+ std::vector<FileMetaData*> files_;
25
+ LevelFilesBrief file_level_;
26
+ Arena arena_;
27
+
28
+ GenerateLevelFilesBriefTest() { }
29
+
30
+ ~GenerateLevelFilesBriefTest() override {
31
+ for (size_t i = 0; i < files_.size(); i++) {
32
+ delete files_[i];
33
+ }
34
+ }
35
+
36
+ void Add(const char* smallest, const char* largest,
37
+ SequenceNumber smallest_seq = 100,
38
+ SequenceNumber largest_seq = 100) {
39
+ FileMetaData* f = new FileMetaData(
40
+ files_.size() + 1, 0, 0,
41
+ InternalKey(smallest, smallest_seq, kTypeValue),
42
+ InternalKey(largest, largest_seq, kTypeValue), smallest_seq,
43
+ largest_seq, /* marked_for_compact */ false, kInvalidBlobFileNumber,
44
+ kUnknownOldestAncesterTime, kUnknownFileCreationTime,
45
+ kUnknownFileChecksum, kUnknownFileChecksumFuncName);
46
+ files_.push_back(f);
47
+ }
48
+
49
+ int Compare() {
50
+ int diff = 0;
51
+ for (size_t i = 0; i < files_.size(); i++) {
52
+ if (file_level_.files[i].fd.GetNumber() != files_[i]->fd.GetNumber()) {
53
+ diff++;
54
+ }
55
+ }
56
+ return diff;
57
+ }
58
+ };
59
+
60
+ TEST_F(GenerateLevelFilesBriefTest, Empty) {
61
+ DoGenerateLevelFilesBrief(&file_level_, files_, &arena_);
62
+ ASSERT_EQ(0u, file_level_.num_files);
63
+ ASSERT_EQ(0, Compare());
64
+ }
65
+
66
+ TEST_F(GenerateLevelFilesBriefTest, Single) {
67
+ Add("p", "q");
68
+ DoGenerateLevelFilesBrief(&file_level_, files_, &arena_);
69
+ ASSERT_EQ(1u, file_level_.num_files);
70
+ ASSERT_EQ(0, Compare());
71
+ }
72
+
73
+ TEST_F(GenerateLevelFilesBriefTest, Multiple) {
74
+ Add("150", "200");
75
+ Add("200", "250");
76
+ Add("300", "350");
77
+ Add("400", "450");
78
+ DoGenerateLevelFilesBrief(&file_level_, files_, &arena_);
79
+ ASSERT_EQ(4u, file_level_.num_files);
80
+ ASSERT_EQ(0, Compare());
81
+ }
82
+
83
+ class CountingLogger : public Logger {
84
+ public:
85
+ CountingLogger() : log_count(0) {}
86
+ using Logger::Logv;
87
+ void Logv(const char* /*format*/, va_list /*ap*/) override { log_count++; }
88
+ int log_count;
89
+ };
90
+
91
+ Options GetOptionsWithNumLevels(int num_levels,
92
+ std::shared_ptr<CountingLogger> logger) {
93
+ Options opt;
94
+ opt.num_levels = num_levels;
95
+ opt.info_log = logger;
96
+ return opt;
97
+ }
98
+
99
+ class VersionStorageInfoTestBase : public testing::Test {
100
+ public:
101
+ const Comparator* ucmp_;
102
+ InternalKeyComparator icmp_;
103
+ std::shared_ptr<CountingLogger> logger_;
104
+ Options options_;
105
+ ImmutableCFOptions ioptions_;
106
+ MutableCFOptions mutable_cf_options_;
107
+ VersionStorageInfo vstorage_;
108
+
109
+ InternalKey GetInternalKey(const char* ukey,
110
+ SequenceNumber smallest_seq = 100) {
111
+ return InternalKey(ukey, smallest_seq, kTypeValue);
112
+ }
113
+
114
+ explicit VersionStorageInfoTestBase(const Comparator* ucmp)
115
+ : ucmp_(ucmp),
116
+ icmp_(ucmp_),
117
+ logger_(new CountingLogger()),
118
+ options_(GetOptionsWithNumLevels(6, logger_)),
119
+ ioptions_(options_),
120
+ mutable_cf_options_(options_),
121
+ vstorage_(&icmp_, ucmp_, 6, kCompactionStyleLevel,
122
+ /*src_vstorage=*/nullptr,
123
+ /*_force_consistency_checks=*/false) {}
124
+
125
+ ~VersionStorageInfoTestBase() override {
126
+ for (int i = 0; i < vstorage_.num_levels(); ++i) {
127
+ for (auto* f : vstorage_.LevelFiles(i)) {
128
+ if (--f->refs == 0) {
129
+ delete f;
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ void Add(int level, uint32_t file_number, const char* smallest,
136
+ const char* largest, uint64_t file_size = 0) {
137
+ assert(level < vstorage_.num_levels());
138
+ FileMetaData* f = new FileMetaData(
139
+ file_number, 0, file_size, GetInternalKey(smallest, 0),
140
+ GetInternalKey(largest, 0), /* smallest_seq */ 0, /* largest_seq */ 0,
141
+ /* marked_for_compact */ false, kInvalidBlobFileNumber,
142
+ kUnknownOldestAncesterTime, kUnknownFileCreationTime,
143
+ kUnknownFileChecksum, kUnknownFileChecksumFuncName);
144
+ f->compensated_file_size = file_size;
145
+ vstorage_.AddFile(level, f);
146
+ }
147
+
148
+ void Add(int level, uint32_t file_number, const InternalKey& smallest,
149
+ const InternalKey& largest, uint64_t file_size = 0) {
150
+ assert(level < vstorage_.num_levels());
151
+ FileMetaData* f = new FileMetaData(
152
+ file_number, 0, file_size, smallest, largest, /* smallest_seq */ 0,
153
+ /* largest_seq */ 0, /* marked_for_compact */ false,
154
+ kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
155
+ kUnknownFileCreationTime, kUnknownFileChecksum,
156
+ kUnknownFileChecksumFuncName);
157
+ f->compensated_file_size = file_size;
158
+ vstorage_.AddFile(level, f);
159
+ }
160
+
161
+ std::string GetOverlappingFiles(int level, const InternalKey& begin,
162
+ const InternalKey& end) {
163
+ std::vector<FileMetaData*> inputs;
164
+ vstorage_.GetOverlappingInputs(level, &begin, &end, &inputs);
165
+
166
+ std::string result;
167
+ for (size_t i = 0; i < inputs.size(); ++i) {
168
+ if (i > 0) {
169
+ result += ",";
170
+ }
171
+ AppendNumberTo(&result, inputs[i]->fd.GetNumber());
172
+ }
173
+ return result;
174
+ }
175
+ };
176
+
177
+ class VersionStorageInfoTest : public VersionStorageInfoTestBase {
178
+ public:
179
+ VersionStorageInfoTest() : VersionStorageInfoTestBase(BytewiseComparator()) {}
180
+
181
+ ~VersionStorageInfoTest() override {}
182
+ };
183
+
184
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelStatic) {
185
+ ioptions_.level_compaction_dynamic_level_bytes = false;
186
+ mutable_cf_options_.max_bytes_for_level_base = 10;
187
+ mutable_cf_options_.max_bytes_for_level_multiplier = 5;
188
+ Add(4, 100U, "1", "2");
189
+ Add(5, 101U, "1", "2");
190
+
191
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
192
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(1), 10U);
193
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(2), 50U);
194
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(3), 250U);
195
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 1250U);
196
+
197
+ ASSERT_EQ(0, logger_->log_count);
198
+ }
199
+
200
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamic) {
201
+ ioptions_.level_compaction_dynamic_level_bytes = true;
202
+ mutable_cf_options_.max_bytes_for_level_base = 1000;
203
+ mutable_cf_options_.max_bytes_for_level_multiplier = 5;
204
+ Add(5, 1U, "1", "2", 500U);
205
+
206
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
207
+ ASSERT_EQ(0, logger_->log_count);
208
+ ASSERT_EQ(vstorage_.base_level(), 5);
209
+
210
+ Add(5, 2U, "3", "4", 550U);
211
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
212
+ ASSERT_EQ(0, logger_->log_count);
213
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 1000U);
214
+ ASSERT_EQ(vstorage_.base_level(), 4);
215
+
216
+ Add(4, 3U, "3", "4", 550U);
217
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
218
+ ASSERT_EQ(0, logger_->log_count);
219
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 1000U);
220
+ ASSERT_EQ(vstorage_.base_level(), 4);
221
+
222
+ Add(3, 4U, "3", "4", 250U);
223
+ Add(3, 5U, "5", "7", 300U);
224
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
225
+ ASSERT_EQ(1, logger_->log_count);
226
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 1005U);
227
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(3), 1000U);
228
+ ASSERT_EQ(vstorage_.base_level(), 3);
229
+
230
+ Add(1, 6U, "3", "4", 5U);
231
+ Add(1, 7U, "8", "9", 5U);
232
+ logger_->log_count = 0;
233
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
234
+ ASSERT_EQ(1, logger_->log_count);
235
+ ASSERT_GT(vstorage_.MaxBytesForLevel(4), 1005U);
236
+ ASSERT_GT(vstorage_.MaxBytesForLevel(3), 1005U);
237
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(2), 1005U);
238
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(1), 1000U);
239
+ ASSERT_EQ(vstorage_.base_level(), 1);
240
+ }
241
+
242
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicLotsOfData) {
243
+ ioptions_.level_compaction_dynamic_level_bytes = true;
244
+ mutable_cf_options_.max_bytes_for_level_base = 100;
245
+ mutable_cf_options_.max_bytes_for_level_multiplier = 2;
246
+ Add(0, 1U, "1", "2", 50U);
247
+ Add(1, 2U, "1", "2", 50U);
248
+ Add(2, 3U, "1", "2", 500U);
249
+ Add(3, 4U, "1", "2", 500U);
250
+ Add(4, 5U, "1", "2", 1700U);
251
+ Add(5, 6U, "1", "2", 500U);
252
+
253
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
254
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 800U);
255
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(3), 400U);
256
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(2), 200U);
257
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(1), 100U);
258
+ ASSERT_EQ(vstorage_.base_level(), 1);
259
+ ASSERT_EQ(0, logger_->log_count);
260
+ }
261
+
262
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicLargeLevel) {
263
+ uint64_t kOneGB = 1000U * 1000U * 1000U;
264
+ ioptions_.level_compaction_dynamic_level_bytes = true;
265
+ mutable_cf_options_.max_bytes_for_level_base = 10U * kOneGB;
266
+ mutable_cf_options_.max_bytes_for_level_multiplier = 10;
267
+ Add(0, 1U, "1", "2", 50U);
268
+ Add(3, 4U, "1", "2", 32U * kOneGB);
269
+ Add(4, 5U, "1", "2", 500U * kOneGB);
270
+ Add(5, 6U, "1", "2", 3000U * kOneGB);
271
+
272
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
273
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(5), 3000U * kOneGB);
274
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(4), 300U * kOneGB);
275
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(3), 30U * kOneGB);
276
+ ASSERT_EQ(vstorage_.MaxBytesForLevel(2), 10U * kOneGB);
277
+ ASSERT_EQ(vstorage_.base_level(), 2);
278
+ ASSERT_EQ(0, logger_->log_count);
279
+ }
280
+
281
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_1) {
282
+ ioptions_.level_compaction_dynamic_level_bytes = true;
283
+ mutable_cf_options_.max_bytes_for_level_base = 40000;
284
+ mutable_cf_options_.max_bytes_for_level_multiplier = 5;
285
+ mutable_cf_options_.level0_file_num_compaction_trigger = 2;
286
+
287
+ Add(0, 1U, "1", "2", 10000U);
288
+ Add(0, 2U, "1", "2", 10000U);
289
+ Add(0, 3U, "1", "2", 10000U);
290
+
291
+ Add(5, 4U, "1", "2", 1286250U);
292
+ Add(4, 5U, "1", "2", 200000U);
293
+ Add(3, 6U, "1", "2", 40000U);
294
+ Add(2, 7U, "1", "2", 8000U);
295
+
296
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
297
+ ASSERT_EQ(0, logger_->log_count);
298
+ ASSERT_EQ(2, vstorage_.base_level());
299
+ // level multiplier should be 3.5
300
+ ASSERT_EQ(vstorage_.level_multiplier(), 5.0);
301
+ // Level size should be around 30,000, 105,000, 367,500
302
+ ASSERT_EQ(40000U, vstorage_.MaxBytesForLevel(2));
303
+ ASSERT_EQ(51450U, vstorage_.MaxBytesForLevel(3));
304
+ ASSERT_EQ(257250U, vstorage_.MaxBytesForLevel(4));
305
+ }
306
+
307
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_2) {
308
+ ioptions_.level_compaction_dynamic_level_bytes = true;
309
+ mutable_cf_options_.max_bytes_for_level_base = 10000;
310
+ mutable_cf_options_.max_bytes_for_level_multiplier = 5;
311
+ mutable_cf_options_.level0_file_num_compaction_trigger = 2;
312
+
313
+ Add(0, 11U, "1", "2", 10000U);
314
+ Add(0, 12U, "1", "2", 10000U);
315
+ Add(0, 13U, "1", "2", 10000U);
316
+
317
+ Add(5, 4U, "1", "2", 1286250U);
318
+ Add(4, 5U, "1", "2", 200000U);
319
+ Add(3, 6U, "1", "2", 40000U);
320
+ Add(2, 7U, "1", "2", 8000U);
321
+
322
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
323
+ ASSERT_EQ(0, logger_->log_count);
324
+ ASSERT_EQ(2, vstorage_.base_level());
325
+ // level multiplier should be 3.5
326
+ ASSERT_LT(vstorage_.level_multiplier(), 3.6);
327
+ ASSERT_GT(vstorage_.level_multiplier(), 3.4);
328
+ // Level size should be around 30,000, 105,000, 367,500
329
+ ASSERT_EQ(30000U, vstorage_.MaxBytesForLevel(2));
330
+ ASSERT_LT(vstorage_.MaxBytesForLevel(3), 110000U);
331
+ ASSERT_GT(vstorage_.MaxBytesForLevel(3), 100000U);
332
+ ASSERT_LT(vstorage_.MaxBytesForLevel(4), 370000U);
333
+ ASSERT_GT(vstorage_.MaxBytesForLevel(4), 360000U);
334
+ }
335
+
336
+ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_3) {
337
+ ioptions_.level_compaction_dynamic_level_bytes = true;
338
+ mutable_cf_options_.max_bytes_for_level_base = 10000;
339
+ mutable_cf_options_.max_bytes_for_level_multiplier = 5;
340
+ mutable_cf_options_.level0_file_num_compaction_trigger = 2;
341
+
342
+ Add(0, 11U, "1", "2", 5000U);
343
+ Add(0, 12U, "1", "2", 5000U);
344
+ Add(0, 13U, "1", "2", 5000U);
345
+ Add(0, 14U, "1", "2", 5000U);
346
+ Add(0, 15U, "1", "2", 5000U);
347
+ Add(0, 16U, "1", "2", 5000U);
348
+
349
+ Add(5, 4U, "1", "2", 1286250U);
350
+ Add(4, 5U, "1", "2", 200000U);
351
+ Add(3, 6U, "1", "2", 40000U);
352
+ Add(2, 7U, "1", "2", 8000U);
353
+
354
+ vstorage_.CalculateBaseBytes(ioptions_, mutable_cf_options_);
355
+ ASSERT_EQ(0, logger_->log_count);
356
+ ASSERT_EQ(2, vstorage_.base_level());
357
+ // level multiplier should be 3.5
358
+ ASSERT_LT(vstorage_.level_multiplier(), 3.6);
359
+ ASSERT_GT(vstorage_.level_multiplier(), 3.4);
360
+ // Level size should be around 30,000, 105,000, 367,500
361
+ ASSERT_EQ(30000U, vstorage_.MaxBytesForLevel(2));
362
+ ASSERT_LT(vstorage_.MaxBytesForLevel(3), 110000U);
363
+ ASSERT_GT(vstorage_.MaxBytesForLevel(3), 100000U);
364
+ ASSERT_LT(vstorage_.MaxBytesForLevel(4), 370000U);
365
+ ASSERT_GT(vstorage_.MaxBytesForLevel(4), 360000U);
366
+ }
367
+
368
+ TEST_F(VersionStorageInfoTest, EstimateLiveDataSize) {
369
+ // Test whether the overlaps are detected as expected
370
+ Add(1, 1U, "4", "7", 1U); // Perfect overlap with last level
371
+ Add(2, 2U, "3", "5", 1U); // Partial overlap with last level
372
+ Add(2, 3U, "6", "8", 1U); // Partial overlap with last level
373
+ Add(3, 4U, "1", "9", 1U); // Contains range of last level
374
+ Add(4, 5U, "4", "5", 1U); // Inside range of last level
375
+ Add(4, 6U, "6", "7", 1U); // Inside range of last level
376
+ Add(5, 7U, "4", "7", 10U);
377
+ ASSERT_EQ(10U, vstorage_.EstimateLiveDataSize());
378
+ }
379
+
380
+ TEST_F(VersionStorageInfoTest, EstimateLiveDataSize2) {
381
+ Add(0, 1U, "9", "9", 1U); // Level 0 is not ordered
382
+ Add(0, 2U, "5", "6", 1U); // Ignored because of [5,6] in l1
383
+ Add(1, 3U, "1", "2", 1U); // Ignored because of [2,3] in l2
384
+ Add(1, 4U, "3", "4", 1U); // Ignored because of [2,3] in l2
385
+ Add(1, 5U, "5", "6", 1U);
386
+ Add(2, 6U, "2", "3", 1U);
387
+ Add(3, 7U, "7", "8", 1U);
388
+ ASSERT_EQ(4U, vstorage_.EstimateLiveDataSize());
389
+ }
390
+
391
+ TEST_F(VersionStorageInfoTest, GetOverlappingInputs) {
392
+ // Two files that overlap at the range deletion tombstone sentinel.
393
+ Add(1, 1U, {"a", 0, kTypeValue}, {"b", kMaxSequenceNumber, kTypeRangeDeletion}, 1);
394
+ Add(1, 2U, {"b", 0, kTypeValue}, {"c", 0, kTypeValue}, 1);
395
+ // Two files that overlap at the same user key.
396
+ Add(1, 3U, {"d", 0, kTypeValue}, {"e", kMaxSequenceNumber, kTypeValue}, 1);
397
+ Add(1, 4U, {"e", 0, kTypeValue}, {"f", 0, kTypeValue}, 1);
398
+ // Two files that do not overlap.
399
+ Add(1, 5U, {"g", 0, kTypeValue}, {"h", 0, kTypeValue}, 1);
400
+ Add(1, 6U, {"i", 0, kTypeValue}, {"j", 0, kTypeValue}, 1);
401
+ vstorage_.UpdateNumNonEmptyLevels();
402
+ vstorage_.GenerateLevelFilesBrief();
403
+
404
+ ASSERT_EQ("1,2", GetOverlappingFiles(
405
+ 1, {"a", 0, kTypeValue}, {"b", 0, kTypeValue}));
406
+ ASSERT_EQ("1", GetOverlappingFiles(
407
+ 1, {"a", 0, kTypeValue}, {"b", kMaxSequenceNumber, kTypeRangeDeletion}));
408
+ ASSERT_EQ("2", GetOverlappingFiles(
409
+ 1, {"b", kMaxSequenceNumber, kTypeValue}, {"c", 0, kTypeValue}));
410
+ ASSERT_EQ("3,4", GetOverlappingFiles(
411
+ 1, {"d", 0, kTypeValue}, {"e", 0, kTypeValue}));
412
+ ASSERT_EQ("3", GetOverlappingFiles(
413
+ 1, {"d", 0, kTypeValue}, {"e", kMaxSequenceNumber, kTypeRangeDeletion}));
414
+ ASSERT_EQ("3,4", GetOverlappingFiles(
415
+ 1, {"e", kMaxSequenceNumber, kTypeValue}, {"f", 0, kTypeValue}));
416
+ ASSERT_EQ("3,4", GetOverlappingFiles(
417
+ 1, {"e", 0, kTypeValue}, {"f", 0, kTypeValue}));
418
+ ASSERT_EQ("5", GetOverlappingFiles(
419
+ 1, {"g", 0, kTypeValue}, {"h", 0, kTypeValue}));
420
+ ASSERT_EQ("6", GetOverlappingFiles(
421
+ 1, {"i", 0, kTypeValue}, {"j", 0, kTypeValue}));
422
+ }
423
+
424
+ TEST_F(VersionStorageInfoTest, FileLocationAndMetaDataByNumber) {
425
+ Add(0, 11U, "1", "2", 5000U);
426
+ Add(0, 12U, "1", "2", 5000U);
427
+
428
+ Add(2, 7U, "1", "2", 8000U);
429
+
430
+ ASSERT_EQ(vstorage_.GetFileLocation(11U),
431
+ VersionStorageInfo::FileLocation(0, 0));
432
+ ASSERT_NE(vstorage_.GetFileMetaDataByNumber(11U), nullptr);
433
+
434
+ ASSERT_EQ(vstorage_.GetFileLocation(12U),
435
+ VersionStorageInfo::FileLocation(0, 1));
436
+ ASSERT_NE(vstorage_.GetFileMetaDataByNumber(12U), nullptr);
437
+
438
+ ASSERT_EQ(vstorage_.GetFileLocation(7U),
439
+ VersionStorageInfo::FileLocation(2, 0));
440
+ ASSERT_NE(vstorage_.GetFileMetaDataByNumber(7U), nullptr);
441
+
442
+ ASSERT_FALSE(vstorage_.GetFileLocation(999U).IsValid());
443
+ ASSERT_EQ(vstorage_.GetFileMetaDataByNumber(999U), nullptr);
444
+ }
445
+
446
+ class VersionStorageInfoTimestampTest : public VersionStorageInfoTestBase {
447
+ public:
448
+ VersionStorageInfoTimestampTest()
449
+ : VersionStorageInfoTestBase(test::ComparatorWithU64Ts()) {}
450
+ ~VersionStorageInfoTimestampTest() override {}
451
+ std::string Timestamp(uint64_t ts) const {
452
+ std::string ret;
453
+ PutFixed64(&ret, ts);
454
+ return ret;
455
+ }
456
+ std::string PackUserKeyAndTimestamp(const Slice& ukey, uint64_t ts) const {
457
+ std::string ret;
458
+ ret.assign(ukey.data(), ukey.size());
459
+ PutFixed64(&ret, ts);
460
+ return ret;
461
+ }
462
+ };
463
+
464
+ TEST_F(VersionStorageInfoTimestampTest, GetOverlappingInputs) {
465
+ Add(/*level=*/1, /*file_number=*/1, /*smallest=*/
466
+ {PackUserKeyAndTimestamp("a", /*ts=*/9), /*s=*/0, kTypeValue},
467
+ /*largest=*/
468
+ {PackUserKeyAndTimestamp("a", /*ts=*/8), /*s=*/0, kTypeValue},
469
+ /*file_size=*/100);
470
+ Add(/*level=*/1, /*file_number=*/2, /*smallest=*/
471
+ {PackUserKeyAndTimestamp("a", /*ts=*/5), /*s=*/0, kTypeValue},
472
+ /*largest=*/
473
+ {PackUserKeyAndTimestamp("b", /*ts=*/10), /*s=*/0, kTypeValue},
474
+ /*file_size=*/100);
475
+ Add(/*level=*/1, /*file_number=*/3, /*smallest=*/
476
+ {PackUserKeyAndTimestamp("c", /*ts=*/12), /*s=*/0, kTypeValue},
477
+ /*largest=*/
478
+ {PackUserKeyAndTimestamp("d", /*ts=*/1), /*s=*/0, kTypeValue},
479
+ /*file_size=*/100);
480
+ vstorage_.UpdateNumNonEmptyLevels();
481
+ vstorage_.GenerateLevelFilesBrief();
482
+ ASSERT_EQ(
483
+ "1,2",
484
+ GetOverlappingFiles(
485
+ /*level=*/1,
486
+ {PackUserKeyAndTimestamp("a", /*ts=*/12), /*s=*/0, kTypeValue},
487
+ {PackUserKeyAndTimestamp("a", /*ts=*/11), /*s=*/0, kTypeValue}));
488
+ ASSERT_EQ("3",
489
+ GetOverlappingFiles(
490
+ /*level=*/1,
491
+ {PackUserKeyAndTimestamp("c", /*ts=*/15), /*s=*/0, kTypeValue},
492
+ {PackUserKeyAndTimestamp("c", /*ts=*/2), /*s=*/0, kTypeValue}));
493
+ }
494
+
495
+ class FindLevelFileTest : public testing::Test {
496
+ public:
497
+ LevelFilesBrief file_level_;
498
+ bool disjoint_sorted_files_;
499
+ Arena arena_;
500
+
501
+ FindLevelFileTest() : disjoint_sorted_files_(true) { }
502
+
503
+ ~FindLevelFileTest() override {}
504
+
505
+ void LevelFileInit(size_t num = 0) {
506
+ char* mem = arena_.AllocateAligned(num * sizeof(FdWithKeyRange));
507
+ file_level_.files = new (mem)FdWithKeyRange[num];
508
+ file_level_.num_files = 0;
509
+ }
510
+
511
+ void Add(const char* smallest, const char* largest,
512
+ SequenceNumber smallest_seq = 100,
513
+ SequenceNumber largest_seq = 100) {
514
+ InternalKey smallest_key = InternalKey(smallest, smallest_seq, kTypeValue);
515
+ InternalKey largest_key = InternalKey(largest, largest_seq, kTypeValue);
516
+
517
+ Slice smallest_slice = smallest_key.Encode();
518
+ Slice largest_slice = largest_key.Encode();
519
+
520
+ char* mem = arena_.AllocateAligned(
521
+ smallest_slice.size() + largest_slice.size());
522
+ memcpy(mem, smallest_slice.data(), smallest_slice.size());
523
+ memcpy(mem + smallest_slice.size(), largest_slice.data(),
524
+ largest_slice.size());
525
+
526
+ // add to file_level_
527
+ size_t num = file_level_.num_files;
528
+ auto& file = file_level_.files[num];
529
+ file.fd = FileDescriptor(num + 1, 0, 0);
530
+ file.smallest_key = Slice(mem, smallest_slice.size());
531
+ file.largest_key = Slice(mem + smallest_slice.size(),
532
+ largest_slice.size());
533
+ file_level_.num_files++;
534
+ }
535
+
536
+ int Find(const char* key) {
537
+ InternalKey target(key, 100, kTypeValue);
538
+ InternalKeyComparator cmp(BytewiseComparator());
539
+ return FindFile(cmp, file_level_, target.Encode());
540
+ }
541
+
542
+ bool Overlaps(const char* smallest, const char* largest) {
543
+ InternalKeyComparator cmp(BytewiseComparator());
544
+ Slice s(smallest != nullptr ? smallest : "");
545
+ Slice l(largest != nullptr ? largest : "");
546
+ return SomeFileOverlapsRange(cmp, disjoint_sorted_files_, file_level_,
547
+ (smallest != nullptr ? &s : nullptr),
548
+ (largest != nullptr ? &l : nullptr));
549
+ }
550
+ };
551
+
552
+ TEST_F(FindLevelFileTest, LevelEmpty) {
553
+ LevelFileInit(0);
554
+
555
+ ASSERT_EQ(0, Find("foo"));
556
+ ASSERT_TRUE(! Overlaps("a", "z"));
557
+ ASSERT_TRUE(! Overlaps(nullptr, "z"));
558
+ ASSERT_TRUE(! Overlaps("a", nullptr));
559
+ ASSERT_TRUE(! Overlaps(nullptr, nullptr));
560
+ }
561
+
562
+ TEST_F(FindLevelFileTest, LevelSingle) {
563
+ LevelFileInit(1);
564
+
565
+ Add("p", "q");
566
+ ASSERT_EQ(0, Find("a"));
567
+ ASSERT_EQ(0, Find("p"));
568
+ ASSERT_EQ(0, Find("p1"));
569
+ ASSERT_EQ(0, Find("q"));
570
+ ASSERT_EQ(1, Find("q1"));
571
+ ASSERT_EQ(1, Find("z"));
572
+
573
+ ASSERT_TRUE(! Overlaps("a", "b"));
574
+ ASSERT_TRUE(! Overlaps("z1", "z2"));
575
+ ASSERT_TRUE(Overlaps("a", "p"));
576
+ ASSERT_TRUE(Overlaps("a", "q"));
577
+ ASSERT_TRUE(Overlaps("a", "z"));
578
+ ASSERT_TRUE(Overlaps("p", "p1"));
579
+ ASSERT_TRUE(Overlaps("p", "q"));
580
+ ASSERT_TRUE(Overlaps("p", "z"));
581
+ ASSERT_TRUE(Overlaps("p1", "p2"));
582
+ ASSERT_TRUE(Overlaps("p1", "z"));
583
+ ASSERT_TRUE(Overlaps("q", "q"));
584
+ ASSERT_TRUE(Overlaps("q", "q1"));
585
+
586
+ ASSERT_TRUE(! Overlaps(nullptr, "j"));
587
+ ASSERT_TRUE(! Overlaps("r", nullptr));
588
+ ASSERT_TRUE(Overlaps(nullptr, "p"));
589
+ ASSERT_TRUE(Overlaps(nullptr, "p1"));
590
+ ASSERT_TRUE(Overlaps("q", nullptr));
591
+ ASSERT_TRUE(Overlaps(nullptr, nullptr));
592
+ }
593
+
594
+ TEST_F(FindLevelFileTest, LevelMultiple) {
595
+ LevelFileInit(4);
596
+
597
+ Add("150", "200");
598
+ Add("200", "250");
599
+ Add("300", "350");
600
+ Add("400", "450");
601
+ ASSERT_EQ(0, Find("100"));
602
+ ASSERT_EQ(0, Find("150"));
603
+ ASSERT_EQ(0, Find("151"));
604
+ ASSERT_EQ(0, Find("199"));
605
+ ASSERT_EQ(0, Find("200"));
606
+ ASSERT_EQ(1, Find("201"));
607
+ ASSERT_EQ(1, Find("249"));
608
+ ASSERT_EQ(1, Find("250"));
609
+ ASSERT_EQ(2, Find("251"));
610
+ ASSERT_EQ(2, Find("299"));
611
+ ASSERT_EQ(2, Find("300"));
612
+ ASSERT_EQ(2, Find("349"));
613
+ ASSERT_EQ(2, Find("350"));
614
+ ASSERT_EQ(3, Find("351"));
615
+ ASSERT_EQ(3, Find("400"));
616
+ ASSERT_EQ(3, Find("450"));
617
+ ASSERT_EQ(4, Find("451"));
618
+
619
+ ASSERT_TRUE(! Overlaps("100", "149"));
620
+ ASSERT_TRUE(! Overlaps("251", "299"));
621
+ ASSERT_TRUE(! Overlaps("451", "500"));
622
+ ASSERT_TRUE(! Overlaps("351", "399"));
623
+
624
+ ASSERT_TRUE(Overlaps("100", "150"));
625
+ ASSERT_TRUE(Overlaps("100", "200"));
626
+ ASSERT_TRUE(Overlaps("100", "300"));
627
+ ASSERT_TRUE(Overlaps("100", "400"));
628
+ ASSERT_TRUE(Overlaps("100", "500"));
629
+ ASSERT_TRUE(Overlaps("375", "400"));
630
+ ASSERT_TRUE(Overlaps("450", "450"));
631
+ ASSERT_TRUE(Overlaps("450", "500"));
632
+ }
633
+
634
+ TEST_F(FindLevelFileTest, LevelMultipleNullBoundaries) {
635
+ LevelFileInit(4);
636
+
637
+ Add("150", "200");
638
+ Add("200", "250");
639
+ Add("300", "350");
640
+ Add("400", "450");
641
+ ASSERT_TRUE(! Overlaps(nullptr, "149"));
642
+ ASSERT_TRUE(! Overlaps("451", nullptr));
643
+ ASSERT_TRUE(Overlaps(nullptr, nullptr));
644
+ ASSERT_TRUE(Overlaps(nullptr, "150"));
645
+ ASSERT_TRUE(Overlaps(nullptr, "199"));
646
+ ASSERT_TRUE(Overlaps(nullptr, "200"));
647
+ ASSERT_TRUE(Overlaps(nullptr, "201"));
648
+ ASSERT_TRUE(Overlaps(nullptr, "400"));
649
+ ASSERT_TRUE(Overlaps(nullptr, "800"));
650
+ ASSERT_TRUE(Overlaps("100", nullptr));
651
+ ASSERT_TRUE(Overlaps("200", nullptr));
652
+ ASSERT_TRUE(Overlaps("449", nullptr));
653
+ ASSERT_TRUE(Overlaps("450", nullptr));
654
+ }
655
+
656
+ TEST_F(FindLevelFileTest, LevelOverlapSequenceChecks) {
657
+ LevelFileInit(1);
658
+
659
+ Add("200", "200", 5000, 3000);
660
+ ASSERT_TRUE(! Overlaps("199", "199"));
661
+ ASSERT_TRUE(! Overlaps("201", "300"));
662
+ ASSERT_TRUE(Overlaps("200", "200"));
663
+ ASSERT_TRUE(Overlaps("190", "200"));
664
+ ASSERT_TRUE(Overlaps("200", "210"));
665
+ }
666
+
667
+ TEST_F(FindLevelFileTest, LevelOverlappingFiles) {
668
+ LevelFileInit(2);
669
+
670
+ Add("150", "600");
671
+ Add("400", "500");
672
+ disjoint_sorted_files_ = false;
673
+ ASSERT_TRUE(! Overlaps("100", "149"));
674
+ ASSERT_TRUE(! Overlaps("601", "700"));
675
+ ASSERT_TRUE(Overlaps("100", "150"));
676
+ ASSERT_TRUE(Overlaps("100", "200"));
677
+ ASSERT_TRUE(Overlaps("100", "300"));
678
+ ASSERT_TRUE(Overlaps("100", "400"));
679
+ ASSERT_TRUE(Overlaps("100", "500"));
680
+ ASSERT_TRUE(Overlaps("375", "400"));
681
+ ASSERT_TRUE(Overlaps("450", "450"));
682
+ ASSERT_TRUE(Overlaps("450", "500"));
683
+ ASSERT_TRUE(Overlaps("450", "700"));
684
+ ASSERT_TRUE(Overlaps("600", "700"));
685
+ }
686
+
687
+ class VersionSetTestBase {
688
+ public:
689
+ const static std::string kColumnFamilyName1;
690
+ const static std::string kColumnFamilyName2;
691
+ const static std::string kColumnFamilyName3;
692
+ int num_initial_edits_;
693
+
694
+ explicit VersionSetTestBase(const std::string& name)
695
+ : env_(nullptr),
696
+ dbname_(test::PerThreadDBPath(name)),
697
+ options_(),
698
+ db_options_(options_),
699
+ cf_options_(options_),
700
+ immutable_cf_options_(db_options_, cf_options_),
701
+ mutable_cf_options_(cf_options_),
702
+ table_cache_(NewLRUCache(50000, 16)),
703
+ write_buffer_manager_(db_options_.db_write_buffer_size),
704
+ shutting_down_(false),
705
+ mock_table_factory_(std::make_shared<mock::MockTableFactory>()) {
706
+ const char* test_env_uri = getenv("TEST_ENV_URI");
707
+ if (test_env_uri) {
708
+ Status s = Env::LoadEnv(test_env_uri, &env_, &env_guard_);
709
+ EXPECT_OK(s);
710
+ } else if (getenv("MEM_ENV")) {
711
+ env_guard_.reset(NewMemEnv(Env::Default()));
712
+ env_ = env_guard_.get();
713
+ } else {
714
+ env_ = Env::Default();
715
+ }
716
+ EXPECT_NE(nullptr, env_);
717
+
718
+ fs_ = env_->GetFileSystem();
719
+ EXPECT_OK(fs_->CreateDirIfMissing(dbname_, IOOptions(), nullptr));
720
+
721
+ options_.env = env_;
722
+ db_options_.env = env_;
723
+ db_options_.fs = fs_;
724
+ immutable_cf_options_.env = env_;
725
+ immutable_cf_options_.fs = fs_.get();
726
+
727
+ versions_.reset(
728
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
729
+ &write_buffer_manager_, &write_controller_,
730
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
731
+ reactive_versions_ = std::make_shared<ReactiveVersionSet>(
732
+ dbname_, &db_options_, env_options_, table_cache_.get(),
733
+ &write_buffer_manager_, &write_controller_, nullptr);
734
+ db_options_.db_paths.emplace_back(dbname_,
735
+ std::numeric_limits<uint64_t>::max());
736
+ }
737
+
738
+ virtual ~VersionSetTestBase() {
739
+ if (getenv("KEEP_DB")) {
740
+ fprintf(stdout, "DB is still at %s\n", dbname_.c_str());
741
+ } else {
742
+ Options options;
743
+ options.env = env_;
744
+ EXPECT_OK(DestroyDB(dbname_, options));
745
+ }
746
+ }
747
+
748
+ protected:
749
+ virtual void PrepareManifest(
750
+ std::vector<ColumnFamilyDescriptor>* column_families,
751
+ SequenceNumber* last_seqno, std::unique_ptr<log::Writer>* log_writer) {
752
+ assert(column_families != nullptr);
753
+ assert(last_seqno != nullptr);
754
+ assert(log_writer != nullptr);
755
+ VersionEdit new_db;
756
+ if (db_options_.write_dbid_to_manifest) {
757
+ DBOptions tmp_db_options;
758
+ tmp_db_options.env = env_;
759
+ std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
760
+ std::string db_id;
761
+ impl->GetDbIdentityFromIdentityFile(&db_id);
762
+ new_db.SetDBId(db_id);
763
+ }
764
+ new_db.SetLogNumber(0);
765
+ new_db.SetNextFile(2);
766
+ new_db.SetLastSequence(0);
767
+
768
+ const std::vector<std::string> cf_names = {
769
+ kDefaultColumnFamilyName, kColumnFamilyName1, kColumnFamilyName2,
770
+ kColumnFamilyName3};
771
+ const int kInitialNumOfCfs = static_cast<int>(cf_names.size());
772
+ autovector<VersionEdit> new_cfs;
773
+ uint64_t last_seq = 1;
774
+ uint32_t cf_id = 1;
775
+ for (int i = 1; i != kInitialNumOfCfs; ++i) {
776
+ VersionEdit new_cf;
777
+ new_cf.AddColumnFamily(cf_names[i]);
778
+ new_cf.SetColumnFamily(cf_id++);
779
+ new_cf.SetLogNumber(0);
780
+ new_cf.SetNextFile(2);
781
+ new_cf.SetLastSequence(last_seq++);
782
+ new_cfs.emplace_back(new_cf);
783
+ }
784
+ *last_seqno = last_seq;
785
+ num_initial_edits_ = static_cast<int>(new_cfs.size() + 1);
786
+ const std::string manifest = DescriptorFileName(dbname_, 1);
787
+ std::unique_ptr<WritableFile> file;
788
+ Status s = env_->NewWritableFile(
789
+ manifest, &file, env_->OptimizeForManifestWrite(env_options_));
790
+ ASSERT_OK(s);
791
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
792
+ NewLegacyWritableFileWrapper(std::move(file)), manifest, env_options_));
793
+ {
794
+ log_writer->reset(new log::Writer(std::move(file_writer), 0, false));
795
+ std::string record;
796
+ new_db.EncodeTo(&record);
797
+ s = (*log_writer)->AddRecord(record);
798
+ for (const auto& e : new_cfs) {
799
+ record.clear();
800
+ e.EncodeTo(&record);
801
+ s = (*log_writer)->AddRecord(record);
802
+ ASSERT_OK(s);
803
+ }
804
+ }
805
+ ASSERT_OK(s);
806
+
807
+ cf_options_.table_factory = mock_table_factory_;
808
+ for (const auto& cf_name : cf_names) {
809
+ column_families->emplace_back(cf_name, cf_options_);
810
+ }
811
+ }
812
+
813
+ // Create DB with 3 column families.
814
+ void NewDB() {
815
+ SequenceNumber last_seqno;
816
+ std::unique_ptr<log::Writer> log_writer;
817
+ SetIdentityFile(env_, dbname_);
818
+ PrepareManifest(&column_families_, &last_seqno, &log_writer);
819
+ log_writer.reset();
820
+ // Make "CURRENT" file point to the new manifest file.
821
+ Status s = SetCurrentFile(fs_.get(), dbname_, 1, nullptr);
822
+ ASSERT_OK(s);
823
+
824
+ EXPECT_OK(versions_->Recover(column_families_, false));
825
+ EXPECT_EQ(column_families_.size(),
826
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
827
+ }
828
+
829
+ void ReopenDB() {
830
+ versions_.reset(
831
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
832
+ &write_buffer_manager_, &write_controller_,
833
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
834
+ EXPECT_OK(versions_->Recover(column_families_, false));
835
+ }
836
+
837
+ void VerifyManifest(std::string* manifest_path) const {
838
+ assert(manifest_path != nullptr);
839
+ uint64_t manifest_file_number = 0;
840
+ Status s = versions_->GetCurrentManifestPath(
841
+ dbname_, fs_.get(), manifest_path, &manifest_file_number);
842
+ ASSERT_OK(s);
843
+ ASSERT_EQ(1, manifest_file_number);
844
+ }
845
+
846
+ Status LogAndApplyToDefaultCF(VersionEdit& edit) {
847
+ mutex_.Lock();
848
+ Status s =
849
+ versions_->LogAndApply(versions_->GetColumnFamilySet()->GetDefault(),
850
+ mutable_cf_options_, &edit, &mutex_);
851
+ mutex_.Unlock();
852
+ return s;
853
+ }
854
+
855
+ Status LogAndApplyToDefaultCF(
856
+ const autovector<std::unique_ptr<VersionEdit>>& edits) {
857
+ autovector<VersionEdit*> vedits;
858
+ for (auto& e : edits) {
859
+ vedits.push_back(e.get());
860
+ }
861
+ mutex_.Lock();
862
+ Status s =
863
+ versions_->LogAndApply(versions_->GetColumnFamilySet()->GetDefault(),
864
+ mutable_cf_options_, vedits, &mutex_);
865
+ mutex_.Unlock();
866
+ return s;
867
+ }
868
+
869
+ void CreateNewManifest() {
870
+ constexpr FSDirectory* db_directory = nullptr;
871
+ constexpr bool new_descriptor_log = true;
872
+ mutex_.Lock();
873
+ VersionEdit dummy;
874
+ ASSERT_OK(versions_->LogAndApply(
875
+ versions_->GetColumnFamilySet()->GetDefault(), mutable_cf_options_,
876
+ &dummy, &mutex_, db_directory, new_descriptor_log));
877
+ mutex_.Unlock();
878
+ }
879
+
880
+ ColumnFamilyData* CreateColumnFamily(const std::string& cf_name,
881
+ const ColumnFamilyOptions& cf_options) {
882
+ VersionEdit new_cf;
883
+ new_cf.AddColumnFamily(cf_name);
884
+ uint32_t new_id = versions_->GetColumnFamilySet()->GetNextColumnFamilyID();
885
+ new_cf.SetColumnFamily(new_id);
886
+ new_cf.SetLogNumber(0);
887
+ new_cf.SetComparatorName(cf_options.comparator->Name());
888
+ Status s;
889
+ mutex_.Lock();
890
+ s = versions_->LogAndApply(/*column_family_data=*/nullptr,
891
+ MutableCFOptions(cf_options), &new_cf, &mutex_,
892
+ /*db_directory=*/nullptr,
893
+ /*new_descriptor_log=*/false, &cf_options);
894
+ mutex_.Unlock();
895
+ EXPECT_OK(s);
896
+ ColumnFamilyData* cfd =
897
+ versions_->GetColumnFamilySet()->GetColumnFamily(cf_name);
898
+ EXPECT_NE(nullptr, cfd);
899
+ return cfd;
900
+ }
901
+
902
+ Env* mem_env_;
903
+ Env* env_;
904
+ std::shared_ptr<Env> env_guard_;
905
+ std::shared_ptr<FileSystem> fs_;
906
+ const std::string dbname_;
907
+ EnvOptions env_options_;
908
+ Options options_;
909
+ ImmutableDBOptions db_options_;
910
+ ColumnFamilyOptions cf_options_;
911
+ ImmutableCFOptions immutable_cf_options_;
912
+ MutableCFOptions mutable_cf_options_;
913
+ std::shared_ptr<Cache> table_cache_;
914
+ WriteController write_controller_;
915
+ WriteBufferManager write_buffer_manager_;
916
+ std::shared_ptr<VersionSet> versions_;
917
+ std::shared_ptr<ReactiveVersionSet> reactive_versions_;
918
+ InstrumentedMutex mutex_;
919
+ std::atomic<bool> shutting_down_;
920
+ std::shared_ptr<mock::MockTableFactory> mock_table_factory_;
921
+ std::vector<ColumnFamilyDescriptor> column_families_;
922
+ };
923
+
924
+ const std::string VersionSetTestBase::kColumnFamilyName1 = "alice";
925
+ const std::string VersionSetTestBase::kColumnFamilyName2 = "bob";
926
+ const std::string VersionSetTestBase::kColumnFamilyName3 = "charles";
927
+
928
+ class VersionSetTest : public VersionSetTestBase, public testing::Test {
929
+ public:
930
+ VersionSetTest() : VersionSetTestBase("version_set_test") {}
931
+ };
932
+
933
+ TEST_F(VersionSetTest, SameColumnFamilyGroupCommit) {
934
+ NewDB();
935
+ const int kGroupSize = 5;
936
+ autovector<VersionEdit> edits;
937
+ for (int i = 0; i != kGroupSize; ++i) {
938
+ edits.emplace_back(VersionEdit());
939
+ }
940
+ autovector<ColumnFamilyData*> cfds;
941
+ autovector<const MutableCFOptions*> all_mutable_cf_options;
942
+ autovector<autovector<VersionEdit*>> edit_lists;
943
+ for (int i = 0; i != kGroupSize; ++i) {
944
+ cfds.emplace_back(versions_->GetColumnFamilySet()->GetDefault());
945
+ all_mutable_cf_options.emplace_back(&mutable_cf_options_);
946
+ autovector<VersionEdit*> edit_list;
947
+ edit_list.emplace_back(&edits[i]);
948
+ edit_lists.emplace_back(edit_list);
949
+ }
950
+
951
+ SyncPoint::GetInstance()->DisableProcessing();
952
+ SyncPoint::GetInstance()->ClearAllCallBacks();
953
+ int count = 0;
954
+ SyncPoint::GetInstance()->SetCallBack(
955
+ "VersionSet::ProcessManifestWrites:SameColumnFamily", [&](void* arg) {
956
+ uint32_t* cf_id = reinterpret_cast<uint32_t*>(arg);
957
+ EXPECT_EQ(0u, *cf_id);
958
+ ++count;
959
+ });
960
+ SyncPoint::GetInstance()->EnableProcessing();
961
+ mutex_.Lock();
962
+ Status s =
963
+ versions_->LogAndApply(cfds, all_mutable_cf_options, edit_lists, &mutex_);
964
+ mutex_.Unlock();
965
+ EXPECT_OK(s);
966
+ EXPECT_EQ(kGroupSize - 1, count);
967
+ }
968
+
969
+ TEST_F(VersionSetTest, PersistBlobFileStateInNewManifest) {
970
+ // Initialize the database and add a couple of blob files, one with some
971
+ // garbage in it, and one without any garbage.
972
+ NewDB();
973
+
974
+ assert(versions_);
975
+ assert(versions_->GetColumnFamilySet());
976
+
977
+ ColumnFamilyData* const cfd = versions_->GetColumnFamilySet()->GetDefault();
978
+ assert(cfd);
979
+
980
+ Version* const version = cfd->current();
981
+ assert(version);
982
+
983
+ VersionStorageInfo* const storage_info = version->storage_info();
984
+ assert(storage_info);
985
+
986
+ {
987
+ constexpr uint64_t blob_file_number = 123;
988
+ constexpr uint64_t total_blob_count = 456;
989
+ constexpr uint64_t total_blob_bytes = 77777777;
990
+ constexpr char checksum_method[] = "SHA1";
991
+ constexpr char checksum_value[] =
992
+ "bdb7f34a59dfa1592ce7f52e99f98c570c525cbd";
993
+
994
+ auto shared_meta = SharedBlobFileMetaData::Create(
995
+ blob_file_number, total_blob_count, total_blob_bytes, checksum_method,
996
+ checksum_value);
997
+
998
+ constexpr uint64_t garbage_blob_count = 89;
999
+ constexpr uint64_t garbage_blob_bytes = 1000000;
1000
+
1001
+ auto meta = BlobFileMetaData::Create(
1002
+ std::move(shared_meta), BlobFileMetaData::LinkedSsts(),
1003
+ garbage_blob_count, garbage_blob_bytes);
1004
+
1005
+ storage_info->AddBlobFile(std::move(meta));
1006
+ }
1007
+
1008
+ {
1009
+ constexpr uint64_t blob_file_number = 234;
1010
+ constexpr uint64_t total_blob_count = 555;
1011
+ constexpr uint64_t total_blob_bytes = 66666;
1012
+ constexpr char checksum_method[] = "CRC32";
1013
+ constexpr char checksum_value[] = "3d87ff57";
1014
+
1015
+ auto shared_meta = SharedBlobFileMetaData::Create(
1016
+ blob_file_number, total_blob_count, total_blob_bytes, checksum_method,
1017
+ checksum_value);
1018
+
1019
+ constexpr uint64_t garbage_blob_count = 0;
1020
+ constexpr uint64_t garbage_blob_bytes = 0;
1021
+
1022
+ auto meta = BlobFileMetaData::Create(
1023
+ std::move(shared_meta), BlobFileMetaData::LinkedSsts(),
1024
+ garbage_blob_count, garbage_blob_bytes);
1025
+
1026
+ storage_info->AddBlobFile(std::move(meta));
1027
+ }
1028
+
1029
+ // Force the creation of a new manifest file and make sure metadata for
1030
+ // the blob files is re-persisted.
1031
+ size_t addition_encoded = 0;
1032
+ SyncPoint::GetInstance()->SetCallBack(
1033
+ "BlobFileAddition::EncodeTo::CustomFields",
1034
+ [&](void* /* arg */) { ++addition_encoded; });
1035
+
1036
+ size_t garbage_encoded = 0;
1037
+ SyncPoint::GetInstance()->SetCallBack(
1038
+ "BlobFileGarbage::EncodeTo::CustomFields",
1039
+ [&](void* /* arg */) { ++garbage_encoded; });
1040
+ SyncPoint::GetInstance()->EnableProcessing();
1041
+
1042
+ CreateNewManifest();
1043
+
1044
+ ASSERT_EQ(addition_encoded, 2);
1045
+ ASSERT_EQ(garbage_encoded, 1);
1046
+
1047
+ SyncPoint::GetInstance()->DisableProcessing();
1048
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1049
+ }
1050
+
1051
+ TEST_F(VersionSetTest, AddLiveBlobFiles) {
1052
+ // Initialize the database and add a blob file.
1053
+ NewDB();
1054
+
1055
+ assert(versions_);
1056
+ assert(versions_->GetColumnFamilySet());
1057
+
1058
+ ColumnFamilyData* const cfd = versions_->GetColumnFamilySet()->GetDefault();
1059
+ assert(cfd);
1060
+
1061
+ Version* const first_version = cfd->current();
1062
+ assert(first_version);
1063
+
1064
+ VersionStorageInfo* const first_storage_info = first_version->storage_info();
1065
+ assert(first_storage_info);
1066
+
1067
+ constexpr uint64_t first_blob_file_number = 234;
1068
+ constexpr uint64_t first_total_blob_count = 555;
1069
+ constexpr uint64_t first_total_blob_bytes = 66666;
1070
+ constexpr char first_checksum_method[] = "CRC32";
1071
+ constexpr char first_checksum_value[] = "3d87ff57";
1072
+
1073
+ auto first_shared_meta = SharedBlobFileMetaData::Create(
1074
+ first_blob_file_number, first_total_blob_count, first_total_blob_bytes,
1075
+ first_checksum_method, first_checksum_value);
1076
+
1077
+ constexpr uint64_t garbage_blob_count = 0;
1078
+ constexpr uint64_t garbage_blob_bytes = 0;
1079
+
1080
+ auto first_meta = BlobFileMetaData::Create(
1081
+ std::move(first_shared_meta), BlobFileMetaData::LinkedSsts(),
1082
+ garbage_blob_count, garbage_blob_bytes);
1083
+
1084
+ first_storage_info->AddBlobFile(first_meta);
1085
+
1086
+ // Reference the version so it stays alive even after the following version
1087
+ // edit.
1088
+ first_version->Ref();
1089
+
1090
+ // Get live files directly from version.
1091
+ std::vector<uint64_t> version_table_files;
1092
+ std::vector<uint64_t> version_blob_files;
1093
+
1094
+ first_version->AddLiveFiles(&version_table_files, &version_blob_files);
1095
+
1096
+ ASSERT_EQ(version_blob_files.size(), 1);
1097
+ ASSERT_EQ(version_blob_files[0], first_blob_file_number);
1098
+
1099
+ // Create a new version containing an additional blob file.
1100
+ versions_->TEST_CreateAndAppendVersion(cfd);
1101
+
1102
+ Version* const second_version = cfd->current();
1103
+ assert(second_version);
1104
+ assert(second_version != first_version);
1105
+
1106
+ VersionStorageInfo* const second_storage_info =
1107
+ second_version->storage_info();
1108
+ assert(second_storage_info);
1109
+
1110
+ constexpr uint64_t second_blob_file_number = 456;
1111
+ constexpr uint64_t second_total_blob_count = 100;
1112
+ constexpr uint64_t second_total_blob_bytes = 2000000;
1113
+ constexpr char second_checksum_method[] = "CRC32B";
1114
+ constexpr char second_checksum_value[] = "6dbdf23a";
1115
+
1116
+ auto second_shared_meta = SharedBlobFileMetaData::Create(
1117
+ second_blob_file_number, second_total_blob_count, second_total_blob_bytes,
1118
+ second_checksum_method, second_checksum_value);
1119
+
1120
+ auto second_meta = BlobFileMetaData::Create(
1121
+ std::move(second_shared_meta), BlobFileMetaData::LinkedSsts(),
1122
+ garbage_blob_count, garbage_blob_bytes);
1123
+
1124
+ second_storage_info->AddBlobFile(std::move(first_meta));
1125
+ second_storage_info->AddBlobFile(std::move(second_meta));
1126
+
1127
+ // Get all live files from version set. Note that the result contains
1128
+ // duplicates.
1129
+ std::vector<uint64_t> all_table_files;
1130
+ std::vector<uint64_t> all_blob_files;
1131
+
1132
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
1133
+
1134
+ ASSERT_EQ(all_blob_files.size(), 3);
1135
+ ASSERT_EQ(all_blob_files[0], first_blob_file_number);
1136
+ ASSERT_EQ(all_blob_files[1], first_blob_file_number);
1137
+ ASSERT_EQ(all_blob_files[2], second_blob_file_number);
1138
+
1139
+ // Clean up previous version.
1140
+ first_version->Unref();
1141
+ }
1142
+
1143
+ TEST_F(VersionSetTest, ObsoleteBlobFile) {
1144
+ // Initialize the database and add a blob file that is entirely garbage
1145
+ // and thus can immediately be marked obsolete.
1146
+ NewDB();
1147
+
1148
+ VersionEdit edit;
1149
+
1150
+ constexpr uint64_t blob_file_number = 234;
1151
+ constexpr uint64_t total_blob_count = 555;
1152
+ constexpr uint64_t total_blob_bytes = 66666;
1153
+ constexpr char checksum_method[] = "CRC32";
1154
+ constexpr char checksum_value[] = "3d87ff57";
1155
+
1156
+ edit.AddBlobFile(blob_file_number, total_blob_count, total_blob_bytes,
1157
+ checksum_method, checksum_value);
1158
+
1159
+ edit.AddBlobFileGarbage(blob_file_number, total_blob_count, total_blob_bytes);
1160
+
1161
+ mutex_.Lock();
1162
+ Status s =
1163
+ versions_->LogAndApply(versions_->GetColumnFamilySet()->GetDefault(),
1164
+ mutable_cf_options_, &edit, &mutex_);
1165
+ mutex_.Unlock();
1166
+
1167
+ ASSERT_OK(s);
1168
+
1169
+ // Make sure blob files from the pending number range are not returned
1170
+ // as obsolete.
1171
+ {
1172
+ std::vector<ObsoleteFileInfo> table_files;
1173
+ std::vector<ObsoleteBlobFileInfo> blob_files;
1174
+ std::vector<std::string> manifest_files;
1175
+ constexpr uint64_t min_pending_output = blob_file_number;
1176
+
1177
+ versions_->GetObsoleteFiles(&table_files, &blob_files, &manifest_files,
1178
+ min_pending_output);
1179
+
1180
+ ASSERT_TRUE(blob_files.empty());
1181
+ }
1182
+
1183
+ // Make sure the blob file is returned as obsolete if it's not in the pending
1184
+ // range.
1185
+ {
1186
+ std::vector<ObsoleteFileInfo> table_files;
1187
+ std::vector<ObsoleteBlobFileInfo> blob_files;
1188
+ std::vector<std::string> manifest_files;
1189
+ constexpr uint64_t min_pending_output = blob_file_number + 1;
1190
+
1191
+ versions_->GetObsoleteFiles(&table_files, &blob_files, &manifest_files,
1192
+ min_pending_output);
1193
+
1194
+ ASSERT_EQ(blob_files.size(), 1);
1195
+ ASSERT_EQ(blob_files[0].GetBlobFileNumber(), blob_file_number);
1196
+ }
1197
+
1198
+ // Make sure it's not returned a second time.
1199
+ {
1200
+ std::vector<ObsoleteFileInfo> table_files;
1201
+ std::vector<ObsoleteBlobFileInfo> blob_files;
1202
+ std::vector<std::string> manifest_files;
1203
+ constexpr uint64_t min_pending_output = blob_file_number + 1;
1204
+
1205
+ versions_->GetObsoleteFiles(&table_files, &blob_files, &manifest_files,
1206
+ min_pending_output);
1207
+
1208
+ ASSERT_TRUE(blob_files.empty());
1209
+ }
1210
+ }
1211
+
1212
+ TEST_F(VersionSetTest, WalEditsNotAppliedToVersion) {
1213
+ NewDB();
1214
+
1215
+ constexpr uint64_t kNumWals = 5;
1216
+
1217
+ autovector<std::unique_ptr<VersionEdit>> edits;
1218
+ // Add some WALs.
1219
+ for (uint64_t i = 1; i <= kNumWals; i++) {
1220
+ edits.emplace_back(new VersionEdit);
1221
+ // WAL's size equals its log number.
1222
+ edits.back()->AddWal(i, WalMetadata(i));
1223
+ }
1224
+ // Delete the first half of the WALs.
1225
+ edits.emplace_back(new VersionEdit);
1226
+ edits.back()->DeleteWalsBefore(kNumWals / 2 + 1);
1227
+
1228
+ autovector<Version*> versions;
1229
+ SyncPoint::GetInstance()->SetCallBack(
1230
+ "VersionSet::ProcessManifestWrites:NewVersion",
1231
+ [&](void* arg) { versions.push_back(reinterpret_cast<Version*>(arg)); });
1232
+ SyncPoint::GetInstance()->EnableProcessing();
1233
+
1234
+ ASSERT_OK(LogAndApplyToDefaultCF(edits));
1235
+
1236
+ SyncPoint::GetInstance()->DisableProcessing();
1237
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1238
+
1239
+ // Since the edits are all WAL edits, no version should be created.
1240
+ ASSERT_EQ(versions.size(), 1);
1241
+ ASSERT_EQ(versions[0], nullptr);
1242
+ }
1243
+
1244
+ // Similar to WalEditsNotAppliedToVersion, but contains a non-WAL edit.
1245
+ TEST_F(VersionSetTest, NonWalEditsAppliedToVersion) {
1246
+ NewDB();
1247
+
1248
+ const std::string kDBId = "db_db";
1249
+ constexpr uint64_t kNumWals = 5;
1250
+
1251
+ autovector<std::unique_ptr<VersionEdit>> edits;
1252
+ // Add some WALs.
1253
+ for (uint64_t i = 1; i <= kNumWals; i++) {
1254
+ edits.emplace_back(new VersionEdit);
1255
+ // WAL's size equals its log number.
1256
+ edits.back()->AddWal(i, WalMetadata(i));
1257
+ }
1258
+ // Delete the first half of the WALs.
1259
+ edits.emplace_back(new VersionEdit);
1260
+ edits.back()->DeleteWalsBefore(kNumWals / 2 + 1);
1261
+ edits.emplace_back(new VersionEdit);
1262
+ edits.back()->SetDBId(kDBId);
1263
+
1264
+ autovector<Version*> versions;
1265
+ SyncPoint::GetInstance()->SetCallBack(
1266
+ "VersionSet::ProcessManifestWrites:NewVersion",
1267
+ [&](void* arg) { versions.push_back(reinterpret_cast<Version*>(arg)); });
1268
+ SyncPoint::GetInstance()->EnableProcessing();
1269
+
1270
+ ASSERT_OK(LogAndApplyToDefaultCF(edits));
1271
+
1272
+ SyncPoint::GetInstance()->DisableProcessing();
1273
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1274
+
1275
+ // Since the edits are all WAL edits, no version should be created.
1276
+ ASSERT_EQ(versions.size(), 1);
1277
+ ASSERT_NE(versions[0], nullptr);
1278
+ }
1279
+
1280
+ TEST_F(VersionSetTest, WalAddition) {
1281
+ NewDB();
1282
+
1283
+ constexpr WalNumber kLogNumber = 10;
1284
+ constexpr uint64_t kSizeInBytes = 111;
1285
+
1286
+ // A WAL is just created.
1287
+ {
1288
+ VersionEdit edit;
1289
+ edit.AddWal(kLogNumber);
1290
+
1291
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1292
+
1293
+ const auto& wals = versions_->GetWalSet().GetWals();
1294
+ ASSERT_EQ(wals.size(), 1);
1295
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1296
+ ASSERT_FALSE(wals.at(kLogNumber).HasSyncedSize());
1297
+ }
1298
+
1299
+ // The WAL is synced for several times before closing.
1300
+ {
1301
+ for (uint64_t size_delta = 100; size_delta > 0; size_delta /= 2) {
1302
+ uint64_t size = kSizeInBytes - size_delta;
1303
+ WalMetadata wal(size);
1304
+ VersionEdit edit;
1305
+ edit.AddWal(kLogNumber, wal);
1306
+
1307
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1308
+
1309
+ const auto& wals = versions_->GetWalSet().GetWals();
1310
+ ASSERT_EQ(wals.size(), 1);
1311
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1312
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1313
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), size);
1314
+ }
1315
+ }
1316
+
1317
+ // The WAL is closed.
1318
+ {
1319
+ WalMetadata wal(kSizeInBytes);
1320
+ VersionEdit edit;
1321
+ edit.AddWal(kLogNumber, wal);
1322
+
1323
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1324
+
1325
+ const auto& wals = versions_->GetWalSet().GetWals();
1326
+ ASSERT_EQ(wals.size(), 1);
1327
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1328
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1329
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), kSizeInBytes);
1330
+ }
1331
+
1332
+ // Recover a new VersionSet.
1333
+ {
1334
+ std::unique_ptr<VersionSet> new_versions(
1335
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1336
+ &write_buffer_manager_, &write_controller_,
1337
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1338
+ ASSERT_OK(new_versions->Recover(column_families_, /*read_only=*/false));
1339
+ const auto& wals = new_versions->GetWalSet().GetWals();
1340
+ ASSERT_EQ(wals.size(), 1);
1341
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1342
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1343
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), kSizeInBytes);
1344
+ }
1345
+ }
1346
+
1347
+ TEST_F(VersionSetTest, WalCloseWithoutSync) {
1348
+ NewDB();
1349
+
1350
+ constexpr WalNumber kLogNumber = 10;
1351
+ constexpr uint64_t kSizeInBytes = 111;
1352
+ constexpr uint64_t kSyncedSizeInBytes = kSizeInBytes / 2;
1353
+
1354
+ // A WAL is just created.
1355
+ {
1356
+ VersionEdit edit;
1357
+ edit.AddWal(kLogNumber);
1358
+
1359
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1360
+
1361
+ const auto& wals = versions_->GetWalSet().GetWals();
1362
+ ASSERT_EQ(wals.size(), 1);
1363
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1364
+ ASSERT_FALSE(wals.at(kLogNumber).HasSyncedSize());
1365
+ }
1366
+
1367
+ // The WAL is synced before closing.
1368
+ {
1369
+ WalMetadata wal(kSyncedSizeInBytes);
1370
+ VersionEdit edit;
1371
+ edit.AddWal(kLogNumber, wal);
1372
+
1373
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1374
+
1375
+ const auto& wals = versions_->GetWalSet().GetWals();
1376
+ ASSERT_EQ(wals.size(), 1);
1377
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1378
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1379
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), kSyncedSizeInBytes);
1380
+ }
1381
+
1382
+ // A new WAL with larger log number is created,
1383
+ // implicitly marking the current WAL closed.
1384
+ {
1385
+ VersionEdit edit;
1386
+ edit.AddWal(kLogNumber + 1);
1387
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1388
+
1389
+ const auto& wals = versions_->GetWalSet().GetWals();
1390
+ ASSERT_EQ(wals.size(), 2);
1391
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1392
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1393
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), kSyncedSizeInBytes);
1394
+ ASSERT_TRUE(wals.find(kLogNumber + 1) != wals.end());
1395
+ ASSERT_FALSE(wals.at(kLogNumber + 1).HasSyncedSize());
1396
+ }
1397
+
1398
+ // Recover a new VersionSet.
1399
+ {
1400
+ std::unique_ptr<VersionSet> new_versions(
1401
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1402
+ &write_buffer_manager_, &write_controller_,
1403
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1404
+ ASSERT_OK(new_versions->Recover(column_families_, false));
1405
+ const auto& wals = new_versions->GetWalSet().GetWals();
1406
+ ASSERT_EQ(wals.size(), 2);
1407
+ ASSERT_TRUE(wals.find(kLogNumber) != wals.end());
1408
+ ASSERT_TRUE(wals.at(kLogNumber).HasSyncedSize());
1409
+ ASSERT_EQ(wals.at(kLogNumber).GetSyncedSizeInBytes(), kSyncedSizeInBytes);
1410
+ }
1411
+ }
1412
+
1413
+ TEST_F(VersionSetTest, WalDeletion) {
1414
+ NewDB();
1415
+
1416
+ constexpr WalNumber kClosedLogNumber = 10;
1417
+ constexpr WalNumber kNonClosedLogNumber = 20;
1418
+ constexpr uint64_t kSizeInBytes = 111;
1419
+
1420
+ // Add a non-closed and a closed WAL.
1421
+ {
1422
+ VersionEdit edit;
1423
+ edit.AddWal(kClosedLogNumber, WalMetadata(kSizeInBytes));
1424
+ edit.AddWal(kNonClosedLogNumber);
1425
+
1426
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1427
+
1428
+ const auto& wals = versions_->GetWalSet().GetWals();
1429
+ ASSERT_EQ(wals.size(), 2);
1430
+ ASSERT_TRUE(wals.find(kNonClosedLogNumber) != wals.end());
1431
+ ASSERT_TRUE(wals.find(kClosedLogNumber) != wals.end());
1432
+ ASSERT_FALSE(wals.at(kNonClosedLogNumber).HasSyncedSize());
1433
+ ASSERT_TRUE(wals.at(kClosedLogNumber).HasSyncedSize());
1434
+ ASSERT_EQ(wals.at(kClosedLogNumber).GetSyncedSizeInBytes(), kSizeInBytes);
1435
+ }
1436
+
1437
+ // Delete the closed WAL.
1438
+ {
1439
+ VersionEdit edit;
1440
+ edit.DeleteWalsBefore(kNonClosedLogNumber);
1441
+
1442
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1443
+
1444
+ const auto& wals = versions_->GetWalSet().GetWals();
1445
+ ASSERT_EQ(wals.size(), 1);
1446
+ ASSERT_TRUE(wals.find(kNonClosedLogNumber) != wals.end());
1447
+ ASSERT_FALSE(wals.at(kNonClosedLogNumber).HasSyncedSize());
1448
+ }
1449
+
1450
+ // Recover a new VersionSet, only the non-closed WAL should show up.
1451
+ {
1452
+ std::unique_ptr<VersionSet> new_versions(
1453
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1454
+ &write_buffer_manager_, &write_controller_,
1455
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1456
+ ASSERT_OK(new_versions->Recover(column_families_, false));
1457
+ const auto& wals = new_versions->GetWalSet().GetWals();
1458
+ ASSERT_EQ(wals.size(), 1);
1459
+ ASSERT_TRUE(wals.find(kNonClosedLogNumber) != wals.end());
1460
+ ASSERT_FALSE(wals.at(kNonClosedLogNumber).HasSyncedSize());
1461
+ }
1462
+
1463
+ // Force the creation of a new MANIFEST file,
1464
+ // only the non-closed WAL should be written to the new MANIFEST.
1465
+ {
1466
+ std::vector<WalAddition> wal_additions;
1467
+ SyncPoint::GetInstance()->SetCallBack(
1468
+ "VersionSet::WriteCurrentStateToManifest:SaveWal", [&](void* arg) {
1469
+ VersionEdit* edit = reinterpret_cast<VersionEdit*>(arg);
1470
+ ASSERT_TRUE(edit->IsWalAddition());
1471
+ for (auto& addition : edit->GetWalAdditions()) {
1472
+ wal_additions.push_back(addition);
1473
+ }
1474
+ });
1475
+ SyncPoint::GetInstance()->EnableProcessing();
1476
+
1477
+ CreateNewManifest();
1478
+
1479
+ SyncPoint::GetInstance()->DisableProcessing();
1480
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1481
+
1482
+ ASSERT_EQ(wal_additions.size(), 1);
1483
+ ASSERT_EQ(wal_additions[0].GetLogNumber(), kNonClosedLogNumber);
1484
+ ASSERT_FALSE(wal_additions[0].GetMetadata().HasSyncedSize());
1485
+ }
1486
+
1487
+ // Recover from the new MANIFEST, only the non-closed WAL should show up.
1488
+ {
1489
+ std::unique_ptr<VersionSet> new_versions(
1490
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1491
+ &write_buffer_manager_, &write_controller_,
1492
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1493
+ ASSERT_OK(new_versions->Recover(column_families_, false));
1494
+ const auto& wals = new_versions->GetWalSet().GetWals();
1495
+ ASSERT_EQ(wals.size(), 1);
1496
+ ASSERT_TRUE(wals.find(kNonClosedLogNumber) != wals.end());
1497
+ ASSERT_FALSE(wals.at(kNonClosedLogNumber).HasSyncedSize());
1498
+ }
1499
+ }
1500
+
1501
+ TEST_F(VersionSetTest, WalCreateTwice) {
1502
+ NewDB();
1503
+
1504
+ constexpr WalNumber kLogNumber = 10;
1505
+
1506
+ VersionEdit edit;
1507
+ edit.AddWal(kLogNumber);
1508
+
1509
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1510
+
1511
+ Status s = LogAndApplyToDefaultCF(edit);
1512
+ ASSERT_TRUE(s.IsCorruption());
1513
+ ASSERT_TRUE(s.ToString().find("WAL 10 is created more than once") !=
1514
+ std::string::npos)
1515
+ << s.ToString();
1516
+ }
1517
+
1518
+ TEST_F(VersionSetTest, WalCreateAfterClose) {
1519
+ NewDB();
1520
+
1521
+ constexpr WalNumber kLogNumber = 10;
1522
+ constexpr uint64_t kSizeInBytes = 111;
1523
+
1524
+ {
1525
+ // Add a closed WAL.
1526
+ VersionEdit edit;
1527
+ edit.AddWal(kLogNumber);
1528
+ WalMetadata wal(kSizeInBytes);
1529
+ edit.AddWal(kLogNumber, wal);
1530
+
1531
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1532
+ }
1533
+
1534
+ {
1535
+ // Create the same WAL again.
1536
+ VersionEdit edit;
1537
+ edit.AddWal(kLogNumber);
1538
+
1539
+ Status s = LogAndApplyToDefaultCF(edit);
1540
+ ASSERT_TRUE(s.IsCorruption());
1541
+ ASSERT_TRUE(s.ToString().find("WAL 10 is created more than once") !=
1542
+ std::string::npos)
1543
+ << s.ToString();
1544
+ }
1545
+ }
1546
+
1547
+ TEST_F(VersionSetTest, AddWalWithSmallerSize) {
1548
+ NewDB();
1549
+
1550
+ constexpr WalNumber kLogNumber = 10;
1551
+ constexpr uint64_t kSizeInBytes = 111;
1552
+
1553
+ {
1554
+ // Add a closed WAL.
1555
+ VersionEdit edit;
1556
+ WalMetadata wal(kSizeInBytes);
1557
+ edit.AddWal(kLogNumber, wal);
1558
+
1559
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1560
+ }
1561
+
1562
+ {
1563
+ // Add the same WAL with smaller synced size.
1564
+ VersionEdit edit;
1565
+ WalMetadata wal(kSizeInBytes / 2);
1566
+ edit.AddWal(kLogNumber, wal);
1567
+
1568
+ Status s = LogAndApplyToDefaultCF(edit);
1569
+ ASSERT_TRUE(s.IsCorruption());
1570
+ ASSERT_TRUE(
1571
+ s.ToString().find(
1572
+ "WAL 10 must not have smaller synced size than previous one") !=
1573
+ std::string::npos)
1574
+ << s.ToString();
1575
+ }
1576
+ }
1577
+
1578
+ TEST_F(VersionSetTest, DeleteWalsBeforeNonExistingWalNumber) {
1579
+ NewDB();
1580
+
1581
+ constexpr WalNumber kLogNumber0 = 10;
1582
+ constexpr WalNumber kLogNumber1 = 20;
1583
+ constexpr WalNumber kNonExistingNumber = 15;
1584
+ constexpr uint64_t kSizeInBytes = 111;
1585
+
1586
+ {
1587
+ // Add closed WALs.
1588
+ VersionEdit edit;
1589
+ WalMetadata wal(kSizeInBytes);
1590
+ edit.AddWal(kLogNumber0, wal);
1591
+ edit.AddWal(kLogNumber1, wal);
1592
+
1593
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1594
+ }
1595
+
1596
+ {
1597
+ // Delete WALs before a non-existing WAL.
1598
+ VersionEdit edit;
1599
+ edit.DeleteWalsBefore(kNonExistingNumber);
1600
+
1601
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1602
+ }
1603
+
1604
+ // Recover a new VersionSet, WAL0 is deleted, WAL1 is not.
1605
+ {
1606
+ std::unique_ptr<VersionSet> new_versions(
1607
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1608
+ &write_buffer_manager_, &write_controller_,
1609
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1610
+ ASSERT_OK(new_versions->Recover(column_families_, false));
1611
+ const auto& wals = new_versions->GetWalSet().GetWals();
1612
+ ASSERT_EQ(wals.size(), 1);
1613
+ ASSERT_TRUE(wals.find(kLogNumber1) != wals.end());
1614
+ }
1615
+ }
1616
+
1617
+ TEST_F(VersionSetTest, DeleteAllWals) {
1618
+ NewDB();
1619
+
1620
+ constexpr WalNumber kMaxLogNumber = 10;
1621
+ constexpr uint64_t kSizeInBytes = 111;
1622
+
1623
+ {
1624
+ // Add a closed WAL.
1625
+ VersionEdit edit;
1626
+ WalMetadata wal(kSizeInBytes);
1627
+ edit.AddWal(kMaxLogNumber, wal);
1628
+
1629
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1630
+ }
1631
+
1632
+ {
1633
+ VersionEdit edit;
1634
+ edit.DeleteWalsBefore(kMaxLogNumber + 10);
1635
+
1636
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
1637
+ }
1638
+
1639
+ // Recover a new VersionSet, all WALs are deleted.
1640
+ {
1641
+ std::unique_ptr<VersionSet> new_versions(
1642
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1643
+ &write_buffer_manager_, &write_controller_,
1644
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1645
+ ASSERT_OK(new_versions->Recover(column_families_, false));
1646
+ const auto& wals = new_versions->GetWalSet().GetWals();
1647
+ ASSERT_EQ(wals.size(), 0);
1648
+ }
1649
+ }
1650
+
1651
+ TEST_F(VersionSetTest, AtomicGroupWithWalEdits) {
1652
+ NewDB();
1653
+
1654
+ constexpr int kAtomicGroupSize = 7;
1655
+ constexpr uint64_t kNumWals = 5;
1656
+ const std::string kDBId = "db_db";
1657
+
1658
+ int remaining = kAtomicGroupSize;
1659
+ autovector<std::unique_ptr<VersionEdit>> edits;
1660
+ // Add 5 WALs.
1661
+ for (uint64_t i = 1; i <= kNumWals; i++) {
1662
+ edits.emplace_back(new VersionEdit);
1663
+ // WAL's size equals its log number.
1664
+ edits.back()->AddWal(i, WalMetadata(i));
1665
+ edits.back()->MarkAtomicGroup(--remaining);
1666
+ }
1667
+ // One edit with the min log number set.
1668
+ edits.emplace_back(new VersionEdit);
1669
+ edits.back()->SetDBId(kDBId);
1670
+ edits.back()->MarkAtomicGroup(--remaining);
1671
+ // Delete the first added 4 WALs.
1672
+ edits.emplace_back(new VersionEdit);
1673
+ edits.back()->DeleteWalsBefore(kNumWals);
1674
+ edits.back()->MarkAtomicGroup(--remaining);
1675
+ ASSERT_EQ(remaining, 0);
1676
+
1677
+ ASSERT_OK(LogAndApplyToDefaultCF(edits));
1678
+
1679
+ // Recover a new VersionSet, the min log number and the last WAL should be
1680
+ // kept.
1681
+ {
1682
+ std::unique_ptr<VersionSet> new_versions(
1683
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1684
+ &write_buffer_manager_, &write_controller_,
1685
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1686
+ std::string db_id;
1687
+ ASSERT_OK(
1688
+ new_versions->Recover(column_families_, /*read_only=*/false, &db_id));
1689
+
1690
+ ASSERT_EQ(db_id, kDBId);
1691
+
1692
+ const auto& wals = new_versions->GetWalSet().GetWals();
1693
+ ASSERT_EQ(wals.size(), 1);
1694
+ ASSERT_TRUE(wals.find(kNumWals) != wals.end());
1695
+ ASSERT_TRUE(wals.at(kNumWals).HasSyncedSize());
1696
+ ASSERT_EQ(wals.at(kNumWals).GetSyncedSizeInBytes(), kNumWals);
1697
+ }
1698
+ }
1699
+
1700
+ class VersionSetWithTimestampTest : public VersionSetTest {
1701
+ public:
1702
+ static const std::string kNewCfName;
1703
+
1704
+ explicit VersionSetWithTimestampTest() : VersionSetTest() {}
1705
+
1706
+ void SetUp() override {
1707
+ NewDB();
1708
+ Options options;
1709
+ options.comparator = test::ComparatorWithU64Ts();
1710
+ cfd_ = CreateColumnFamily(kNewCfName, options);
1711
+ EXPECT_NE(nullptr, cfd_);
1712
+ EXPECT_NE(nullptr, cfd_->GetLatestMutableCFOptions());
1713
+ column_families_.emplace_back(kNewCfName, options);
1714
+ }
1715
+
1716
+ void TearDown() override {
1717
+ for (auto* e : edits_) {
1718
+ delete e;
1719
+ }
1720
+ edits_.clear();
1721
+ }
1722
+
1723
+ void GenVersionEditsToSetFullHistoryTsLow(
1724
+ const std::vector<uint64_t>& ts_lbs) {
1725
+ for (const auto ts_lb : ts_lbs) {
1726
+ VersionEdit* edit = new VersionEdit;
1727
+ edit->SetColumnFamily(cfd_->GetID());
1728
+ std::string ts_str = test::EncodeInt(ts_lb);
1729
+ edit->SetFullHistoryTsLow(ts_str);
1730
+ edits_.emplace_back(edit);
1731
+ }
1732
+ }
1733
+
1734
+ void VerifyFullHistoryTsLow(uint64_t expected_ts_low) {
1735
+ std::unique_ptr<VersionSet> vset(
1736
+ new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1737
+ &write_buffer_manager_, &write_controller_,
1738
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1739
+ ASSERT_OK(vset->Recover(column_families_, /*read_only=*/false,
1740
+ /*db_id=*/nullptr));
1741
+ for (auto* cfd : *(vset->GetColumnFamilySet())) {
1742
+ ASSERT_NE(nullptr, cfd);
1743
+ if (cfd->GetName() == kNewCfName) {
1744
+ ASSERT_EQ(test::EncodeInt(expected_ts_low), cfd->GetFullHistoryTsLow());
1745
+ } else {
1746
+ ASSERT_TRUE(cfd->GetFullHistoryTsLow().empty());
1747
+ }
1748
+ }
1749
+ }
1750
+
1751
+ void DoTest(const std::vector<uint64_t>& ts_lbs) {
1752
+ if (ts_lbs.empty()) {
1753
+ return;
1754
+ }
1755
+
1756
+ GenVersionEditsToSetFullHistoryTsLow(ts_lbs);
1757
+
1758
+ Status s;
1759
+ mutex_.Lock();
1760
+ s = versions_->LogAndApply(cfd_, *(cfd_->GetLatestMutableCFOptions()),
1761
+ edits_, &mutex_);
1762
+ mutex_.Unlock();
1763
+ ASSERT_OK(s);
1764
+ VerifyFullHistoryTsLow(*std::max_element(ts_lbs.begin(), ts_lbs.end()));
1765
+ }
1766
+
1767
+ protected:
1768
+ ColumnFamilyData* cfd_{nullptr};
1769
+ // edits_ must contain and own pointers to heap-alloc VersionEdit objects.
1770
+ autovector<VersionEdit*> edits_;
1771
+ };
1772
+
1773
+ const std::string VersionSetWithTimestampTest::kNewCfName("new_cf");
1774
+
1775
+ TEST_F(VersionSetWithTimestampTest, SetFullHistoryTsLbOnce) {
1776
+ constexpr uint64_t kTsLow = 100;
1777
+ DoTest({kTsLow});
1778
+ }
1779
+
1780
+ // Simulate the application increasing full_history_ts_low.
1781
+ TEST_F(VersionSetWithTimestampTest, IncreaseFullHistoryTsLb) {
1782
+ const std::vector<uint64_t> ts_lbs = {100, 101, 102, 103};
1783
+ DoTest(ts_lbs);
1784
+ }
1785
+
1786
+ // Simulate the application trying to decrease full_history_ts_low
1787
+ // unsuccessfully. If the application calls public API sequentially to
1788
+ // decrease the lower bound ts, RocksDB will return an InvalidArgument
1789
+ // status before involving VersionSet. Only when multiple threads trying
1790
+ // to decrease the lower bound concurrently will this case ever happen. Even
1791
+ // so, the lower bound cannot be decreased. The application will be notified
1792
+ // via return value of the API.
1793
+ TEST_F(VersionSetWithTimestampTest, TryDecreaseFullHistoryTsLb) {
1794
+ const std::vector<uint64_t> ts_lbs = {103, 102, 101, 100};
1795
+ DoTest(ts_lbs);
1796
+ }
1797
+
1798
+ class VersionSetAtomicGroupTest : public VersionSetTestBase,
1799
+ public testing::Test {
1800
+ public:
1801
+ VersionSetAtomicGroupTest()
1802
+ : VersionSetTestBase("version_set_atomic_group_test") {}
1803
+
1804
+ void SetUp() override {
1805
+ PrepareManifest(&column_families_, &last_seqno_, &log_writer_);
1806
+ SetupTestSyncPoints();
1807
+ }
1808
+
1809
+ void SetupValidAtomicGroup(int atomic_group_size) {
1810
+ edits_.resize(atomic_group_size);
1811
+ int remaining = atomic_group_size;
1812
+ for (size_t i = 0; i != edits_.size(); ++i) {
1813
+ edits_[i].SetLogNumber(0);
1814
+ edits_[i].SetNextFile(2);
1815
+ edits_[i].MarkAtomicGroup(--remaining);
1816
+ edits_[i].SetLastSequence(last_seqno_++);
1817
+ }
1818
+ ASSERT_OK(SetCurrentFile(fs_.get(), dbname_, 1, nullptr));
1819
+ }
1820
+
1821
+ void SetupIncompleteTrailingAtomicGroup(int atomic_group_size) {
1822
+ edits_.resize(atomic_group_size);
1823
+ int remaining = atomic_group_size;
1824
+ for (size_t i = 0; i != edits_.size(); ++i) {
1825
+ edits_[i].SetLogNumber(0);
1826
+ edits_[i].SetNextFile(2);
1827
+ edits_[i].MarkAtomicGroup(--remaining);
1828
+ edits_[i].SetLastSequence(last_seqno_++);
1829
+ }
1830
+ ASSERT_OK(SetCurrentFile(fs_.get(), dbname_, 1, nullptr));
1831
+ }
1832
+
1833
+ void SetupCorruptedAtomicGroup(int atomic_group_size) {
1834
+ edits_.resize(atomic_group_size);
1835
+ int remaining = atomic_group_size;
1836
+ for (size_t i = 0; i != edits_.size(); ++i) {
1837
+ edits_[i].SetLogNumber(0);
1838
+ edits_[i].SetNextFile(2);
1839
+ if (i != ((size_t)atomic_group_size / 2)) {
1840
+ edits_[i].MarkAtomicGroup(--remaining);
1841
+ }
1842
+ edits_[i].SetLastSequence(last_seqno_++);
1843
+ }
1844
+ ASSERT_OK(SetCurrentFile(fs_.get(), dbname_, 1, nullptr));
1845
+ }
1846
+
1847
+ void SetupIncorrectAtomicGroup(int atomic_group_size) {
1848
+ edits_.resize(atomic_group_size);
1849
+ int remaining = atomic_group_size;
1850
+ for (size_t i = 0; i != edits_.size(); ++i) {
1851
+ edits_[i].SetLogNumber(0);
1852
+ edits_[i].SetNextFile(2);
1853
+ if (i != 1) {
1854
+ edits_[i].MarkAtomicGroup(--remaining);
1855
+ } else {
1856
+ edits_[i].MarkAtomicGroup(remaining--);
1857
+ }
1858
+ edits_[i].SetLastSequence(last_seqno_++);
1859
+ }
1860
+ ASSERT_OK(SetCurrentFile(fs_.get(), dbname_, 1, nullptr));
1861
+ }
1862
+
1863
+ void SetupTestSyncPoints() {
1864
+ SyncPoint::GetInstance()->DisableProcessing();
1865
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1866
+ SyncPoint::GetInstance()->SetCallBack(
1867
+ "AtomicGroupReadBuffer::AddEdit:FirstInAtomicGroup", [&](void* arg) {
1868
+ VersionEdit* e = reinterpret_cast<VersionEdit*>(arg);
1869
+ EXPECT_EQ(edits_.front().DebugString(),
1870
+ e->DebugString()); // compare based on value
1871
+ first_in_atomic_group_ = true;
1872
+ });
1873
+ SyncPoint::GetInstance()->SetCallBack(
1874
+ "AtomicGroupReadBuffer::AddEdit:LastInAtomicGroup", [&](void* arg) {
1875
+ VersionEdit* e = reinterpret_cast<VersionEdit*>(arg);
1876
+ EXPECT_EQ(edits_.back().DebugString(),
1877
+ e->DebugString()); // compare based on value
1878
+ EXPECT_TRUE(first_in_atomic_group_);
1879
+ last_in_atomic_group_ = true;
1880
+ });
1881
+ SyncPoint::GetInstance()->SetCallBack(
1882
+ "VersionEditHandlerBase::Iterate:Finish", [&](void* arg) {
1883
+ num_recovered_edits_ = *reinterpret_cast<int*>(arg);
1884
+ });
1885
+ SyncPoint::GetInstance()->SetCallBack(
1886
+ "VersionSet::ReadAndRecover:RecoveredEdits", [&](void* arg) {
1887
+ num_recovered_edits_ = *reinterpret_cast<int*>(arg);
1888
+ });
1889
+ SyncPoint::GetInstance()->SetCallBack(
1890
+ "ReactiveVersionSet::ReadAndApply:AppliedEdits",
1891
+ [&](void* arg) { num_applied_edits_ = *reinterpret_cast<int*>(arg); });
1892
+ SyncPoint::GetInstance()->SetCallBack(
1893
+ "AtomicGroupReadBuffer::AddEdit:AtomicGroup",
1894
+ [&](void* /* arg */) { ++num_edits_in_atomic_group_; });
1895
+ SyncPoint::GetInstance()->SetCallBack(
1896
+ "AtomicGroupReadBuffer::AddEdit:AtomicGroupMixedWithNormalEdits",
1897
+ [&](void* arg) {
1898
+ corrupted_edit_ = *reinterpret_cast<VersionEdit*>(arg);
1899
+ });
1900
+ SyncPoint::GetInstance()->SetCallBack(
1901
+ "AtomicGroupReadBuffer::AddEdit:IncorrectAtomicGroupSize",
1902
+ [&](void* arg) {
1903
+ edit_with_incorrect_group_size_ =
1904
+ *reinterpret_cast<VersionEdit*>(arg);
1905
+ });
1906
+ SyncPoint::GetInstance()->EnableProcessing();
1907
+ }
1908
+
1909
+ void AddNewEditsToLog(int num_edits) {
1910
+ for (int i = 0; i < num_edits; i++) {
1911
+ std::string record;
1912
+ edits_[i].EncodeTo(&record);
1913
+ ASSERT_OK(log_writer_->AddRecord(record));
1914
+ }
1915
+ }
1916
+
1917
+ void TearDown() override {
1918
+ SyncPoint::GetInstance()->DisableProcessing();
1919
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1920
+ log_writer_.reset();
1921
+ }
1922
+
1923
+ protected:
1924
+ std::vector<ColumnFamilyDescriptor> column_families_;
1925
+ SequenceNumber last_seqno_;
1926
+ std::vector<VersionEdit> edits_;
1927
+ bool first_in_atomic_group_ = false;
1928
+ bool last_in_atomic_group_ = false;
1929
+ int num_edits_in_atomic_group_ = 0;
1930
+ int num_recovered_edits_ = 0;
1931
+ int num_applied_edits_ = 0;
1932
+ VersionEdit corrupted_edit_;
1933
+ VersionEdit edit_with_incorrect_group_size_;
1934
+ std::unique_ptr<log::Writer> log_writer_;
1935
+ };
1936
+
1937
+ TEST_F(VersionSetAtomicGroupTest, HandleValidAtomicGroupWithVersionSetRecover) {
1938
+ const int kAtomicGroupSize = 3;
1939
+ SetupValidAtomicGroup(kAtomicGroupSize);
1940
+ AddNewEditsToLog(kAtomicGroupSize);
1941
+ EXPECT_OK(versions_->Recover(column_families_, false));
1942
+ EXPECT_EQ(column_families_.size(),
1943
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
1944
+ EXPECT_TRUE(first_in_atomic_group_);
1945
+ EXPECT_TRUE(last_in_atomic_group_);
1946
+ EXPECT_EQ(num_initial_edits_ + kAtomicGroupSize, num_recovered_edits_);
1947
+ EXPECT_EQ(0, num_applied_edits_);
1948
+ }
1949
+
1950
+ TEST_F(VersionSetAtomicGroupTest,
1951
+ HandleValidAtomicGroupWithReactiveVersionSetRecover) {
1952
+ const int kAtomicGroupSize = 3;
1953
+ SetupValidAtomicGroup(kAtomicGroupSize);
1954
+ AddNewEditsToLog(kAtomicGroupSize);
1955
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
1956
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
1957
+ std::unique_ptr<Status> manifest_reader_status;
1958
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
1959
+ &manifest_reporter,
1960
+ &manifest_reader_status));
1961
+ EXPECT_EQ(column_families_.size(),
1962
+ reactive_versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
1963
+ EXPECT_TRUE(first_in_atomic_group_);
1964
+ EXPECT_TRUE(last_in_atomic_group_);
1965
+ // The recover should clean up the replay buffer.
1966
+ EXPECT_TRUE(reactive_versions_->TEST_read_edits_in_atomic_group() == 0);
1967
+ EXPECT_TRUE(reactive_versions_->replay_buffer().size() == 0);
1968
+ EXPECT_EQ(num_initial_edits_ + kAtomicGroupSize, num_recovered_edits_);
1969
+ EXPECT_EQ(0, num_applied_edits_);
1970
+ }
1971
+
1972
+ TEST_F(VersionSetAtomicGroupTest,
1973
+ HandleValidAtomicGroupWithReactiveVersionSetReadAndApply) {
1974
+ const int kAtomicGroupSize = 3;
1975
+ SetupValidAtomicGroup(kAtomicGroupSize);
1976
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
1977
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
1978
+ std::unique_ptr<Status> manifest_reader_status;
1979
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
1980
+ &manifest_reporter,
1981
+ &manifest_reader_status));
1982
+ AddNewEditsToLog(kAtomicGroupSize);
1983
+ InstrumentedMutex mu;
1984
+ std::unordered_set<ColumnFamilyData*> cfds_changed;
1985
+ mu.Lock();
1986
+ EXPECT_OK(
1987
+ reactive_versions_->ReadAndApply(&mu, &manifest_reader, &cfds_changed));
1988
+ mu.Unlock();
1989
+ EXPECT_TRUE(first_in_atomic_group_);
1990
+ EXPECT_TRUE(last_in_atomic_group_);
1991
+ // The recover should clean up the replay buffer.
1992
+ EXPECT_TRUE(reactive_versions_->TEST_read_edits_in_atomic_group() == 0);
1993
+ EXPECT_TRUE(reactive_versions_->replay_buffer().size() == 0);
1994
+ EXPECT_EQ(num_initial_edits_, num_recovered_edits_);
1995
+ EXPECT_EQ(kAtomicGroupSize, num_applied_edits_);
1996
+ }
1997
+
1998
+ TEST_F(VersionSetAtomicGroupTest,
1999
+ HandleIncompleteTrailingAtomicGroupWithVersionSetRecover) {
2000
+ const int kAtomicGroupSize = 4;
2001
+ const int kNumberOfPersistedVersionEdits = kAtomicGroupSize - 1;
2002
+ SetupIncompleteTrailingAtomicGroup(kAtomicGroupSize);
2003
+ AddNewEditsToLog(kNumberOfPersistedVersionEdits);
2004
+ EXPECT_OK(versions_->Recover(column_families_, false));
2005
+ EXPECT_EQ(column_families_.size(),
2006
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2007
+ EXPECT_TRUE(first_in_atomic_group_);
2008
+ EXPECT_FALSE(last_in_atomic_group_);
2009
+ EXPECT_EQ(kNumberOfPersistedVersionEdits, num_edits_in_atomic_group_);
2010
+ EXPECT_EQ(num_initial_edits_, num_recovered_edits_);
2011
+ EXPECT_EQ(0, num_applied_edits_);
2012
+ }
2013
+
2014
+ TEST_F(VersionSetAtomicGroupTest,
2015
+ HandleIncompleteTrailingAtomicGroupWithReactiveVersionSetRecover) {
2016
+ const int kAtomicGroupSize = 4;
2017
+ const int kNumberOfPersistedVersionEdits = kAtomicGroupSize - 1;
2018
+ SetupIncompleteTrailingAtomicGroup(kAtomicGroupSize);
2019
+ AddNewEditsToLog(kNumberOfPersistedVersionEdits);
2020
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2021
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2022
+ std::unique_ptr<Status> manifest_reader_status;
2023
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
2024
+ &manifest_reporter,
2025
+ &manifest_reader_status));
2026
+ EXPECT_EQ(column_families_.size(),
2027
+ reactive_versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2028
+ EXPECT_TRUE(first_in_atomic_group_);
2029
+ EXPECT_FALSE(last_in_atomic_group_);
2030
+ EXPECT_EQ(kNumberOfPersistedVersionEdits, num_edits_in_atomic_group_);
2031
+ // Reactive version set should store the edits in the replay buffer.
2032
+ EXPECT_TRUE(reactive_versions_->TEST_read_edits_in_atomic_group() ==
2033
+ kNumberOfPersistedVersionEdits);
2034
+ EXPECT_TRUE(reactive_versions_->replay_buffer().size() == kAtomicGroupSize);
2035
+ // Write the last record. The reactive version set should now apply all
2036
+ // edits.
2037
+ std::string last_record;
2038
+ edits_[kAtomicGroupSize - 1].EncodeTo(&last_record);
2039
+ EXPECT_OK(log_writer_->AddRecord(last_record));
2040
+ InstrumentedMutex mu;
2041
+ std::unordered_set<ColumnFamilyData*> cfds_changed;
2042
+ mu.Lock();
2043
+ EXPECT_OK(
2044
+ reactive_versions_->ReadAndApply(&mu, &manifest_reader, &cfds_changed));
2045
+ mu.Unlock();
2046
+ // Reactive version set should be empty now.
2047
+ EXPECT_TRUE(reactive_versions_->TEST_read_edits_in_atomic_group() == 0);
2048
+ EXPECT_TRUE(reactive_versions_->replay_buffer().size() == 0);
2049
+ EXPECT_EQ(num_initial_edits_, num_recovered_edits_);
2050
+ EXPECT_EQ(kAtomicGroupSize, num_applied_edits_);
2051
+ }
2052
+
2053
+ TEST_F(VersionSetAtomicGroupTest,
2054
+ HandleIncompleteTrailingAtomicGroupWithReactiveVersionSetReadAndApply) {
2055
+ const int kAtomicGroupSize = 4;
2056
+ const int kNumberOfPersistedVersionEdits = kAtomicGroupSize - 1;
2057
+ SetupIncompleteTrailingAtomicGroup(kAtomicGroupSize);
2058
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2059
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2060
+ std::unique_ptr<Status> manifest_reader_status;
2061
+ // No edits in an atomic group.
2062
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
2063
+ &manifest_reporter,
2064
+ &manifest_reader_status));
2065
+ EXPECT_EQ(column_families_.size(),
2066
+ reactive_versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2067
+ // Write a few edits in an atomic group.
2068
+ AddNewEditsToLog(kNumberOfPersistedVersionEdits);
2069
+ InstrumentedMutex mu;
2070
+ std::unordered_set<ColumnFamilyData*> cfds_changed;
2071
+ mu.Lock();
2072
+ EXPECT_OK(
2073
+ reactive_versions_->ReadAndApply(&mu, &manifest_reader, &cfds_changed));
2074
+ mu.Unlock();
2075
+ EXPECT_TRUE(first_in_atomic_group_);
2076
+ EXPECT_FALSE(last_in_atomic_group_);
2077
+ EXPECT_EQ(kNumberOfPersistedVersionEdits, num_edits_in_atomic_group_);
2078
+ // Reactive version set should store the edits in the replay buffer.
2079
+ EXPECT_TRUE(reactive_versions_->TEST_read_edits_in_atomic_group() ==
2080
+ kNumberOfPersistedVersionEdits);
2081
+ EXPECT_TRUE(reactive_versions_->replay_buffer().size() == kAtomicGroupSize);
2082
+ EXPECT_EQ(num_initial_edits_, num_recovered_edits_);
2083
+ EXPECT_EQ(0, num_applied_edits_);
2084
+ }
2085
+
2086
+ TEST_F(VersionSetAtomicGroupTest,
2087
+ HandleCorruptedAtomicGroupWithVersionSetRecover) {
2088
+ const int kAtomicGroupSize = 4;
2089
+ SetupCorruptedAtomicGroup(kAtomicGroupSize);
2090
+ AddNewEditsToLog(kAtomicGroupSize);
2091
+ EXPECT_NOK(versions_->Recover(column_families_, false));
2092
+ EXPECT_EQ(column_families_.size(),
2093
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2094
+ EXPECT_EQ(edits_[kAtomicGroupSize / 2].DebugString(),
2095
+ corrupted_edit_.DebugString());
2096
+ }
2097
+
2098
+ TEST_F(VersionSetAtomicGroupTest,
2099
+ HandleCorruptedAtomicGroupWithReactiveVersionSetRecover) {
2100
+ const int kAtomicGroupSize = 4;
2101
+ SetupCorruptedAtomicGroup(kAtomicGroupSize);
2102
+ AddNewEditsToLog(kAtomicGroupSize);
2103
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2104
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2105
+ std::unique_ptr<Status> manifest_reader_status;
2106
+ EXPECT_NOK(reactive_versions_->Recover(column_families_, &manifest_reader,
2107
+ &manifest_reporter,
2108
+ &manifest_reader_status));
2109
+ EXPECT_EQ(column_families_.size(),
2110
+ reactive_versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2111
+ EXPECT_EQ(edits_[kAtomicGroupSize / 2].DebugString(),
2112
+ corrupted_edit_.DebugString());
2113
+ }
2114
+
2115
+ TEST_F(VersionSetAtomicGroupTest,
2116
+ HandleCorruptedAtomicGroupWithReactiveVersionSetReadAndApply) {
2117
+ const int kAtomicGroupSize = 4;
2118
+ SetupCorruptedAtomicGroup(kAtomicGroupSize);
2119
+ InstrumentedMutex mu;
2120
+ std::unordered_set<ColumnFamilyData*> cfds_changed;
2121
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2122
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2123
+ std::unique_ptr<Status> manifest_reader_status;
2124
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
2125
+ &manifest_reporter,
2126
+ &manifest_reader_status));
2127
+ // Write the corrupted edits.
2128
+ AddNewEditsToLog(kAtomicGroupSize);
2129
+ mu.Lock();
2130
+ EXPECT_NOK(
2131
+ reactive_versions_->ReadAndApply(&mu, &manifest_reader, &cfds_changed));
2132
+ mu.Unlock();
2133
+ EXPECT_EQ(edits_[kAtomicGroupSize / 2].DebugString(),
2134
+ corrupted_edit_.DebugString());
2135
+ }
2136
+
2137
+ TEST_F(VersionSetAtomicGroupTest,
2138
+ HandleIncorrectAtomicGroupSizeWithVersionSetRecover) {
2139
+ const int kAtomicGroupSize = 4;
2140
+ SetupIncorrectAtomicGroup(kAtomicGroupSize);
2141
+ AddNewEditsToLog(kAtomicGroupSize);
2142
+ EXPECT_NOK(versions_->Recover(column_families_, false));
2143
+ EXPECT_EQ(column_families_.size(),
2144
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2145
+ EXPECT_EQ(edits_[1].DebugString(),
2146
+ edit_with_incorrect_group_size_.DebugString());
2147
+ }
2148
+
2149
+ TEST_F(VersionSetAtomicGroupTest,
2150
+ HandleIncorrectAtomicGroupSizeWithReactiveVersionSetRecover) {
2151
+ const int kAtomicGroupSize = 4;
2152
+ SetupIncorrectAtomicGroup(kAtomicGroupSize);
2153
+ AddNewEditsToLog(kAtomicGroupSize);
2154
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2155
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2156
+ std::unique_ptr<Status> manifest_reader_status;
2157
+ EXPECT_NOK(reactive_versions_->Recover(column_families_, &manifest_reader,
2158
+ &manifest_reporter,
2159
+ &manifest_reader_status));
2160
+ EXPECT_EQ(column_families_.size(),
2161
+ reactive_versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2162
+ EXPECT_EQ(edits_[1].DebugString(),
2163
+ edit_with_incorrect_group_size_.DebugString());
2164
+ }
2165
+
2166
+ TEST_F(VersionSetAtomicGroupTest,
2167
+ HandleIncorrectAtomicGroupSizeWithReactiveVersionSetReadAndApply) {
2168
+ const int kAtomicGroupSize = 4;
2169
+ SetupIncorrectAtomicGroup(kAtomicGroupSize);
2170
+ InstrumentedMutex mu;
2171
+ std::unordered_set<ColumnFamilyData*> cfds_changed;
2172
+ std::unique_ptr<log::FragmentBufferedReader> manifest_reader;
2173
+ std::unique_ptr<log::Reader::Reporter> manifest_reporter;
2174
+ std::unique_ptr<Status> manifest_reader_status;
2175
+ EXPECT_OK(reactive_versions_->Recover(column_families_, &manifest_reader,
2176
+ &manifest_reporter,
2177
+ &manifest_reader_status));
2178
+ AddNewEditsToLog(kAtomicGroupSize);
2179
+ mu.Lock();
2180
+ EXPECT_NOK(
2181
+ reactive_versions_->ReadAndApply(&mu, &manifest_reader, &cfds_changed));
2182
+ mu.Unlock();
2183
+ EXPECT_EQ(edits_[1].DebugString(),
2184
+ edit_with_incorrect_group_size_.DebugString());
2185
+ }
2186
+
2187
+ class VersionSetTestDropOneCF : public VersionSetTestBase,
2188
+ public testing::TestWithParam<std::string> {
2189
+ public:
2190
+ VersionSetTestDropOneCF()
2191
+ : VersionSetTestBase("version_set_test_drop_one_cf") {}
2192
+ };
2193
+
2194
+ // This test simulates the following execution sequence
2195
+ // Time thread1 bg_flush_thr
2196
+ // | Prepare version edits (e1,e2,e3) for atomic
2197
+ // | flush cf1, cf2, cf3
2198
+ // | Enqueue e to drop cfi
2199
+ // | to manifest_writers_
2200
+ // | Enqueue (e1,e2,e3) to manifest_writers_
2201
+ // |
2202
+ // | Apply e,
2203
+ // | cfi.IsDropped() is true
2204
+ // | Apply (e1,e2,e3),
2205
+ // | since cfi.IsDropped() == true, we need to
2206
+ // | drop ei and write the rest to MANIFEST.
2207
+ // V
2208
+ //
2209
+ // Repeat the test for i = 1, 2, 3 to simulate dropping the first, middle and
2210
+ // last column family in an atomic group.
2211
+ TEST_P(VersionSetTestDropOneCF, HandleDroppedColumnFamilyInAtomicGroup) {
2212
+ std::vector<ColumnFamilyDescriptor> column_families;
2213
+ SequenceNumber last_seqno;
2214
+ std::unique_ptr<log::Writer> log_writer;
2215
+ PrepareManifest(&column_families, &last_seqno, &log_writer);
2216
+ Status s = SetCurrentFile(fs_.get(), dbname_, 1, nullptr);
2217
+ ASSERT_OK(s);
2218
+
2219
+ EXPECT_OK(versions_->Recover(column_families, false /* read_only */));
2220
+ EXPECT_EQ(column_families.size(),
2221
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies());
2222
+
2223
+ const int kAtomicGroupSize = 3;
2224
+ const std::vector<std::string> non_default_cf_names = {
2225
+ kColumnFamilyName1, kColumnFamilyName2, kColumnFamilyName3};
2226
+
2227
+ // Drop one column family
2228
+ VersionEdit drop_cf_edit;
2229
+ drop_cf_edit.DropColumnFamily();
2230
+ const std::string cf_to_drop_name(GetParam());
2231
+ auto cfd_to_drop =
2232
+ versions_->GetColumnFamilySet()->GetColumnFamily(cf_to_drop_name);
2233
+ ASSERT_NE(nullptr, cfd_to_drop);
2234
+ // Increase its refcount because cfd_to_drop is used later, and we need to
2235
+ // prevent it from being deleted.
2236
+ cfd_to_drop->Ref();
2237
+ drop_cf_edit.SetColumnFamily(cfd_to_drop->GetID());
2238
+ mutex_.Lock();
2239
+ s = versions_->LogAndApply(cfd_to_drop,
2240
+ *cfd_to_drop->GetLatestMutableCFOptions(),
2241
+ &drop_cf_edit, &mutex_);
2242
+ mutex_.Unlock();
2243
+ ASSERT_OK(s);
2244
+
2245
+ std::vector<VersionEdit> edits(kAtomicGroupSize);
2246
+ uint32_t remaining = kAtomicGroupSize;
2247
+ size_t i = 0;
2248
+ autovector<ColumnFamilyData*> cfds;
2249
+ autovector<const MutableCFOptions*> mutable_cf_options_list;
2250
+ autovector<autovector<VersionEdit*>> edit_lists;
2251
+ for (const auto& cf_name : non_default_cf_names) {
2252
+ auto cfd = (cf_name != cf_to_drop_name)
2253
+ ? versions_->GetColumnFamilySet()->GetColumnFamily(cf_name)
2254
+ : cfd_to_drop;
2255
+ ASSERT_NE(nullptr, cfd);
2256
+ cfds.push_back(cfd);
2257
+ mutable_cf_options_list.emplace_back(cfd->GetLatestMutableCFOptions());
2258
+ edits[i].SetColumnFamily(cfd->GetID());
2259
+ edits[i].SetLogNumber(0);
2260
+ edits[i].SetNextFile(2);
2261
+ edits[i].MarkAtomicGroup(--remaining);
2262
+ edits[i].SetLastSequence(last_seqno++);
2263
+ autovector<VersionEdit*> tmp_edits;
2264
+ tmp_edits.push_back(&edits[i]);
2265
+ edit_lists.emplace_back(tmp_edits);
2266
+ ++i;
2267
+ }
2268
+ int called = 0;
2269
+ SyncPoint::GetInstance()->DisableProcessing();
2270
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2271
+ SyncPoint::GetInstance()->SetCallBack(
2272
+ "VersionSet::ProcessManifestWrites:CheckOneAtomicGroup", [&](void* arg) {
2273
+ std::vector<VersionEdit*>* tmp_edits =
2274
+ reinterpret_cast<std::vector<VersionEdit*>*>(arg);
2275
+ EXPECT_EQ(kAtomicGroupSize - 1, tmp_edits->size());
2276
+ for (const auto e : *tmp_edits) {
2277
+ bool found = false;
2278
+ for (const auto& e2 : edits) {
2279
+ if (&e2 == e) {
2280
+ found = true;
2281
+ break;
2282
+ }
2283
+ }
2284
+ ASSERT_TRUE(found);
2285
+ }
2286
+ ++called;
2287
+ });
2288
+ SyncPoint::GetInstance()->EnableProcessing();
2289
+ mutex_.Lock();
2290
+ s = versions_->LogAndApply(cfds, mutable_cf_options_list, edit_lists,
2291
+ &mutex_);
2292
+ mutex_.Unlock();
2293
+ ASSERT_OK(s);
2294
+ ASSERT_EQ(1, called);
2295
+ cfd_to_drop->UnrefAndTryDelete();
2296
+ }
2297
+
2298
+ INSTANTIATE_TEST_CASE_P(
2299
+ AtomicGroup, VersionSetTestDropOneCF,
2300
+ testing::Values(VersionSetTestBase::kColumnFamilyName1,
2301
+ VersionSetTestBase::kColumnFamilyName2,
2302
+ VersionSetTestBase::kColumnFamilyName3));
2303
+
2304
+ class EmptyDefaultCfNewManifest : public VersionSetTestBase,
2305
+ public testing::Test {
2306
+ public:
2307
+ EmptyDefaultCfNewManifest() : VersionSetTestBase("version_set_new_db_test") {}
2308
+ // Emulate DBImpl::NewDB()
2309
+ void PrepareManifest(std::vector<ColumnFamilyDescriptor>* /*column_families*/,
2310
+ SequenceNumber* /*last_seqno*/,
2311
+ std::unique_ptr<log::Writer>* log_writer) override {
2312
+ assert(log_writer != nullptr);
2313
+ VersionEdit new_db;
2314
+ new_db.SetLogNumber(0);
2315
+ std::unique_ptr<WritableFile> file;
2316
+ const std::string manifest_path = DescriptorFileName(dbname_, 1);
2317
+ Status s = env_->NewWritableFile(
2318
+ manifest_path, &file, env_->OptimizeForManifestWrite(env_options_));
2319
+ ASSERT_OK(s);
2320
+ std::unique_ptr<WritableFileWriter> file_writer(
2321
+ new WritableFileWriter(NewLegacyWritableFileWrapper(std::move(file)),
2322
+ manifest_path, env_options_));
2323
+ log_writer->reset(new log::Writer(std::move(file_writer), 0, true));
2324
+ std::string record;
2325
+ ASSERT_TRUE(new_db.EncodeTo(&record));
2326
+ s = (*log_writer)->AddRecord(record);
2327
+ ASSERT_OK(s);
2328
+ // Create new column family
2329
+ VersionEdit new_cf;
2330
+ new_cf.AddColumnFamily(VersionSetTestBase::kColumnFamilyName1);
2331
+ new_cf.SetColumnFamily(1);
2332
+ new_cf.SetLastSequence(2);
2333
+ new_cf.SetNextFile(2);
2334
+ record.clear();
2335
+ ASSERT_TRUE(new_cf.EncodeTo(&record));
2336
+ s = (*log_writer)->AddRecord(record);
2337
+ ASSERT_OK(s);
2338
+ }
2339
+
2340
+ protected:
2341
+ bool write_dbid_to_manifest_ = false;
2342
+ std::unique_ptr<log::Writer> log_writer_;
2343
+ };
2344
+
2345
+ // Create db, create column family. Cf creation will switch to a new MANIFEST.
2346
+ // Then reopen db, trying to recover.
2347
+ TEST_F(EmptyDefaultCfNewManifest, Recover) {
2348
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2349
+ log_writer_.reset();
2350
+ Status s =
2351
+ SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2352
+ ASSERT_OK(s);
2353
+ std::string manifest_path;
2354
+ VerifyManifest(&manifest_path);
2355
+ std::vector<ColumnFamilyDescriptor> column_families;
2356
+ column_families.emplace_back(kDefaultColumnFamilyName, cf_options_);
2357
+ column_families.emplace_back(VersionSetTestBase::kColumnFamilyName1,
2358
+ cf_options_);
2359
+ std::string db_id;
2360
+ bool has_missing_table_file = false;
2361
+ s = versions_->TryRecoverFromOneManifest(
2362
+ manifest_path, column_families, false, &db_id, &has_missing_table_file);
2363
+ ASSERT_OK(s);
2364
+ ASSERT_FALSE(has_missing_table_file);
2365
+ }
2366
+
2367
+ class VersionSetTestEmptyDb
2368
+ : public VersionSetTestBase,
2369
+ public testing::TestWithParam<
2370
+ std::tuple<bool, bool, std::vector<std::string>>> {
2371
+ public:
2372
+ static const std::string kUnknownColumnFamilyName;
2373
+ VersionSetTestEmptyDb() : VersionSetTestBase("version_set_test_empty_db") {}
2374
+
2375
+ protected:
2376
+ void PrepareManifest(std::vector<ColumnFamilyDescriptor>* /*column_families*/,
2377
+ SequenceNumber* /*last_seqno*/,
2378
+ std::unique_ptr<log::Writer>* log_writer) override {
2379
+ assert(nullptr != log_writer);
2380
+ VersionEdit new_db;
2381
+ if (db_options_.write_dbid_to_manifest) {
2382
+ DBOptions tmp_db_options;
2383
+ tmp_db_options.env = env_;
2384
+ std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
2385
+ std::string db_id;
2386
+ impl->GetDbIdentityFromIdentityFile(&db_id);
2387
+ new_db.SetDBId(db_id);
2388
+ }
2389
+ const std::string manifest_path = DescriptorFileName(dbname_, 1);
2390
+ std::unique_ptr<WritableFile> file;
2391
+ Status s = env_->NewWritableFile(
2392
+ manifest_path, &file, env_->OptimizeForManifestWrite(env_options_));
2393
+ ASSERT_OK(s);
2394
+ std::unique_ptr<WritableFileWriter> file_writer(
2395
+ new WritableFileWriter(NewLegacyWritableFileWrapper(std::move(file)),
2396
+ manifest_path, env_options_));
2397
+ {
2398
+ log_writer->reset(new log::Writer(std::move(file_writer), 0, false));
2399
+ std::string record;
2400
+ new_db.EncodeTo(&record);
2401
+ s = (*log_writer)->AddRecord(record);
2402
+ ASSERT_OK(s);
2403
+ }
2404
+ }
2405
+
2406
+ std::unique_ptr<log::Writer> log_writer_;
2407
+ };
2408
+
2409
+ const std::string VersionSetTestEmptyDb::kUnknownColumnFamilyName = "unknown";
2410
+
2411
+ TEST_P(VersionSetTestEmptyDb, OpenFromIncompleteManifest0) {
2412
+ db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
2413
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2414
+ log_writer_.reset();
2415
+ Status s =
2416
+ SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2417
+ ASSERT_OK(s);
2418
+
2419
+ std::string manifest_path;
2420
+ VerifyManifest(&manifest_path);
2421
+
2422
+ bool read_only = std::get<1>(GetParam());
2423
+ const std::vector<std::string> cf_names = std::get<2>(GetParam());
2424
+
2425
+ std::vector<ColumnFamilyDescriptor> column_families;
2426
+ for (const auto& cf_name : cf_names) {
2427
+ column_families.emplace_back(cf_name, cf_options_);
2428
+ }
2429
+
2430
+ std::string db_id;
2431
+ bool has_missing_table_file = false;
2432
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
2433
+ read_only, &db_id,
2434
+ &has_missing_table_file);
2435
+ auto iter =
2436
+ std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
2437
+ if (iter == cf_names.end()) {
2438
+ ASSERT_TRUE(s.IsInvalidArgument());
2439
+ } else {
2440
+ ASSERT_TRUE(s.IsCorruption());
2441
+ }
2442
+ }
2443
+
2444
+ TEST_P(VersionSetTestEmptyDb, OpenFromIncompleteManifest1) {
2445
+ db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
2446
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2447
+ // Only a subset of column families in the MANIFEST.
2448
+ VersionEdit new_cf1;
2449
+ new_cf1.AddColumnFamily(VersionSetTestBase::kColumnFamilyName1);
2450
+ new_cf1.SetColumnFamily(1);
2451
+ Status s;
2452
+ {
2453
+ std::string record;
2454
+ new_cf1.EncodeTo(&record);
2455
+ s = log_writer_->AddRecord(record);
2456
+ ASSERT_OK(s);
2457
+ }
2458
+ log_writer_.reset();
2459
+ s = SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2460
+ ASSERT_OK(s);
2461
+
2462
+ std::string manifest_path;
2463
+ VerifyManifest(&manifest_path);
2464
+
2465
+ bool read_only = std::get<1>(GetParam());
2466
+ const std::vector<std::string>& cf_names = std::get<2>(GetParam());
2467
+ std::vector<ColumnFamilyDescriptor> column_families;
2468
+ for (const auto& cf_name : cf_names) {
2469
+ column_families.emplace_back(cf_name, cf_options_);
2470
+ }
2471
+ std::string db_id;
2472
+ bool has_missing_table_file = false;
2473
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
2474
+ read_only, &db_id,
2475
+ &has_missing_table_file);
2476
+ auto iter =
2477
+ std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
2478
+ if (iter == cf_names.end()) {
2479
+ ASSERT_TRUE(s.IsInvalidArgument());
2480
+ } else {
2481
+ ASSERT_TRUE(s.IsCorruption());
2482
+ }
2483
+ }
2484
+
2485
+ TEST_P(VersionSetTestEmptyDb, OpenFromInCompleteManifest2) {
2486
+ db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
2487
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2488
+ // Write all column families but no log_number, next_file_number and
2489
+ // last_sequence.
2490
+ const std::vector<std::string> all_cf_names = {
2491
+ kDefaultColumnFamilyName, kColumnFamilyName1, kColumnFamilyName2,
2492
+ kColumnFamilyName3};
2493
+ uint32_t cf_id = 1;
2494
+ Status s;
2495
+ for (size_t i = 1; i != all_cf_names.size(); ++i) {
2496
+ VersionEdit new_cf;
2497
+ new_cf.AddColumnFamily(all_cf_names[i]);
2498
+ new_cf.SetColumnFamily(cf_id++);
2499
+ std::string record;
2500
+ ASSERT_TRUE(new_cf.EncodeTo(&record));
2501
+ s = log_writer_->AddRecord(record);
2502
+ ASSERT_OK(s);
2503
+ }
2504
+ log_writer_.reset();
2505
+ s = SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2506
+ ASSERT_OK(s);
2507
+
2508
+ std::string manifest_path;
2509
+ VerifyManifest(&manifest_path);
2510
+
2511
+ bool read_only = std::get<1>(GetParam());
2512
+ const std::vector<std::string>& cf_names = std::get<2>(GetParam());
2513
+ std::vector<ColumnFamilyDescriptor> column_families;
2514
+ for (const auto& cf_name : cf_names) {
2515
+ column_families.emplace_back(cf_name, cf_options_);
2516
+ }
2517
+ std::string db_id;
2518
+ bool has_missing_table_file = false;
2519
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
2520
+ read_only, &db_id,
2521
+ &has_missing_table_file);
2522
+ auto iter =
2523
+ std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
2524
+ if (iter == cf_names.end()) {
2525
+ ASSERT_TRUE(s.IsInvalidArgument());
2526
+ } else {
2527
+ ASSERT_TRUE(s.IsCorruption());
2528
+ }
2529
+ }
2530
+
2531
+ TEST_P(VersionSetTestEmptyDb, OpenManifestWithUnknownCF) {
2532
+ db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
2533
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2534
+ // Write all column families but no log_number, next_file_number and
2535
+ // last_sequence.
2536
+ const std::vector<std::string> all_cf_names = {
2537
+ kDefaultColumnFamilyName, kColumnFamilyName1, kColumnFamilyName2,
2538
+ kColumnFamilyName3};
2539
+ uint32_t cf_id = 1;
2540
+ Status s;
2541
+ for (size_t i = 1; i != all_cf_names.size(); ++i) {
2542
+ VersionEdit new_cf;
2543
+ new_cf.AddColumnFamily(all_cf_names[i]);
2544
+ new_cf.SetColumnFamily(cf_id++);
2545
+ std::string record;
2546
+ ASSERT_TRUE(new_cf.EncodeTo(&record));
2547
+ s = log_writer_->AddRecord(record);
2548
+ ASSERT_OK(s);
2549
+ }
2550
+ {
2551
+ VersionEdit tmp_edit;
2552
+ tmp_edit.SetColumnFamily(4);
2553
+ tmp_edit.SetLogNumber(0);
2554
+ tmp_edit.SetNextFile(2);
2555
+ tmp_edit.SetLastSequence(0);
2556
+ std::string record;
2557
+ ASSERT_TRUE(tmp_edit.EncodeTo(&record));
2558
+ s = log_writer_->AddRecord(record);
2559
+ ASSERT_OK(s);
2560
+ }
2561
+ log_writer_.reset();
2562
+ s = SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2563
+ ASSERT_OK(s);
2564
+
2565
+ std::string manifest_path;
2566
+ VerifyManifest(&manifest_path);
2567
+
2568
+ bool read_only = std::get<1>(GetParam());
2569
+ const std::vector<std::string>& cf_names = std::get<2>(GetParam());
2570
+ std::vector<ColumnFamilyDescriptor> column_families;
2571
+ for (const auto& cf_name : cf_names) {
2572
+ column_families.emplace_back(cf_name, cf_options_);
2573
+ }
2574
+ std::string db_id;
2575
+ bool has_missing_table_file = false;
2576
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
2577
+ read_only, &db_id,
2578
+ &has_missing_table_file);
2579
+ auto iter =
2580
+ std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
2581
+ if (iter == cf_names.end()) {
2582
+ ASSERT_TRUE(s.IsInvalidArgument());
2583
+ } else {
2584
+ ASSERT_TRUE(s.IsCorruption());
2585
+ }
2586
+ }
2587
+
2588
+ TEST_P(VersionSetTestEmptyDb, OpenCompleteManifest) {
2589
+ db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
2590
+ PrepareManifest(nullptr, nullptr, &log_writer_);
2591
+ // Write all column families but no log_number, next_file_number and
2592
+ // last_sequence.
2593
+ const std::vector<std::string> all_cf_names = {
2594
+ kDefaultColumnFamilyName, kColumnFamilyName1, kColumnFamilyName2,
2595
+ kColumnFamilyName3};
2596
+ uint32_t cf_id = 1;
2597
+ Status s;
2598
+ for (size_t i = 1; i != all_cf_names.size(); ++i) {
2599
+ VersionEdit new_cf;
2600
+ new_cf.AddColumnFamily(all_cf_names[i]);
2601
+ new_cf.SetColumnFamily(cf_id++);
2602
+ std::string record;
2603
+ ASSERT_TRUE(new_cf.EncodeTo(&record));
2604
+ s = log_writer_->AddRecord(record);
2605
+ ASSERT_OK(s);
2606
+ }
2607
+ {
2608
+ VersionEdit tmp_edit;
2609
+ tmp_edit.SetLogNumber(0);
2610
+ tmp_edit.SetNextFile(2);
2611
+ tmp_edit.SetLastSequence(0);
2612
+ std::string record;
2613
+ ASSERT_TRUE(tmp_edit.EncodeTo(&record));
2614
+ s = log_writer_->AddRecord(record);
2615
+ ASSERT_OK(s);
2616
+ }
2617
+ log_writer_.reset();
2618
+ s = SetCurrentFile(fs_.get(), dbname_, 1, /*directory_to_fsync=*/nullptr);
2619
+ ASSERT_OK(s);
2620
+
2621
+ std::string manifest_path;
2622
+ VerifyManifest(&manifest_path);
2623
+
2624
+ bool read_only = std::get<1>(GetParam());
2625
+ const std::vector<std::string>& cf_names = std::get<2>(GetParam());
2626
+ std::vector<ColumnFamilyDescriptor> column_families;
2627
+ for (const auto& cf_name : cf_names) {
2628
+ column_families.emplace_back(cf_name, cf_options_);
2629
+ }
2630
+ std::string db_id;
2631
+ bool has_missing_table_file = false;
2632
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
2633
+ read_only, &db_id,
2634
+ &has_missing_table_file);
2635
+ auto iter =
2636
+ std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
2637
+ if (iter == cf_names.end()) {
2638
+ ASSERT_TRUE(s.IsInvalidArgument());
2639
+ } else if (read_only) {
2640
+ ASSERT_OK(s);
2641
+ ASSERT_FALSE(has_missing_table_file);
2642
+ } else if (cf_names.size() == all_cf_names.size()) {
2643
+ ASSERT_OK(s);
2644
+ ASSERT_FALSE(has_missing_table_file);
2645
+ } else if (cf_names.size() < all_cf_names.size()) {
2646
+ ASSERT_TRUE(s.IsInvalidArgument());
2647
+ } else {
2648
+ ASSERT_OK(s);
2649
+ ASSERT_FALSE(has_missing_table_file);
2650
+ ColumnFamilyData* cfd = versions_->GetColumnFamilySet()->GetColumnFamily(
2651
+ kUnknownColumnFamilyName);
2652
+ ASSERT_EQ(nullptr, cfd);
2653
+ }
2654
+ }
2655
+
2656
+ INSTANTIATE_TEST_CASE_P(
2657
+ BestEffortRecovery, VersionSetTestEmptyDb,
2658
+ testing::Combine(
2659
+ /*write_dbid_to_manifest=*/testing::Bool(),
2660
+ /*read_only=*/testing::Bool(),
2661
+ /*cf_names=*/
2662
+ testing::Values(
2663
+ std::vector<std::string>(),
2664
+ std::vector<std::string>({kDefaultColumnFamilyName}),
2665
+ std::vector<std::string>({VersionSetTestBase::kColumnFamilyName1,
2666
+ VersionSetTestBase::kColumnFamilyName2,
2667
+ VersionSetTestBase::kColumnFamilyName3}),
2668
+ std::vector<std::string>({kDefaultColumnFamilyName,
2669
+ VersionSetTestBase::kColumnFamilyName1}),
2670
+ std::vector<std::string>({kDefaultColumnFamilyName,
2671
+ VersionSetTestBase::kColumnFamilyName1,
2672
+ VersionSetTestBase::kColumnFamilyName2,
2673
+ VersionSetTestBase::kColumnFamilyName3}),
2674
+ std::vector<std::string>(
2675
+ {kDefaultColumnFamilyName,
2676
+ VersionSetTestBase::kColumnFamilyName1,
2677
+ VersionSetTestBase::kColumnFamilyName2,
2678
+ VersionSetTestBase::kColumnFamilyName3,
2679
+ VersionSetTestEmptyDb::kUnknownColumnFamilyName}))));
2680
+
2681
+ class VersionSetTestMissingFiles : public VersionSetTestBase,
2682
+ public testing::Test {
2683
+ public:
2684
+ VersionSetTestMissingFiles()
2685
+ : VersionSetTestBase("version_set_test_missing_files"),
2686
+ block_based_table_options_(),
2687
+ table_factory_(std::make_shared<BlockBasedTableFactory>(
2688
+ block_based_table_options_)),
2689
+ internal_comparator_(
2690
+ std::make_shared<InternalKeyComparator>(options_.comparator)) {}
2691
+
2692
+ protected:
2693
+ void PrepareManifest(std::vector<ColumnFamilyDescriptor>* column_families,
2694
+ SequenceNumber* last_seqno,
2695
+ std::unique_ptr<log::Writer>* log_writer) override {
2696
+ assert(column_families != nullptr);
2697
+ assert(last_seqno != nullptr);
2698
+ assert(log_writer != nullptr);
2699
+ const std::string manifest = DescriptorFileName(dbname_, 1);
2700
+ std::unique_ptr<WritableFile> file;
2701
+ Status s = env_->NewWritableFile(
2702
+ manifest, &file, env_->OptimizeForManifestWrite(env_options_));
2703
+ ASSERT_OK(s);
2704
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
2705
+ NewLegacyWritableFileWrapper(std::move(file)), manifest, env_options_));
2706
+ log_writer->reset(new log::Writer(std::move(file_writer), 0, false));
2707
+ VersionEdit new_db;
2708
+ if (db_options_.write_dbid_to_manifest) {
2709
+ DBOptions tmp_db_options;
2710
+ tmp_db_options.env = env_;
2711
+ std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
2712
+ std::string db_id;
2713
+ impl->GetDbIdentityFromIdentityFile(&db_id);
2714
+ new_db.SetDBId(db_id);
2715
+ }
2716
+ {
2717
+ std::string record;
2718
+ ASSERT_TRUE(new_db.EncodeTo(&record));
2719
+ s = (*log_writer)->AddRecord(record);
2720
+ ASSERT_OK(s);
2721
+ }
2722
+ const std::vector<std::string> cf_names = {
2723
+ kDefaultColumnFamilyName, kColumnFamilyName1, kColumnFamilyName2,
2724
+ kColumnFamilyName3};
2725
+ uint32_t cf_id = 1; // default cf id is 0
2726
+ cf_options_.table_factory = table_factory_;
2727
+ for (const auto& cf_name : cf_names) {
2728
+ column_families->emplace_back(cf_name, cf_options_);
2729
+ if (cf_name == kDefaultColumnFamilyName) {
2730
+ continue;
2731
+ }
2732
+ VersionEdit new_cf;
2733
+ new_cf.AddColumnFamily(cf_name);
2734
+ new_cf.SetColumnFamily(cf_id);
2735
+ std::string record;
2736
+ ASSERT_TRUE(new_cf.EncodeTo(&record));
2737
+ s = (*log_writer)->AddRecord(record);
2738
+ ASSERT_OK(s);
2739
+
2740
+ VersionEdit cf_files;
2741
+ cf_files.SetColumnFamily(cf_id);
2742
+ cf_files.SetLogNumber(0);
2743
+ record.clear();
2744
+ ASSERT_TRUE(cf_files.EncodeTo(&record));
2745
+ s = (*log_writer)->AddRecord(record);
2746
+ ASSERT_OK(s);
2747
+ ++cf_id;
2748
+ }
2749
+ SequenceNumber seq = 2;
2750
+ {
2751
+ VersionEdit edit;
2752
+ edit.SetNextFile(7);
2753
+ edit.SetLastSequence(seq);
2754
+ std::string record;
2755
+ ASSERT_TRUE(edit.EncodeTo(&record));
2756
+ s = (*log_writer)->AddRecord(record);
2757
+ ASSERT_OK(s);
2758
+ }
2759
+ *last_seqno = seq + 1;
2760
+ }
2761
+
2762
+ struct SstInfo {
2763
+ uint64_t file_number;
2764
+ std::string column_family;
2765
+ std::string key; // the only key
2766
+ int level = 0;
2767
+ SstInfo(uint64_t file_num, const std::string& cf_name,
2768
+ const std::string& _key)
2769
+ : SstInfo(file_num, cf_name, _key, 0) {}
2770
+ SstInfo(uint64_t file_num, const std::string& cf_name,
2771
+ const std::string& _key, int lvl)
2772
+ : file_number(file_num),
2773
+ column_family(cf_name),
2774
+ key(_key),
2775
+ level(lvl) {}
2776
+ };
2777
+
2778
+ // Create dummy sst, return their metadata. Note that only file name and size
2779
+ // are used.
2780
+ void CreateDummyTableFiles(const std::vector<SstInfo>& file_infos,
2781
+ std::vector<FileMetaData>* file_metas) {
2782
+ assert(file_metas != nullptr);
2783
+ for (const auto& info : file_infos) {
2784
+ uint64_t file_num = info.file_number;
2785
+ std::string fname = MakeTableFileName(dbname_, file_num);
2786
+ std::unique_ptr<FSWritableFile> file;
2787
+ Status s = fs_->NewWritableFile(fname, FileOptions(), &file, nullptr);
2788
+ ASSERT_OK(s);
2789
+ std::unique_ptr<WritableFileWriter> fwriter(
2790
+ new WritableFileWriter(std::move(file), fname, FileOptions(), env_));
2791
+ std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
2792
+ int_tbl_prop_collector_factories;
2793
+
2794
+ std::unique_ptr<TableBuilder> builder(table_factory_->NewTableBuilder(
2795
+ TableBuilderOptions(
2796
+ immutable_cf_options_, mutable_cf_options_, *internal_comparator_,
2797
+ &int_tbl_prop_collector_factories, kNoCompression,
2798
+ /*_sample_for_compression=*/0, CompressionOptions(),
2799
+ /*_skip_filters=*/false, info.column_family, info.level),
2800
+ TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
2801
+ fwriter.get()));
2802
+ InternalKey ikey(info.key, 0, ValueType::kTypeValue);
2803
+ builder->Add(ikey.Encode(), "value");
2804
+ ASSERT_OK(builder->Finish());
2805
+ fwriter->Flush();
2806
+ uint64_t file_size = 0;
2807
+ s = fs_->GetFileSize(fname, IOOptions(), &file_size, nullptr);
2808
+ ASSERT_OK(s);
2809
+ ASSERT_NE(0, file_size);
2810
+ FileMetaData meta;
2811
+ meta = FileMetaData(file_num, /*file_path_id=*/0, file_size, ikey, ikey,
2812
+ 0, 0, false, 0, 0, 0, kUnknownFileChecksum,
2813
+ kUnknownFileChecksumFuncName);
2814
+ file_metas->emplace_back(meta);
2815
+ }
2816
+ }
2817
+
2818
+ // This method updates last_sequence_.
2819
+ void WriteFileAdditionAndDeletionToManifest(
2820
+ uint32_t cf, const std::vector<std::pair<int, FileMetaData>>& added_files,
2821
+ const std::vector<std::pair<int, uint64_t>>& deleted_files) {
2822
+ VersionEdit edit;
2823
+ edit.SetColumnFamily(cf);
2824
+ for (const auto& elem : added_files) {
2825
+ int level = elem.first;
2826
+ edit.AddFile(level, elem.second);
2827
+ }
2828
+ for (const auto& elem : deleted_files) {
2829
+ int level = elem.first;
2830
+ edit.DeleteFile(level, elem.second);
2831
+ }
2832
+ edit.SetLastSequence(last_seqno_);
2833
+ ++last_seqno_;
2834
+ assert(log_writer_.get() != nullptr);
2835
+ std::string record;
2836
+ ASSERT_TRUE(edit.EncodeTo(&record));
2837
+ Status s = log_writer_->AddRecord(record);
2838
+ ASSERT_OK(s);
2839
+ }
2840
+
2841
+ BlockBasedTableOptions block_based_table_options_;
2842
+ std::shared_ptr<TableFactory> table_factory_;
2843
+ std::shared_ptr<InternalKeyComparator> internal_comparator_;
2844
+ std::vector<ColumnFamilyDescriptor> column_families_;
2845
+ SequenceNumber last_seqno_;
2846
+ std::unique_ptr<log::Writer> log_writer_;
2847
+ };
2848
+
2849
+ TEST_F(VersionSetTestMissingFiles, ManifestFarBehindSst) {
2850
+ std::vector<SstInfo> existing_files = {
2851
+ SstInfo(100, kDefaultColumnFamilyName, "a"),
2852
+ SstInfo(102, kDefaultColumnFamilyName, "b"),
2853
+ SstInfo(103, kDefaultColumnFamilyName, "c"),
2854
+ SstInfo(107, kDefaultColumnFamilyName, "d"),
2855
+ SstInfo(110, kDefaultColumnFamilyName, "e")};
2856
+ std::vector<FileMetaData> file_metas;
2857
+ CreateDummyTableFiles(existing_files, &file_metas);
2858
+
2859
+ PrepareManifest(&column_families_, &last_seqno_, &log_writer_);
2860
+ std::vector<std::pair<int, FileMetaData>> added_files;
2861
+ for (uint64_t file_num = 10; file_num < 15; ++file_num) {
2862
+ std::string smallest_ukey = "a";
2863
+ std::string largest_ukey = "b";
2864
+ InternalKey smallest_ikey(smallest_ukey, 1, ValueType::kTypeValue);
2865
+ InternalKey largest_ikey(largest_ukey, 1, ValueType::kTypeValue);
2866
+ FileMetaData meta =
2867
+ FileMetaData(file_num, /*file_path_id=*/0, /*file_size=*/12,
2868
+ smallest_ikey, largest_ikey, 0, 0, false, 0, 0, 0,
2869
+ kUnknownFileChecksum, kUnknownFileChecksumFuncName);
2870
+ added_files.emplace_back(0, meta);
2871
+ }
2872
+ WriteFileAdditionAndDeletionToManifest(
2873
+ /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>());
2874
+ std::vector<std::pair<int, uint64_t>> deleted_files;
2875
+ deleted_files.emplace_back(0, 10);
2876
+ WriteFileAdditionAndDeletionToManifest(
2877
+ /*cf=*/0, std::vector<std::pair<int, FileMetaData>>(), deleted_files);
2878
+ log_writer_.reset();
2879
+ Status s = SetCurrentFile(fs_.get(), dbname_, 1, nullptr);
2880
+ ASSERT_OK(s);
2881
+ std::string manifest_path;
2882
+ VerifyManifest(&manifest_path);
2883
+ std::string db_id;
2884
+ bool has_missing_table_file = false;
2885
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
2886
+ /*read_only=*/false, &db_id,
2887
+ &has_missing_table_file);
2888
+ ASSERT_OK(s);
2889
+ ASSERT_TRUE(has_missing_table_file);
2890
+ for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
2891
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2892
+ const std::vector<FileMetaData*>& files = vstorage->LevelFiles(0);
2893
+ ASSERT_TRUE(files.empty());
2894
+ }
2895
+ }
2896
+
2897
+ TEST_F(VersionSetTestMissingFiles, ManifestAheadofSst) {
2898
+ std::vector<SstInfo> existing_files = {
2899
+ SstInfo(100, kDefaultColumnFamilyName, "a"),
2900
+ SstInfo(102, kDefaultColumnFamilyName, "b"),
2901
+ SstInfo(103, kDefaultColumnFamilyName, "c"),
2902
+ SstInfo(107, kDefaultColumnFamilyName, "d"),
2903
+ SstInfo(110, kDefaultColumnFamilyName, "e")};
2904
+ std::vector<FileMetaData> file_metas;
2905
+ CreateDummyTableFiles(existing_files, &file_metas);
2906
+
2907
+ PrepareManifest(&column_families_, &last_seqno_, &log_writer_);
2908
+ std::vector<std::pair<int, FileMetaData>> added_files;
2909
+ for (size_t i = 3; i != 5; ++i) {
2910
+ added_files.emplace_back(0, file_metas[i]);
2911
+ }
2912
+ WriteFileAdditionAndDeletionToManifest(
2913
+ /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>());
2914
+
2915
+ added_files.clear();
2916
+ for (uint64_t file_num = 120; file_num < 130; ++file_num) {
2917
+ std::string smallest_ukey = "a";
2918
+ std::string largest_ukey = "b";
2919
+ InternalKey smallest_ikey(smallest_ukey, 1, ValueType::kTypeValue);
2920
+ InternalKey largest_ikey(largest_ukey, 1, ValueType::kTypeValue);
2921
+ FileMetaData meta =
2922
+ FileMetaData(file_num, /*file_path_id=*/0, /*file_size=*/12,
2923
+ smallest_ikey, largest_ikey, 0, 0, false, 0, 0, 0,
2924
+ kUnknownFileChecksum, kUnknownFileChecksumFuncName);
2925
+ added_files.emplace_back(0, meta);
2926
+ }
2927
+ WriteFileAdditionAndDeletionToManifest(
2928
+ /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>());
2929
+ log_writer_.reset();
2930
+ Status s = SetCurrentFile(fs_.get(), dbname_, 1, nullptr);
2931
+ ASSERT_OK(s);
2932
+ std::string manifest_path;
2933
+ VerifyManifest(&manifest_path);
2934
+ std::string db_id;
2935
+ bool has_missing_table_file = false;
2936
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
2937
+ /*read_only=*/false, &db_id,
2938
+ &has_missing_table_file);
2939
+ ASSERT_OK(s);
2940
+ ASSERT_TRUE(has_missing_table_file);
2941
+ for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
2942
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2943
+ const std::vector<FileMetaData*>& files = vstorage->LevelFiles(0);
2944
+ if (cfd->GetName() == kDefaultColumnFamilyName) {
2945
+ ASSERT_EQ(2, files.size());
2946
+ for (const auto* fmeta : files) {
2947
+ if (fmeta->fd.GetNumber() != 107 && fmeta->fd.GetNumber() != 110) {
2948
+ ASSERT_FALSE(true);
2949
+ }
2950
+ }
2951
+ } else {
2952
+ ASSERT_TRUE(files.empty());
2953
+ }
2954
+ }
2955
+ }
2956
+
2957
+ TEST_F(VersionSetTestMissingFiles, NoFileMissing) {
2958
+ std::vector<SstInfo> existing_files = {
2959
+ SstInfo(100, kDefaultColumnFamilyName, "a"),
2960
+ SstInfo(102, kDefaultColumnFamilyName, "b"),
2961
+ SstInfo(103, kDefaultColumnFamilyName, "c"),
2962
+ SstInfo(107, kDefaultColumnFamilyName, "d"),
2963
+ SstInfo(110, kDefaultColumnFamilyName, "e")};
2964
+ std::vector<FileMetaData> file_metas;
2965
+ CreateDummyTableFiles(existing_files, &file_metas);
2966
+
2967
+ PrepareManifest(&column_families_, &last_seqno_, &log_writer_);
2968
+ std::vector<std::pair<int, FileMetaData>> added_files;
2969
+ for (const auto& meta : file_metas) {
2970
+ added_files.emplace_back(0, meta);
2971
+ }
2972
+ WriteFileAdditionAndDeletionToManifest(
2973
+ /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>());
2974
+ std::vector<std::pair<int, uint64_t>> deleted_files;
2975
+ deleted_files.emplace_back(/*level=*/0, 100);
2976
+ WriteFileAdditionAndDeletionToManifest(
2977
+ /*cf=*/0, std::vector<std::pair<int, FileMetaData>>(), deleted_files);
2978
+ log_writer_.reset();
2979
+ Status s = SetCurrentFile(fs_.get(), dbname_, 1, nullptr);
2980
+ ASSERT_OK(s);
2981
+ std::string manifest_path;
2982
+ VerifyManifest(&manifest_path);
2983
+ std::string db_id;
2984
+ bool has_missing_table_file = false;
2985
+ s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
2986
+ /*read_only=*/false, &db_id,
2987
+ &has_missing_table_file);
2988
+ ASSERT_OK(s);
2989
+ ASSERT_FALSE(has_missing_table_file);
2990
+ for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
2991
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
2992
+ const std::vector<FileMetaData*>& files = vstorage->LevelFiles(0);
2993
+ if (cfd->GetName() == kDefaultColumnFamilyName) {
2994
+ ASSERT_EQ(existing_files.size() - deleted_files.size(), files.size());
2995
+ bool has_deleted_file = false;
2996
+ for (const auto* fmeta : files) {
2997
+ if (fmeta->fd.GetNumber() == 100) {
2998
+ has_deleted_file = true;
2999
+ break;
3000
+ }
3001
+ }
3002
+ ASSERT_FALSE(has_deleted_file);
3003
+ } else {
3004
+ ASSERT_TRUE(files.empty());
3005
+ }
3006
+ }
3007
+ }
3008
+
3009
+ TEST_F(VersionSetTestMissingFiles, MinLogNumberToKeep2PC) {
3010
+ NewDB();
3011
+
3012
+ SstInfo sst(100, kDefaultColumnFamilyName, "a");
3013
+ std::vector<FileMetaData> file_metas;
3014
+ CreateDummyTableFiles({sst}, &file_metas);
3015
+
3016
+ constexpr WalNumber kMinWalNumberToKeep2PC = 10;
3017
+ VersionEdit edit;
3018
+ edit.AddFile(0, file_metas[0]);
3019
+ edit.SetMinLogNumberToKeep(kMinWalNumberToKeep2PC);
3020
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
3021
+ ASSERT_EQ(versions_->min_log_number_to_keep_2pc(), kMinWalNumberToKeep2PC);
3022
+
3023
+ for (int i = 0; i < 3; i++) {
3024
+ CreateNewManifest();
3025
+ ReopenDB();
3026
+ ASSERT_EQ(versions_->min_log_number_to_keep_2pc(), kMinWalNumberToKeep2PC);
3027
+ }
3028
+ }
3029
+
3030
+ } // namespace ROCKSDB_NAMESPACE
3031
+
3032
+ int main(int argc, char** argv) {
3033
+ ::testing::InitGoogleTest(&argc, argv);
3034
+ return RUN_ALL_TESTS();
3035
+ }