@nxtedition/rocksdb 5.2.1 → 5.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1052) hide show
  1. package/binding.cc +322 -1166
  2. package/binding.gyp +1 -1
  3. package/chained-batch.js +37 -23
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  5. package/deps/rocksdb/rocksdb/COPYING +339 -0
  6. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  7. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  8. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  9. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  10. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  21. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  22. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  23. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  24. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  25. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  26. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  27. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  33. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  58. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  59. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  60. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  61. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  62. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  63. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  64. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  65. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  66. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  67. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  68. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  69. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  70. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  71. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  72. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  73. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  90. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  91. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  92. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  93. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  94. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  95. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  96. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  97. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  98. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  99. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  100. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  101. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  102. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  103. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  104. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  105. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  106. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  107. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  108. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  116. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  117. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  118. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  119. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  120. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  121. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  122. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  123. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  124. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  125. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  126. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  127. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  128. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  129. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  130. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  131. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  132. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  133. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  134. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  135. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  136. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  137. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  138. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  139. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  140. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  141. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  142. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  143. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  144. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  145. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  146. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  147. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  148. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  149. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  150. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  151. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  152. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  153. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  154. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  155. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  156. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  157. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  158. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  159. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  160. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  161. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  162. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  163. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  164. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  165. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  166. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  167. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  168. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  169. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  170. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  171. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  172. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  173. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  174. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  175. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  176. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  177. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  178. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  179. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  180. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  181. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  182. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  183. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  184. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  185. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  186. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  187. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  188. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  189. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  190. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  191. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  192. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  193. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  194. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  195. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  196. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  197. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  198. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  199. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  200. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  201. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  202. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  203. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  204. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  205. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  206. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  207. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  208. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  209. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  210. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  211. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  212. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  213. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  214. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  215. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  216. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  217. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  218. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  219. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  220. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  221. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  222. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  223. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  224. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  225. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  226. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  227. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  228. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  229. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  230. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  231. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  233. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  234. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  235. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  236. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  246. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  248. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  249. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  250. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  251. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  252. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  253. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  254. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  255. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  256. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  257. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  258. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  259. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  260. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  261. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  262. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  263. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  264. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  265. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  266. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  267. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  285. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  286. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  287. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  288. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  289. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  290. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  291. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  292. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  293. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  294. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  295. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  296. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  298. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  299. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  300. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  301. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  302. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  303. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  304. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  305. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  306. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  307. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  308. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  309. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  310. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  311. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  312. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  313. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  314. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  315. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  316. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  317. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  318. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  319. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  320. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  321. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  322. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  323. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  324. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  325. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  326. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  327. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  328. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  329. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  330. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  331. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  332. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  333. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  334. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  418. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  419. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  420. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  421. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  422. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  423. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  424. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  425. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  426. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  427. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  428. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  429. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  430. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  431. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  432. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  433. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  434. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  435. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  436. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  437. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  438. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  439. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  440. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  441. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  442. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  443. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  444. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  445. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  446. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  447. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  448. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  449. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  450. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  451. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  452. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  453. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  454. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  455. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  456. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  457. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  458. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  459. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  460. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  461. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  462. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  463. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  464. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  465. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  466. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  467. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  468. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  469. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  470. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  471. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  472. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  473. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  474. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  475. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  476. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  477. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  478. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  479. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  480. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  481. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  482. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  483. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  484. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  485. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  486. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  487. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  489. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  490. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  491. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  492. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  493. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  494. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  495. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  496. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  497. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  498. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  499. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  500. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  501. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  502. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  503. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  504. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  505. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  506. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  507. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  508. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  509. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  510. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  511. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  512. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  513. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  514. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  515. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  516. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  517. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  518. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  519. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  520. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  521. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  522. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  523. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  524. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  525. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  526. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  527. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  528. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  529. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  530. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  531. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  532. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  533. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  534. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  535. package/deps/rocksdb/rocksdb/src.mk +631 -0
  536. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  537. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  539. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  540. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  541. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  542. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  543. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  599. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  600. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  601. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  602. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  603. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  604. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  605. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  606. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  607. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  608. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  611. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  612. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  613. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  614. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  615. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  616. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  617. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  618. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  619. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  620. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  621. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  622. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  623. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  624. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  625. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  626. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  627. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  628. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  629. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  630. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  631. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  632. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  633. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  634. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  635. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  642. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  643. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  644. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  645. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  646. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  647. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  648. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  649. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  650. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  651. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  652. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  653. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  654. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  655. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  656. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  657. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  658. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  659. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  660. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  661. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  662. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  663. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  664. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  665. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  666. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  667. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  668. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  669. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  670. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  671. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  672. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  673. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  674. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  675. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  676. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  677. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  713. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  714. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  715. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  716. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  717. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  718. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  719. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  720. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  721. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  722. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  726. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  727. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  728. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  729. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  730. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  731. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  732. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  733. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  734. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  735. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  736. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  737. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  738. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  739. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  740. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  741. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  742. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  743. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  744. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  745. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  746. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  747. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  748. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  749. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  750. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  751. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  752. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  753. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  754. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  755. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  756. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  757. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  760. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  761. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  762. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  763. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  764. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  765. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  766. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  767. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  768. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  769. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  770. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  771. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  772. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  773. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  774. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  775. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  776. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  777. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  778. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  779. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  780. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  781. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  782. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  783. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  784. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  785. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  786. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  790. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  791. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  792. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  793. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  794. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  795. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  796. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  797. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  798. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  799. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  800. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  801. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  802. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  803. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  804. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  805. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  806. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  807. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  808. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  809. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  810. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  811. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  812. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  813. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  814. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  815. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  816. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  817. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  818. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  819. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  820. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  821. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  822. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  823. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  824. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  825. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  826. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  827. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  828. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  829. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  830. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  831. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  832. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  833. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  834. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  835. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  836. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  837. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  838. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  839. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  840. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  841. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  842. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  843. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  844. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  845. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  846. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  847. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  848. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  849. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  850. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  851. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  852. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  853. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  854. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  855. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  856. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  857. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  858. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  859. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  860. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  861. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  862. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  872. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  873. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  874. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  875. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  876. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  877. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  885. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  886. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  887. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  888. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  889. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  890. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  891. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  892. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  894. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  895. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  896. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  897. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  898. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  899. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  900. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  901. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  902. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  903. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  904. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  905. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  906. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  907. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  908. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  909. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  910. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  911. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  919. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  920. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  921. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  922. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  923. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  924. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  925. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  926. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  927. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  928. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  929. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  930. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  945. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  946. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  947. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  948. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  949. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  950. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  951. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  952. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  953. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  954. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  955. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  956. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  957. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  958. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  959. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  960. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1041. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1042. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1043. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1044. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1045. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1046. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1047. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1048. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1049. package/iterator.js +39 -34
  1050. package/leveldown.js +33 -84
  1051. package/package-lock.json +23687 -0
  1052. package/package.json +4 -4
@@ -0,0 +1,1780 @@
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/db_test_util.h"
11
+ #include "env/composite_env_wrapper.h"
12
+ #include "options/options_helper.h"
13
+ #include "port/port.h"
14
+ #include "port/stack_trace.h"
15
+ #include "test_util/sync_point.h"
16
+ #include "utilities/fault_injection_env.h"
17
+
18
+ namespace ROCKSDB_NAMESPACE {
19
+ class DBWALTestBase : public DBTestBase {
20
+ protected:
21
+ explicit DBWALTestBase(const std::string& dir_name)
22
+ : DBTestBase(dir_name, /*env_do_fsync=*/true) {}
23
+
24
+ #if defined(ROCKSDB_PLATFORM_POSIX)
25
+ public:
26
+ uint64_t GetAllocatedFileSize(std::string file_name) {
27
+ struct stat sbuf;
28
+ int err = stat(file_name.c_str(), &sbuf);
29
+ assert(err == 0);
30
+ return sbuf.st_blocks * 512;
31
+ }
32
+ #endif
33
+ };
34
+
35
+ class DBWALTest : public DBWALTestBase {
36
+ public:
37
+ DBWALTest() : DBWALTestBase("/db_wal_test") {}
38
+ };
39
+
40
+ // A SpecialEnv enriched to give more insight about deleted files
41
+ class EnrichedSpecialEnv : public SpecialEnv {
42
+ public:
43
+ explicit EnrichedSpecialEnv(Env* base) : SpecialEnv(base) {}
44
+ Status NewSequentialFile(const std::string& f,
45
+ std::unique_ptr<SequentialFile>* r,
46
+ const EnvOptions& soptions) override {
47
+ InstrumentedMutexLock l(&env_mutex_);
48
+ if (f == skipped_wal) {
49
+ deleted_wal_reopened = true;
50
+ if (IsWAL(f) && largest_deleted_wal.size() != 0 &&
51
+ f.compare(largest_deleted_wal) <= 0) {
52
+ gap_in_wals = true;
53
+ }
54
+ }
55
+ return SpecialEnv::NewSequentialFile(f, r, soptions);
56
+ }
57
+ Status DeleteFile(const std::string& fname) override {
58
+ if (IsWAL(fname)) {
59
+ deleted_wal_cnt++;
60
+ InstrumentedMutexLock l(&env_mutex_);
61
+ // If this is the first WAL, remember its name and skip deleting it. We
62
+ // remember its name partly because the application might attempt to
63
+ // delete the file again.
64
+ if (skipped_wal.size() != 0 && skipped_wal != fname) {
65
+ if (largest_deleted_wal.size() == 0 ||
66
+ largest_deleted_wal.compare(fname) < 0) {
67
+ largest_deleted_wal = fname;
68
+ }
69
+ } else {
70
+ skipped_wal = fname;
71
+ return Status::OK();
72
+ }
73
+ }
74
+ return SpecialEnv::DeleteFile(fname);
75
+ }
76
+ bool IsWAL(const std::string& fname) {
77
+ // printf("iswal %s\n", fname.c_str());
78
+ return fname.compare(fname.size() - 3, 3, "log") == 0;
79
+ }
80
+
81
+ InstrumentedMutex env_mutex_;
82
+ // the wal whose actual delete was skipped by the env
83
+ std::string skipped_wal = "";
84
+ // the largest WAL that was requested to be deleted
85
+ std::string largest_deleted_wal = "";
86
+ // number of WALs that were successfully deleted
87
+ std::atomic<size_t> deleted_wal_cnt = {0};
88
+ // the WAL whose delete from fs was skipped is reopened during recovery
89
+ std::atomic<bool> deleted_wal_reopened = {false};
90
+ // whether a gap in the WALs was detected during recovery
91
+ std::atomic<bool> gap_in_wals = {false};
92
+ };
93
+
94
+ class DBWALTestWithEnrichedEnv : public DBTestBase {
95
+ public:
96
+ DBWALTestWithEnrichedEnv()
97
+ : DBTestBase("/db_wal_test", /*env_do_fsync=*/true) {
98
+ enriched_env_ = new EnrichedSpecialEnv(env_->target());
99
+ auto options = CurrentOptions();
100
+ options.env = enriched_env_;
101
+ options.allow_2pc = true;
102
+ Reopen(options);
103
+ delete env_;
104
+ // to be deleted by the parent class
105
+ env_ = enriched_env_;
106
+ }
107
+
108
+ protected:
109
+ EnrichedSpecialEnv* enriched_env_;
110
+ };
111
+
112
+ // Test that the recovery would successfully avoid the gaps between the logs.
113
+ // One known scenario that could cause this is that the application issue the
114
+ // WAL deletion out of order. For the sake of simplicity in the test, here we
115
+ // create the gap by manipulating the env to skip deletion of the first WAL but
116
+ // not the ones after it.
117
+ TEST_F(DBWALTestWithEnrichedEnv, SkipDeletedWALs) {
118
+ auto options = last_options_;
119
+ // To cause frequent WAL deletion
120
+ options.write_buffer_size = 128;
121
+ Reopen(options);
122
+
123
+ WriteOptions writeOpt = WriteOptions();
124
+ for (int i = 0; i < 128 * 5; i++) {
125
+ ASSERT_OK(dbfull()->Put(writeOpt, "foo", "v1"));
126
+ }
127
+ FlushOptions fo;
128
+ fo.wait = true;
129
+ ASSERT_OK(db_->Flush(fo));
130
+
131
+ // some wals are deleted
132
+ ASSERT_NE(0, enriched_env_->deleted_wal_cnt);
133
+ // but not the first one
134
+ ASSERT_NE(0, enriched_env_->skipped_wal.size());
135
+
136
+ // Test that the WAL that was not deleted will be skipped during recovery
137
+ options = last_options_;
138
+ Reopen(options);
139
+ ASSERT_FALSE(enriched_env_->deleted_wal_reopened);
140
+ ASSERT_FALSE(enriched_env_->gap_in_wals);
141
+ }
142
+
143
+ TEST_F(DBWALTest, WAL) {
144
+ do {
145
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
146
+ WriteOptions writeOpt = WriteOptions();
147
+ writeOpt.disableWAL = true;
148
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "foo", "v1"));
149
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "bar", "v1"));
150
+
151
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
152
+ ASSERT_EQ("v1", Get(1, "foo"));
153
+ ASSERT_EQ("v1", Get(1, "bar"));
154
+
155
+ writeOpt.disableWAL = false;
156
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "bar", "v2"));
157
+ writeOpt.disableWAL = true;
158
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "foo", "v2"));
159
+
160
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
161
+ // Both value's should be present.
162
+ ASSERT_EQ("v2", Get(1, "bar"));
163
+ ASSERT_EQ("v2", Get(1, "foo"));
164
+
165
+ writeOpt.disableWAL = true;
166
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "bar", "v3"));
167
+ writeOpt.disableWAL = false;
168
+ ASSERT_OK(dbfull()->Put(writeOpt, handles_[1], "foo", "v3"));
169
+
170
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
171
+ // again both values should be present.
172
+ ASSERT_EQ("v3", Get(1, "foo"));
173
+ ASSERT_EQ("v3", Get(1, "bar"));
174
+ } while (ChangeWalOptions());
175
+ }
176
+
177
+ TEST_F(DBWALTest, RollLog) {
178
+ do {
179
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
180
+ ASSERT_OK(Put(1, "foo", "v1"));
181
+ ASSERT_OK(Put(1, "baz", "v5"));
182
+
183
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
184
+ for (int i = 0; i < 10; i++) {
185
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
186
+ }
187
+ ASSERT_OK(Put(1, "foo", "v4"));
188
+ for (int i = 0; i < 10; i++) {
189
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
190
+ }
191
+ } while (ChangeWalOptions());
192
+ }
193
+
194
+ TEST_F(DBWALTest, SyncWALNotBlockWrite) {
195
+ Options options = CurrentOptions();
196
+ options.max_write_buffer_number = 4;
197
+ DestroyAndReopen(options);
198
+
199
+ ASSERT_OK(Put("foo1", "bar1"));
200
+ ASSERT_OK(Put("foo5", "bar5"));
201
+
202
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
203
+ {"WritableFileWriter::SyncWithoutFlush:1",
204
+ "DBWALTest::SyncWALNotBlockWrite:1"},
205
+ {"DBWALTest::SyncWALNotBlockWrite:2",
206
+ "WritableFileWriter::SyncWithoutFlush:2"},
207
+ });
208
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
209
+
210
+ ROCKSDB_NAMESPACE::port::Thread thread([&]() { ASSERT_OK(db_->SyncWAL()); });
211
+
212
+ TEST_SYNC_POINT("DBWALTest::SyncWALNotBlockWrite:1");
213
+ ASSERT_OK(Put("foo2", "bar2"));
214
+ ASSERT_OK(Put("foo3", "bar3"));
215
+ FlushOptions fo;
216
+ fo.wait = false;
217
+ ASSERT_OK(db_->Flush(fo));
218
+ ASSERT_OK(Put("foo4", "bar4"));
219
+
220
+ TEST_SYNC_POINT("DBWALTest::SyncWALNotBlockWrite:2");
221
+
222
+ thread.join();
223
+
224
+ ASSERT_EQ(Get("foo1"), "bar1");
225
+ ASSERT_EQ(Get("foo2"), "bar2");
226
+ ASSERT_EQ(Get("foo3"), "bar3");
227
+ ASSERT_EQ(Get("foo4"), "bar4");
228
+ ASSERT_EQ(Get("foo5"), "bar5");
229
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
230
+ }
231
+
232
+ TEST_F(DBWALTest, SyncWALNotWaitWrite) {
233
+ ASSERT_OK(Put("foo1", "bar1"));
234
+ ASSERT_OK(Put("foo3", "bar3"));
235
+
236
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
237
+ {"SpecialEnv::WalFile::Append:1", "DBWALTest::SyncWALNotWaitWrite:1"},
238
+ {"DBWALTest::SyncWALNotWaitWrite:2", "SpecialEnv::WalFile::Append:2"},
239
+ });
240
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
241
+
242
+ ROCKSDB_NAMESPACE::port::Thread thread(
243
+ [&]() { ASSERT_OK(Put("foo2", "bar2")); });
244
+ // Moving this to SyncWAL before the actual fsync
245
+ // TEST_SYNC_POINT("DBWALTest::SyncWALNotWaitWrite:1");
246
+ ASSERT_OK(db_->SyncWAL());
247
+ // Moving this to SyncWAL after actual fsync
248
+ // TEST_SYNC_POINT("DBWALTest::SyncWALNotWaitWrite:2");
249
+
250
+ thread.join();
251
+
252
+ ASSERT_EQ(Get("foo1"), "bar1");
253
+ ASSERT_EQ(Get("foo2"), "bar2");
254
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
255
+ }
256
+
257
+ TEST_F(DBWALTest, Recover) {
258
+ do {
259
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
260
+ ASSERT_OK(Put(1, "foo", "v1"));
261
+ ASSERT_OK(Put(1, "baz", "v5"));
262
+
263
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
264
+ ASSERT_EQ("v1", Get(1, "foo"));
265
+
266
+ ASSERT_EQ("v1", Get(1, "foo"));
267
+ ASSERT_EQ("v5", Get(1, "baz"));
268
+ ASSERT_OK(Put(1, "bar", "v2"));
269
+ ASSERT_OK(Put(1, "foo", "v3"));
270
+
271
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
272
+ ASSERT_EQ("v3", Get(1, "foo"));
273
+ ASSERT_OK(Put(1, "foo", "v4"));
274
+ ASSERT_EQ("v4", Get(1, "foo"));
275
+ ASSERT_EQ("v2", Get(1, "bar"));
276
+ ASSERT_EQ("v5", Get(1, "baz"));
277
+ } while (ChangeWalOptions());
278
+ }
279
+
280
+ TEST_F(DBWALTest, RecoverWithTableHandle) {
281
+ do {
282
+ Options options = CurrentOptions();
283
+ options.create_if_missing = true;
284
+ options.disable_auto_compactions = true;
285
+ options.avoid_flush_during_recovery = false;
286
+ DestroyAndReopen(options);
287
+ CreateAndReopenWithCF({"pikachu"}, options);
288
+
289
+ ASSERT_OK(Put(1, "foo", "v1"));
290
+ ASSERT_OK(Put(1, "bar", "v2"));
291
+ ASSERT_OK(Flush(1));
292
+ ASSERT_OK(Put(1, "foo", "v3"));
293
+ ASSERT_OK(Put(1, "bar", "v4"));
294
+ ASSERT_OK(Flush(1));
295
+ ASSERT_OK(Put(1, "big", std::string(100, 'a')));
296
+
297
+ options = CurrentOptions();
298
+ const int kSmallMaxOpenFiles = 13;
299
+ if (option_config_ == kDBLogDir) {
300
+ // Use this option to check not preloading files
301
+ // Set the max open files to be small enough so no preload will
302
+ // happen.
303
+ options.max_open_files = kSmallMaxOpenFiles;
304
+ // RocksDB sanitize max open files to at least 20. Modify it back.
305
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
306
+ "SanitizeOptions::AfterChangeMaxOpenFiles", [&](void* arg) {
307
+ int* max_open_files = static_cast<int*>(arg);
308
+ *max_open_files = kSmallMaxOpenFiles;
309
+ });
310
+
311
+ } else if (option_config_ == kWalDirAndMmapReads) {
312
+ // Use this option to check always loading all files.
313
+ options.max_open_files = 100;
314
+ } else {
315
+ options.max_open_files = -1;
316
+ }
317
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
318
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
319
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
320
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
321
+
322
+ std::vector<std::vector<FileMetaData>> files;
323
+ dbfull()->TEST_GetFilesMetaData(handles_[1], &files);
324
+ size_t total_files = 0;
325
+ for (const auto& level : files) {
326
+ total_files += level.size();
327
+ }
328
+ ASSERT_EQ(total_files, 3);
329
+ for (const auto& level : files) {
330
+ for (const auto& file : level) {
331
+ if (options.max_open_files == kSmallMaxOpenFiles) {
332
+ ASSERT_TRUE(file.table_reader_handle == nullptr);
333
+ } else {
334
+ ASSERT_TRUE(file.table_reader_handle != nullptr);
335
+ }
336
+ }
337
+ }
338
+ } while (ChangeWalOptions());
339
+ }
340
+
341
+ TEST_F(DBWALTest, RecoverWithBlob) {
342
+ // Write a value that's below the prospective size limit for blobs and another
343
+ // one that's above. Note that blob files are not actually enabled at this
344
+ // point.
345
+ constexpr uint64_t min_blob_size = 10;
346
+
347
+ constexpr char short_value[] = "short";
348
+ static_assert(sizeof(short_value) - 1 < min_blob_size,
349
+ "short_value too long");
350
+
351
+ constexpr char long_value[] = "long_value";
352
+ static_assert(sizeof(long_value) - 1 >= min_blob_size,
353
+ "long_value too short");
354
+
355
+ ASSERT_OK(Put("key1", short_value));
356
+ ASSERT_OK(Put("key2", long_value));
357
+
358
+ // There should be no files just yet since we haven't flushed.
359
+ {
360
+ VersionSet* const versions = dbfull()->TEST_GetVersionSet();
361
+ ASSERT_NE(versions, nullptr);
362
+
363
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
364
+ ASSERT_NE(cfd, nullptr);
365
+
366
+ Version* const current = cfd->current();
367
+ ASSERT_NE(current, nullptr);
368
+
369
+ const VersionStorageInfo* const storage_info = current->storage_info();
370
+ ASSERT_NE(storage_info, nullptr);
371
+
372
+ ASSERT_EQ(storage_info->num_non_empty_levels(), 0);
373
+ ASSERT_TRUE(storage_info->GetBlobFiles().empty());
374
+ }
375
+
376
+ // Reopen the database with blob files enabled. A new table file/blob file
377
+ // pair should be written during recovery.
378
+ Options options;
379
+ options.enable_blob_files = true;
380
+ options.min_blob_size = min_blob_size;
381
+ options.avoid_flush_during_recovery = false;
382
+ options.disable_auto_compactions = true;
383
+ options.env = env_;
384
+
385
+ Reopen(options);
386
+
387
+ ASSERT_EQ(Get("key1"), short_value);
388
+ ASSERT_EQ(Get("key2"), long_value);
389
+
390
+ VersionSet* const versions = dbfull()->TEST_GetVersionSet();
391
+ ASSERT_NE(versions, nullptr);
392
+
393
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
394
+ ASSERT_NE(cfd, nullptr);
395
+
396
+ Version* const current = cfd->current();
397
+ ASSERT_NE(current, nullptr);
398
+
399
+ const VersionStorageInfo* const storage_info = current->storage_info();
400
+ ASSERT_NE(storage_info, nullptr);
401
+
402
+ const auto& l0_files = storage_info->LevelFiles(0);
403
+ ASSERT_EQ(l0_files.size(), 1);
404
+
405
+ const FileMetaData* const table_file = l0_files[0];
406
+ ASSERT_NE(table_file, nullptr);
407
+
408
+ const auto& blob_files = storage_info->GetBlobFiles();
409
+ ASSERT_EQ(blob_files.size(), 1);
410
+
411
+ const auto& blob_file = blob_files.begin()->second;
412
+ ASSERT_NE(blob_file, nullptr);
413
+
414
+ ASSERT_EQ(table_file->smallest.user_key(), "key1");
415
+ ASSERT_EQ(table_file->largest.user_key(), "key2");
416
+ ASSERT_EQ(table_file->fd.smallest_seqno, 1);
417
+ ASSERT_EQ(table_file->fd.largest_seqno, 2);
418
+ ASSERT_EQ(table_file->oldest_blob_file_number,
419
+ blob_file->GetBlobFileNumber());
420
+
421
+ ASSERT_EQ(blob_file->GetTotalBlobCount(), 1);
422
+
423
+ #ifndef ROCKSDB_LITE
424
+ const InternalStats* const internal_stats = cfd->internal_stats();
425
+ ASSERT_NE(internal_stats, nullptr);
426
+
427
+ const uint64_t expected_bytes =
428
+ table_file->fd.GetFileSize() + blob_file->GetTotalBlobBytes();
429
+
430
+ const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
431
+ ASSERT_FALSE(compaction_stats.empty());
432
+ ASSERT_EQ(compaction_stats[0].bytes_written, expected_bytes);
433
+ ASSERT_EQ(compaction_stats[0].num_output_files, 2);
434
+
435
+ const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
436
+ ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED], expected_bytes);
437
+ #endif // ROCKSDB_LITE
438
+ }
439
+
440
+ class DBRecoveryTestBlobError
441
+ : public DBWALTest,
442
+ public testing::WithParamInterface<std::string> {
443
+ public:
444
+ DBRecoveryTestBlobError()
445
+ : fault_injection_env_(env_), sync_point_(GetParam()) {}
446
+ ~DBRecoveryTestBlobError() { Close(); }
447
+
448
+ FaultInjectionTestEnv fault_injection_env_;
449
+ std::string sync_point_;
450
+ };
451
+
452
+ INSTANTIATE_TEST_CASE_P(DBRecoveryTestBlobError, DBRecoveryTestBlobError,
453
+ ::testing::ValuesIn(std::vector<std::string>{
454
+ "BlobFileBuilder::WriteBlobToFile:AddRecord",
455
+ "BlobFileBuilder::WriteBlobToFile:AppendFooter"}));
456
+
457
+ TEST_P(DBRecoveryTestBlobError, RecoverWithBlobError) {
458
+ // Write a value. Note that blob files are not actually enabled at this point.
459
+ ASSERT_OK(Put("key", "blob"));
460
+
461
+ // Reopen with blob files enabled but make blob file writing fail during
462
+ // recovery.
463
+ SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* /* arg */) {
464
+ fault_injection_env_.SetFilesystemActive(false,
465
+ Status::IOError(sync_point_));
466
+ });
467
+ SyncPoint::GetInstance()->SetCallBack(
468
+ "BuildTable:BeforeDeleteFile", [this](void* /* arg */) {
469
+ fault_injection_env_.SetFilesystemActive(true);
470
+ });
471
+ SyncPoint::GetInstance()->EnableProcessing();
472
+
473
+ Options options;
474
+ options.enable_blob_files = true;
475
+ options.avoid_flush_during_recovery = false;
476
+ options.disable_auto_compactions = true;
477
+ options.env = &fault_injection_env_;
478
+
479
+ ASSERT_NOK(TryReopen(options));
480
+
481
+ SyncPoint::GetInstance()->DisableProcessing();
482
+ SyncPoint::GetInstance()->ClearAllCallBacks();
483
+
484
+ // Make sure the files generated by the failed recovery have been deleted.
485
+ std::vector<std::string> files;
486
+ ASSERT_OK(env_->GetChildren(dbname_, &files));
487
+ for (const auto& file : files) {
488
+ uint64_t number = 0;
489
+ FileType type = kTableFile;
490
+
491
+ if (!ParseFileName(file, &number, &type)) {
492
+ continue;
493
+ }
494
+
495
+ ASSERT_NE(type, kTableFile);
496
+ ASSERT_NE(type, kBlobFile);
497
+ }
498
+ }
499
+
500
+ TEST_F(DBWALTest, IgnoreRecoveredLog) {
501
+ std::string backup_logs = dbname_ + "/backup_logs";
502
+
503
+ do {
504
+ // delete old files in backup_logs directory
505
+ ASSERT_OK(env_->CreateDirIfMissing(backup_logs));
506
+ std::vector<std::string> old_files;
507
+ ASSERT_OK(env_->GetChildren(backup_logs, &old_files));
508
+ for (auto& file : old_files) {
509
+ ASSERT_OK(env_->DeleteFile(backup_logs + "/" + file));
510
+ }
511
+ Options options = CurrentOptions();
512
+ options.create_if_missing = true;
513
+ options.merge_operator = MergeOperators::CreateUInt64AddOperator();
514
+ options.wal_dir = dbname_ + "/logs";
515
+ DestroyAndReopen(options);
516
+
517
+ // fill up the DB
518
+ std::string one, two;
519
+ PutFixed64(&one, 1);
520
+ PutFixed64(&two, 2);
521
+ ASSERT_OK(db_->Merge(WriteOptions(), Slice("foo"), Slice(one)));
522
+ ASSERT_OK(db_->Merge(WriteOptions(), Slice("foo"), Slice(one)));
523
+ ASSERT_OK(db_->Merge(WriteOptions(), Slice("bar"), Slice(one)));
524
+
525
+ // copy the logs to backup
526
+ std::vector<std::string> logs;
527
+ ASSERT_OK(env_->GetChildren(options.wal_dir, &logs));
528
+ for (auto& log : logs) {
529
+ CopyFile(options.wal_dir + "/" + log, backup_logs + "/" + log);
530
+ }
531
+
532
+ // recover the DB
533
+ Reopen(options);
534
+ ASSERT_EQ(two, Get("foo"));
535
+ ASSERT_EQ(one, Get("bar"));
536
+ Close();
537
+
538
+ // copy the logs from backup back to wal dir
539
+ for (auto& log : logs) {
540
+ CopyFile(backup_logs + "/" + log, options.wal_dir + "/" + log);
541
+ }
542
+ // this should ignore the log files, recovery should not happen again
543
+ // if the recovery happens, the same merge operator would be called twice,
544
+ // leading to incorrect results
545
+ Reopen(options);
546
+ ASSERT_EQ(two, Get("foo"));
547
+ ASSERT_EQ(one, Get("bar"));
548
+ Close();
549
+ Destroy(options);
550
+ Reopen(options);
551
+ Close();
552
+
553
+ // copy the logs from backup back to wal dir
554
+ ASSERT_OK(env_->CreateDirIfMissing(options.wal_dir));
555
+ for (auto& log : logs) {
556
+ CopyFile(backup_logs + "/" + log, options.wal_dir + "/" + log);
557
+ }
558
+ // assert that we successfully recovered only from logs, even though we
559
+ // destroyed the DB
560
+ Reopen(options);
561
+ ASSERT_EQ(two, Get("foo"));
562
+ ASSERT_EQ(one, Get("bar"));
563
+
564
+ // Recovery will fail if DB directory doesn't exist.
565
+ Destroy(options);
566
+ // copy the logs from backup back to wal dir
567
+ ASSERT_OK(env_->CreateDirIfMissing(options.wal_dir));
568
+ for (auto& log : logs) {
569
+ CopyFile(backup_logs + "/" + log, options.wal_dir + "/" + log);
570
+ // we won't be needing this file no more
571
+ ASSERT_OK(env_->DeleteFile(backup_logs + "/" + log));
572
+ }
573
+ Status s = TryReopen(options);
574
+ ASSERT_NOK(s);
575
+ Destroy(options);
576
+ } while (ChangeWalOptions());
577
+ }
578
+
579
+ TEST_F(DBWALTest, RecoveryWithEmptyLog) {
580
+ do {
581
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
582
+ ASSERT_OK(Put(1, "foo", "v1"));
583
+ ASSERT_OK(Put(1, "foo", "v2"));
584
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
585
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
586
+ ASSERT_OK(Put(1, "foo", "v3"));
587
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
588
+ ASSERT_EQ("v3", Get(1, "foo"));
589
+ } while (ChangeWalOptions());
590
+ }
591
+
592
+ #if !(defined NDEBUG) || !defined(OS_WIN)
593
+ TEST_F(DBWALTest, PreallocateBlock) {
594
+ Options options = CurrentOptions();
595
+ options.write_buffer_size = 10 * 1000 * 1000;
596
+ options.max_total_wal_size = 0;
597
+
598
+ size_t expected_preallocation_size = static_cast<size_t>(
599
+ options.write_buffer_size + options.write_buffer_size / 10);
600
+
601
+ DestroyAndReopen(options);
602
+
603
+ std::atomic<int> called(0);
604
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
605
+ "DBTestWalFile.GetPreallocationStatus", [&](void* arg) {
606
+ ASSERT_TRUE(arg != nullptr);
607
+ size_t preallocation_size = *(static_cast<size_t*>(arg));
608
+ ASSERT_EQ(expected_preallocation_size, preallocation_size);
609
+ called.fetch_add(1);
610
+ });
611
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
612
+ ASSERT_OK(Put("", ""));
613
+ ASSERT_OK(Flush());
614
+ ASSERT_OK(Put("", ""));
615
+ Close();
616
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
617
+ ASSERT_EQ(2, called.load());
618
+
619
+ options.max_total_wal_size = 1000 * 1000;
620
+ expected_preallocation_size = static_cast<size_t>(options.max_total_wal_size);
621
+ Reopen(options);
622
+ called.store(0);
623
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
624
+ "DBTestWalFile.GetPreallocationStatus", [&](void* arg) {
625
+ ASSERT_TRUE(arg != nullptr);
626
+ size_t preallocation_size = *(static_cast<size_t*>(arg));
627
+ ASSERT_EQ(expected_preallocation_size, preallocation_size);
628
+ called.fetch_add(1);
629
+ });
630
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
631
+ ASSERT_OK(Put("", ""));
632
+ ASSERT_OK(Flush());
633
+ ASSERT_OK(Put("", ""));
634
+ Close();
635
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
636
+ ASSERT_EQ(2, called.load());
637
+
638
+ options.db_write_buffer_size = 800 * 1000;
639
+ expected_preallocation_size =
640
+ static_cast<size_t>(options.db_write_buffer_size);
641
+ Reopen(options);
642
+ called.store(0);
643
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
644
+ "DBTestWalFile.GetPreallocationStatus", [&](void* arg) {
645
+ ASSERT_TRUE(arg != nullptr);
646
+ size_t preallocation_size = *(static_cast<size_t*>(arg));
647
+ ASSERT_EQ(expected_preallocation_size, preallocation_size);
648
+ called.fetch_add(1);
649
+ });
650
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
651
+ ASSERT_OK(Put("", ""));
652
+ ASSERT_OK(Flush());
653
+ ASSERT_OK(Put("", ""));
654
+ Close();
655
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
656
+ ASSERT_EQ(2, called.load());
657
+
658
+ expected_preallocation_size = 700 * 1000;
659
+ std::shared_ptr<WriteBufferManager> write_buffer_manager =
660
+ std::make_shared<WriteBufferManager>(static_cast<uint64_t>(700 * 1000));
661
+ options.write_buffer_manager = write_buffer_manager;
662
+ Reopen(options);
663
+ called.store(0);
664
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
665
+ "DBTestWalFile.GetPreallocationStatus", [&](void* arg) {
666
+ ASSERT_TRUE(arg != nullptr);
667
+ size_t preallocation_size = *(static_cast<size_t*>(arg));
668
+ ASSERT_EQ(expected_preallocation_size, preallocation_size);
669
+ called.fetch_add(1);
670
+ });
671
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
672
+ ASSERT_OK(Put("", ""));
673
+ ASSERT_OK(Flush());
674
+ ASSERT_OK(Put("", ""));
675
+ Close();
676
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
677
+ ASSERT_EQ(2, called.load());
678
+ }
679
+ #endif // !(defined NDEBUG) || !defined(OS_WIN)
680
+
681
+ #ifndef ROCKSDB_LITE
682
+ TEST_F(DBWALTest, DISABLED_FullPurgePreservesRecycledLog) {
683
+ // TODO(ajkr): Disabled until WAL recycling is fixed for
684
+ // `kPointInTimeRecovery`.
685
+
686
+ // For github issue #1303
687
+ for (int i = 0; i < 2; ++i) {
688
+ Options options = CurrentOptions();
689
+ options.create_if_missing = true;
690
+ options.recycle_log_file_num = 2;
691
+ if (i != 0) {
692
+ options.wal_dir = alternative_wal_dir_;
693
+ }
694
+
695
+ DestroyAndReopen(options);
696
+ ASSERT_OK(Put("foo", "v1"));
697
+ VectorLogPtr log_files;
698
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files));
699
+ ASSERT_GT(log_files.size(), 0);
700
+ ASSERT_OK(Flush());
701
+
702
+ // Now the original WAL is in log_files[0] and should be marked for
703
+ // recycling.
704
+ // Verify full purge cannot remove this file.
705
+ JobContext job_context(0);
706
+ dbfull()->TEST_LockMutex();
707
+ dbfull()->FindObsoleteFiles(&job_context, true /* force */);
708
+ dbfull()->TEST_UnlockMutex();
709
+ dbfull()->PurgeObsoleteFiles(job_context);
710
+
711
+ if (i == 0) {
712
+ ASSERT_OK(
713
+ env_->FileExists(LogFileName(dbname_, log_files[0]->LogNumber())));
714
+ } else {
715
+ ASSERT_OK(env_->FileExists(
716
+ LogFileName(alternative_wal_dir_, log_files[0]->LogNumber())));
717
+ }
718
+ }
719
+ }
720
+
721
+ TEST_F(DBWALTest, DISABLED_FullPurgePreservesLogPendingReuse) {
722
+ // TODO(ajkr): Disabled until WAL recycling is fixed for
723
+ // `kPointInTimeRecovery`.
724
+
725
+ // Ensures full purge cannot delete a WAL while it's in the process of being
726
+ // recycled. In particular, we force the full purge after a file has been
727
+ // chosen for reuse, but before it has been renamed.
728
+ for (int i = 0; i < 2; ++i) {
729
+ Options options = CurrentOptions();
730
+ options.recycle_log_file_num = 1;
731
+ if (i != 0) {
732
+ options.wal_dir = alternative_wal_dir_;
733
+ }
734
+ DestroyAndReopen(options);
735
+
736
+ // The first flush creates a second log so writes can continue before the
737
+ // flush finishes.
738
+ ASSERT_OK(Put("foo", "bar"));
739
+ ASSERT_OK(Flush());
740
+
741
+ // The second flush can recycle the first log. Sync points enforce the
742
+ // full purge happens after choosing the log to recycle and before it is
743
+ // renamed.
744
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
745
+ {"DBImpl::CreateWAL:BeforeReuseWritableFile1",
746
+ "DBWALTest::FullPurgePreservesLogPendingReuse:PreFullPurge"},
747
+ {"DBWALTest::FullPurgePreservesLogPendingReuse:PostFullPurge",
748
+ "DBImpl::CreateWAL:BeforeReuseWritableFile2"},
749
+ });
750
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
751
+ ROCKSDB_NAMESPACE::port::Thread thread([&]() {
752
+ TEST_SYNC_POINT(
753
+ "DBWALTest::FullPurgePreservesLogPendingReuse:PreFullPurge");
754
+ ASSERT_OK(db_->EnableFileDeletions(true));
755
+ TEST_SYNC_POINT(
756
+ "DBWALTest::FullPurgePreservesLogPendingReuse:PostFullPurge");
757
+ });
758
+ ASSERT_OK(Put("foo", "bar"));
759
+ ASSERT_OK(Flush());
760
+ thread.join();
761
+ }
762
+ }
763
+
764
+ TEST_F(DBWALTest, GetSortedWalFiles) {
765
+ do {
766
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
767
+ VectorLogPtr log_files;
768
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files));
769
+ ASSERT_EQ(0, log_files.size());
770
+
771
+ ASSERT_OK(Put(1, "foo", "v1"));
772
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files));
773
+ ASSERT_EQ(1, log_files.size());
774
+ } while (ChangeWalOptions());
775
+ }
776
+
777
+ TEST_F(DBWALTest, GetCurrentWalFile) {
778
+ do {
779
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
780
+
781
+ std::unique_ptr<LogFile>* bad_log_file = nullptr;
782
+ ASSERT_NOK(dbfull()->GetCurrentWalFile(bad_log_file));
783
+
784
+ std::unique_ptr<LogFile> log_file;
785
+ ASSERT_OK(dbfull()->GetCurrentWalFile(&log_file));
786
+
787
+ // nothing has been written to the log yet
788
+ ASSERT_EQ(log_file->StartSequence(), 0);
789
+ ASSERT_EQ(log_file->SizeFileBytes(), 0);
790
+ ASSERT_EQ(log_file->Type(), kAliveLogFile);
791
+ ASSERT_GT(log_file->LogNumber(), 0);
792
+
793
+ // add some data and verify that the file size actually moves foward
794
+ ASSERT_OK(Put(0, "foo", "v1"));
795
+ ASSERT_OK(Put(0, "foo2", "v2"));
796
+ ASSERT_OK(Put(0, "foo3", "v3"));
797
+
798
+ ASSERT_OK(dbfull()->GetCurrentWalFile(&log_file));
799
+
800
+ ASSERT_EQ(log_file->StartSequence(), 0);
801
+ ASSERT_GT(log_file->SizeFileBytes(), 0);
802
+ ASSERT_EQ(log_file->Type(), kAliveLogFile);
803
+ ASSERT_GT(log_file->LogNumber(), 0);
804
+
805
+ // force log files to cycle and add some more data, then check if
806
+ // log number moves forward
807
+
808
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
809
+ for (int i = 0; i < 10; i++) {
810
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
811
+ }
812
+
813
+ ASSERT_OK(Put(0, "foo4", "v4"));
814
+ ASSERT_OK(Put(0, "foo5", "v5"));
815
+ ASSERT_OK(Put(0, "foo6", "v6"));
816
+
817
+ ASSERT_OK(dbfull()->GetCurrentWalFile(&log_file));
818
+
819
+ ASSERT_EQ(log_file->StartSequence(), 0);
820
+ ASSERT_GT(log_file->SizeFileBytes(), 0);
821
+ ASSERT_EQ(log_file->Type(), kAliveLogFile);
822
+ ASSERT_GT(log_file->LogNumber(), 0);
823
+
824
+ } while (ChangeWalOptions());
825
+ }
826
+
827
+ TEST_F(DBWALTest, RecoveryWithLogDataForSomeCFs) {
828
+ // Test for regression of WAL cleanup missing files that don't contain data
829
+ // for every column family.
830
+ do {
831
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
832
+ ASSERT_OK(Put(1, "foo", "v1"));
833
+ ASSERT_OK(Put(1, "foo", "v2"));
834
+ uint64_t earliest_log_nums[2];
835
+ for (int i = 0; i < 2; ++i) {
836
+ if (i > 0) {
837
+ ReopenWithColumnFamilies({"default", "pikachu"}, CurrentOptions());
838
+ }
839
+ VectorLogPtr log_files;
840
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files));
841
+ if (log_files.size() > 0) {
842
+ earliest_log_nums[i] = log_files[0]->LogNumber();
843
+ } else {
844
+ earliest_log_nums[i] = port::kMaxUint64;
845
+ }
846
+ }
847
+ // Check at least the first WAL was cleaned up during the recovery.
848
+ ASSERT_LT(earliest_log_nums[0], earliest_log_nums[1]);
849
+ } while (ChangeWalOptions());
850
+ }
851
+
852
+ TEST_F(DBWALTest, RecoverWithLargeLog) {
853
+ do {
854
+ {
855
+ Options options = CurrentOptions();
856
+ CreateAndReopenWithCF({"pikachu"}, options);
857
+ ASSERT_OK(Put(1, "big1", std::string(200000, '1')));
858
+ ASSERT_OK(Put(1, "big2", std::string(200000, '2')));
859
+ ASSERT_OK(Put(1, "small3", std::string(10, '3')));
860
+ ASSERT_OK(Put(1, "small4", std::string(10, '4')));
861
+ ASSERT_EQ(NumTableFilesAtLevel(0, 1), 0);
862
+ }
863
+
864
+ // Make sure that if we re-open with a small write buffer size that
865
+ // we flush table files in the middle of a large log file.
866
+ Options options;
867
+ options.write_buffer_size = 100000;
868
+ options = CurrentOptions(options);
869
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
870
+ ASSERT_EQ(NumTableFilesAtLevel(0, 1), 3);
871
+ ASSERT_EQ(std::string(200000, '1'), Get(1, "big1"));
872
+ ASSERT_EQ(std::string(200000, '2'), Get(1, "big2"));
873
+ ASSERT_EQ(std::string(10, '3'), Get(1, "small3"));
874
+ ASSERT_EQ(std::string(10, '4'), Get(1, "small4"));
875
+ ASSERT_GT(NumTableFilesAtLevel(0, 1), 1);
876
+ } while (ChangeWalOptions());
877
+ }
878
+
879
+ // In https://reviews.facebook.net/D20661 we change
880
+ // recovery behavior: previously for each log file each column family
881
+ // memtable was flushed, even it was empty. Now it's changed:
882
+ // we try to create the smallest number of table files by merging
883
+ // updates from multiple logs
884
+ TEST_F(DBWALTest, RecoverCheckFileAmountWithSmallWriteBuffer) {
885
+ Options options = CurrentOptions();
886
+ options.write_buffer_size = 5000000;
887
+ CreateAndReopenWithCF({"pikachu", "dobrynia", "nikitich"}, options);
888
+
889
+ // Since we will reopen DB with smaller write_buffer_size,
890
+ // each key will go to new SST file
891
+ ASSERT_OK(Put(1, Key(10), DummyString(1000000)));
892
+ ASSERT_OK(Put(1, Key(10), DummyString(1000000)));
893
+ ASSERT_OK(Put(1, Key(10), DummyString(1000000)));
894
+ ASSERT_OK(Put(1, Key(10), DummyString(1000000)));
895
+
896
+ ASSERT_OK(Put(3, Key(10), DummyString(1)));
897
+ // Make 'dobrynia' to be flushed and new WAL file to be created
898
+ ASSERT_OK(Put(2, Key(10), DummyString(7500000)));
899
+ ASSERT_OK(Put(2, Key(1), DummyString(1)));
900
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[2]));
901
+ {
902
+ auto tables = ListTableFiles(env_, dbname_);
903
+ ASSERT_EQ(tables.size(), static_cast<size_t>(1));
904
+ // Make sure 'dobrynia' was flushed: check sst files amount
905
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "dobrynia"),
906
+ static_cast<uint64_t>(1));
907
+ }
908
+ // New WAL file
909
+ ASSERT_OK(Put(1, Key(1), DummyString(1)));
910
+ ASSERT_OK(Put(1, Key(1), DummyString(1)));
911
+ ASSERT_OK(Put(3, Key(10), DummyString(1)));
912
+ ASSERT_OK(Put(3, Key(10), DummyString(1)));
913
+ ASSERT_OK(Put(3, Key(10), DummyString(1)));
914
+
915
+ options.write_buffer_size = 4096;
916
+ options.arena_block_size = 4096;
917
+ ReopenWithColumnFamilies({"default", "pikachu", "dobrynia", "nikitich"},
918
+ options);
919
+ {
920
+ // No inserts => default is empty
921
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "default"),
922
+ static_cast<uint64_t>(0));
923
+ // First 4 keys goes to separate SSTs + 1 more SST for 2 smaller keys
924
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "pikachu"),
925
+ static_cast<uint64_t>(5));
926
+ // 1 SST for big key + 1 SST for small one
927
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "dobrynia"),
928
+ static_cast<uint64_t>(2));
929
+ // 1 SST for all keys
930
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "nikitich"),
931
+ static_cast<uint64_t>(1));
932
+ }
933
+ }
934
+
935
+ // In https://reviews.facebook.net/D20661 we change
936
+ // recovery behavior: previously for each log file each column family
937
+ // memtable was flushed, even it wasn't empty. Now it's changed:
938
+ // we try to create the smallest number of table files by merging
939
+ // updates from multiple logs
940
+ TEST_F(DBWALTest, RecoverCheckFileAmount) {
941
+ Options options = CurrentOptions();
942
+ options.write_buffer_size = 100000;
943
+ options.arena_block_size = 4 * 1024;
944
+ options.avoid_flush_during_recovery = false;
945
+ CreateAndReopenWithCF({"pikachu", "dobrynia", "nikitich"}, options);
946
+
947
+ ASSERT_OK(Put(0, Key(1), DummyString(1)));
948
+ ASSERT_OK(Put(1, Key(1), DummyString(1)));
949
+ ASSERT_OK(Put(2, Key(1), DummyString(1)));
950
+
951
+ // Make 'nikitich' memtable to be flushed
952
+ ASSERT_OK(Put(3, Key(10), DummyString(1002400)));
953
+ ASSERT_OK(Put(3, Key(1), DummyString(1)));
954
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[3]));
955
+ // 4 memtable are not flushed, 1 sst file
956
+ {
957
+ auto tables = ListTableFiles(env_, dbname_);
958
+ ASSERT_EQ(tables.size(), static_cast<size_t>(1));
959
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "nikitich"),
960
+ static_cast<uint64_t>(1));
961
+ }
962
+ // Memtable for 'nikitich' has flushed, new WAL file has opened
963
+ // 4 memtable still not flushed
964
+
965
+ // Write to new WAL file
966
+ ASSERT_OK(Put(0, Key(1), DummyString(1)));
967
+ ASSERT_OK(Put(1, Key(1), DummyString(1)));
968
+ ASSERT_OK(Put(2, Key(1), DummyString(1)));
969
+
970
+ // Fill up 'nikitich' one more time
971
+ ASSERT_OK(Put(3, Key(10), DummyString(1002400)));
972
+ // make it flush
973
+ ASSERT_OK(Put(3, Key(1), DummyString(1)));
974
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[3]));
975
+ // There are still 4 memtable not flushed, and 2 sst tables
976
+ ASSERT_OK(Put(0, Key(1), DummyString(1)));
977
+ ASSERT_OK(Put(1, Key(1), DummyString(1)));
978
+ ASSERT_OK(Put(2, Key(1), DummyString(1)));
979
+
980
+ {
981
+ auto tables = ListTableFiles(env_, dbname_);
982
+ ASSERT_EQ(tables.size(), static_cast<size_t>(2));
983
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "nikitich"),
984
+ static_cast<uint64_t>(2));
985
+ }
986
+
987
+ ReopenWithColumnFamilies({"default", "pikachu", "dobrynia", "nikitich"},
988
+ options);
989
+ {
990
+ std::vector<uint64_t> table_files = ListTableFiles(env_, dbname_);
991
+ // Check, that records for 'default', 'dobrynia' and 'pikachu' from
992
+ // first, second and third WALs went to the same SST.
993
+ // So, there is 6 SSTs: three for 'nikitich', one for 'default', one for
994
+ // 'dobrynia', one for 'pikachu'
995
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "default"),
996
+ static_cast<uint64_t>(1));
997
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "nikitich"),
998
+ static_cast<uint64_t>(3));
999
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "dobrynia"),
1000
+ static_cast<uint64_t>(1));
1001
+ ASSERT_EQ(GetNumberOfSstFilesForColumnFamily(db_, "pikachu"),
1002
+ static_cast<uint64_t>(1));
1003
+ }
1004
+ }
1005
+
1006
+ TEST_F(DBWALTest, SyncMultipleLogs) {
1007
+ const uint64_t kNumBatches = 2;
1008
+ const int kBatchSize = 1000;
1009
+
1010
+ Options options = CurrentOptions();
1011
+ options.create_if_missing = true;
1012
+ options.write_buffer_size = 4096;
1013
+ Reopen(options);
1014
+
1015
+ WriteBatch batch;
1016
+ WriteOptions wo;
1017
+ wo.sync = true;
1018
+
1019
+ for (uint64_t b = 0; b < kNumBatches; b++) {
1020
+ batch.Clear();
1021
+ for (int i = 0; i < kBatchSize; i++) {
1022
+ ASSERT_OK(batch.Put(Key(i), DummyString(128)));
1023
+ }
1024
+
1025
+ ASSERT_OK(dbfull()->Write(wo, &batch));
1026
+ }
1027
+
1028
+ ASSERT_OK(dbfull()->SyncWAL());
1029
+ }
1030
+
1031
+ // Github issue 1339. Prior the fix we read sequence id from the first log to
1032
+ // a local variable, then keep increase the variable as we replay logs,
1033
+ // ignoring actual sequence id of the records. This is incorrect if some writes
1034
+ // come with WAL disabled.
1035
+ TEST_F(DBWALTest, PartOfWritesWithWALDisabled) {
1036
+ std::unique_ptr<FaultInjectionTestEnv> fault_env(
1037
+ new FaultInjectionTestEnv(env_));
1038
+ Options options = CurrentOptions();
1039
+ options.env = fault_env.get();
1040
+ options.disable_auto_compactions = true;
1041
+ WriteOptions wal_on, wal_off;
1042
+ wal_on.sync = true;
1043
+ wal_on.disableWAL = false;
1044
+ wal_off.disableWAL = true;
1045
+ CreateAndReopenWithCF({"dummy"}, options);
1046
+ ASSERT_OK(Put(1, "dummy", "d1", wal_on)); // seq id 1
1047
+ ASSERT_OK(Put(1, "dummy", "d2", wal_off));
1048
+ ASSERT_OK(Put(1, "dummy", "d3", wal_off));
1049
+ ASSERT_OK(Put(0, "key", "v4", wal_on)); // seq id 4
1050
+ ASSERT_OK(Flush(0));
1051
+ ASSERT_OK(Put(0, "key", "v5", wal_on)); // seq id 5
1052
+ ASSERT_EQ("v5", Get(0, "key"));
1053
+ ASSERT_OK(dbfull()->FlushWAL(false));
1054
+ // Simulate a crash.
1055
+ fault_env->SetFilesystemActive(false);
1056
+ Close();
1057
+ fault_env->ResetState();
1058
+ ReopenWithColumnFamilies({"default", "dummy"}, options);
1059
+ // Prior to the fix, we may incorrectly recover "v5" with sequence id = 3.
1060
+ ASSERT_EQ("v5", Get(0, "key"));
1061
+ // Destroy DB before destruct fault_env.
1062
+ Destroy(options);
1063
+ }
1064
+
1065
+ //
1066
+ // Test WAL recovery for the various modes available
1067
+ //
1068
+ class RecoveryTestHelper {
1069
+ public:
1070
+ // Number of WAL files to generate
1071
+ static constexpr int kWALFilesCount = 10;
1072
+ // Starting number for the WAL file name like 00010.log
1073
+ static constexpr int kWALFileOffset = 10;
1074
+ // Keys to be written per WAL file
1075
+ static constexpr int kKeysPerWALFile = 133;
1076
+ // Size of the value
1077
+ static constexpr int kValueSize = 96;
1078
+
1079
+ // Create WAL files with values filled in
1080
+ static void FillData(DBWALTestBase* test, const Options& options,
1081
+ const size_t wal_count, size_t* count) {
1082
+ // Calling internal functions requires sanitized options.
1083
+ Options sanitized_options = SanitizeOptions(test->dbname_, options);
1084
+ const ImmutableDBOptions db_options(sanitized_options);
1085
+
1086
+ *count = 0;
1087
+
1088
+ std::shared_ptr<Cache> table_cache = NewLRUCache(50, 0);
1089
+ EnvOptions env_options;
1090
+ WriteBufferManager write_buffer_manager(db_options.db_write_buffer_size);
1091
+
1092
+ std::unique_ptr<VersionSet> versions;
1093
+ std::unique_ptr<WalManager> wal_manager;
1094
+ WriteController write_controller;
1095
+
1096
+ versions.reset(new VersionSet(
1097
+ test->dbname_, &db_options, env_options, table_cache.get(),
1098
+ &write_buffer_manager, &write_controller,
1099
+ /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr));
1100
+
1101
+ wal_manager.reset(
1102
+ new WalManager(db_options, env_options, /*io_tracer=*/nullptr));
1103
+
1104
+ std::unique_ptr<log::Writer> current_log_writer;
1105
+
1106
+ for (size_t j = kWALFileOffset; j < wal_count + kWALFileOffset; j++) {
1107
+ uint64_t current_log_number = j;
1108
+ std::string fname = LogFileName(test->dbname_, current_log_number);
1109
+ std::unique_ptr<WritableFile> file;
1110
+ ASSERT_OK(db_options.env->NewWritableFile(fname, &file, env_options));
1111
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
1112
+ NewLegacyWritableFileWrapper(std::move(file)), fname, env_options));
1113
+ current_log_writer.reset(
1114
+ new log::Writer(std::move(file_writer), current_log_number,
1115
+ db_options.recycle_log_file_num > 0));
1116
+
1117
+ WriteBatch batch;
1118
+ for (int i = 0; i < kKeysPerWALFile; i++) {
1119
+ std::string key = "key" + ToString((*count)++);
1120
+ std::string value = test->DummyString(kValueSize);
1121
+ ASSERT_NE(current_log_writer.get(), nullptr);
1122
+ uint64_t seq = versions->LastSequence() + 1;
1123
+ batch.Clear();
1124
+ ASSERT_OK(batch.Put(key, value));
1125
+ WriteBatchInternal::SetSequence(&batch, seq);
1126
+ ASSERT_OK(current_log_writer->AddRecord(
1127
+ WriteBatchInternal::Contents(&batch)));
1128
+ versions->SetLastAllocatedSequence(seq);
1129
+ versions->SetLastPublishedSequence(seq);
1130
+ versions->SetLastSequence(seq);
1131
+ }
1132
+ }
1133
+ }
1134
+
1135
+ // Recreate and fill the store with some data
1136
+ static size_t FillData(DBWALTestBase* test, Options* options) {
1137
+ options->create_if_missing = true;
1138
+ test->DestroyAndReopen(*options);
1139
+ test->Close();
1140
+
1141
+ size_t count = 0;
1142
+ FillData(test, *options, kWALFilesCount, &count);
1143
+ return count;
1144
+ }
1145
+
1146
+ // Read back all the keys we wrote and return the number of keys found
1147
+ static size_t GetData(DBWALTestBase* test) {
1148
+ size_t count = 0;
1149
+ for (size_t i = 0; i < kWALFilesCount * kKeysPerWALFile; i++) {
1150
+ if (test->Get("key" + ToString(i)) != "NOT_FOUND") {
1151
+ ++count;
1152
+ }
1153
+ }
1154
+ return count;
1155
+ }
1156
+
1157
+ // Manuall corrupt the specified WAL
1158
+ static void CorruptWAL(DBWALTestBase* test, const Options& options,
1159
+ const double off, const double len,
1160
+ const int wal_file_id, const bool trunc = false) {
1161
+ Env* env = options.env;
1162
+ std::string fname = LogFileName(test->dbname_, wal_file_id);
1163
+ uint64_t size;
1164
+ ASSERT_OK(env->GetFileSize(fname, &size));
1165
+ ASSERT_GT(size, 0);
1166
+ #ifdef OS_WIN
1167
+ // Windows disk cache behaves differently. When we truncate
1168
+ // the original content is still in the cache due to the original
1169
+ // handle is still open. Generally, in Windows, one prohibits
1170
+ // shared access to files and it is not needed for WAL but we allow
1171
+ // it to induce corruption at various tests.
1172
+ test->Close();
1173
+ #endif
1174
+ if (trunc) {
1175
+ ASSERT_OK(
1176
+ test::TruncateFile(env, fname, static_cast<uint64_t>(size * off)));
1177
+ } else {
1178
+ ASSERT_OK(test::CorruptFile(env, fname, static_cast<int>(size * off + 8),
1179
+ static_cast<int>(size * len), false));
1180
+ }
1181
+ }
1182
+ };
1183
+
1184
+ class DBWALTestWithParams
1185
+ : public DBWALTestBase,
1186
+ public ::testing::WithParamInterface<std::tuple<bool, int, int>> {
1187
+ public:
1188
+ DBWALTestWithParams() : DBWALTestBase("/db_wal_test_with_params") {}
1189
+ };
1190
+
1191
+ INSTANTIATE_TEST_CASE_P(
1192
+ Wal, DBWALTestWithParams,
1193
+ ::testing::Combine(::testing::Bool(), ::testing::Range(0, 4, 1),
1194
+ ::testing::Range(RecoveryTestHelper::kWALFileOffset,
1195
+ RecoveryTestHelper::kWALFileOffset +
1196
+ RecoveryTestHelper::kWALFilesCount,
1197
+ 1)));
1198
+
1199
+ class DBWALTestWithParamsVaryingRecoveryMode
1200
+ : public DBWALTestBase,
1201
+ public ::testing::WithParamInterface<
1202
+ std::tuple<bool, int, int, WALRecoveryMode>> {
1203
+ public:
1204
+ DBWALTestWithParamsVaryingRecoveryMode()
1205
+ : DBWALTestBase("/db_wal_test_with_params_mode") {}
1206
+ };
1207
+
1208
+ INSTANTIATE_TEST_CASE_P(
1209
+ Wal, DBWALTestWithParamsVaryingRecoveryMode,
1210
+ ::testing::Combine(
1211
+ ::testing::Bool(), ::testing::Range(0, 4, 1),
1212
+ ::testing::Range(RecoveryTestHelper::kWALFileOffset,
1213
+ RecoveryTestHelper::kWALFileOffset +
1214
+ RecoveryTestHelper::kWALFilesCount,
1215
+ 1),
1216
+ ::testing::Values(WALRecoveryMode::kTolerateCorruptedTailRecords,
1217
+ WALRecoveryMode::kAbsoluteConsistency,
1218
+ WALRecoveryMode::kPointInTimeRecovery,
1219
+ WALRecoveryMode::kSkipAnyCorruptedRecords)));
1220
+
1221
+ // Test scope:
1222
+ // - We expect to open the data store when there is incomplete trailing writes
1223
+ // at the end of any of the logs
1224
+ // - We do not expect to open the data store for corruption
1225
+ TEST_P(DBWALTestWithParams, kTolerateCorruptedTailRecords) {
1226
+ bool trunc = std::get<0>(GetParam()); // Corruption style
1227
+ // Corruption offset position
1228
+ int corrupt_offset = std::get<1>(GetParam());
1229
+ int wal_file_id = std::get<2>(GetParam()); // WAL file
1230
+
1231
+ // Fill data for testing
1232
+ Options options = CurrentOptions();
1233
+ const size_t row_count = RecoveryTestHelper::FillData(this, &options);
1234
+ // test checksum failure or parsing
1235
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1236
+ /*len%=*/.1, wal_file_id, trunc);
1237
+
1238
+ options.wal_recovery_mode = WALRecoveryMode::kTolerateCorruptedTailRecords;
1239
+ if (trunc) {
1240
+ options.create_if_missing = false;
1241
+ ASSERT_OK(TryReopen(options));
1242
+ const size_t recovered_row_count = RecoveryTestHelper::GetData(this);
1243
+ ASSERT_TRUE(corrupt_offset == 0 || recovered_row_count > 0);
1244
+ ASSERT_LT(recovered_row_count, row_count);
1245
+ } else {
1246
+ ASSERT_NOK(TryReopen(options));
1247
+ }
1248
+ }
1249
+
1250
+ // Test scope:
1251
+ // We don't expect the data store to be opened if there is any corruption
1252
+ // (leading, middle or trailing -- incomplete writes or corruption)
1253
+ TEST_P(DBWALTestWithParams, kAbsoluteConsistency) {
1254
+ // Verify clean slate behavior
1255
+ Options options = CurrentOptions();
1256
+ const size_t row_count = RecoveryTestHelper::FillData(this, &options);
1257
+ options.create_if_missing = false;
1258
+ ASSERT_OK(TryReopen(options));
1259
+ ASSERT_EQ(RecoveryTestHelper::GetData(this), row_count);
1260
+
1261
+ bool trunc = std::get<0>(GetParam()); // Corruption style
1262
+ // Corruption offset position
1263
+ int corrupt_offset = std::get<1>(GetParam());
1264
+ int wal_file_id = std::get<2>(GetParam()); // WAL file
1265
+
1266
+ if (trunc && corrupt_offset == 0) {
1267
+ return;
1268
+ }
1269
+
1270
+ // fill with new date
1271
+ RecoveryTestHelper::FillData(this, &options);
1272
+ // corrupt the wal
1273
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1274
+ /*len%=*/.1, wal_file_id, trunc);
1275
+ // verify
1276
+ options.wal_recovery_mode = WALRecoveryMode::kAbsoluteConsistency;
1277
+ options.create_if_missing = false;
1278
+ ASSERT_NOK(TryReopen(options));
1279
+ }
1280
+
1281
+ // Test scope:
1282
+ // We don't expect the data store to be opened if there is any inconsistency
1283
+ // between WAL and SST files
1284
+ TEST_F(DBWALTest, kPointInTimeRecoveryCFConsistency) {
1285
+ Options options = CurrentOptions();
1286
+ options.avoid_flush_during_recovery = true;
1287
+
1288
+ // Create DB with multiple column families.
1289
+ CreateAndReopenWithCF({"one", "two"}, options);
1290
+ ASSERT_OK(Put(1, "key1", "val1"));
1291
+ ASSERT_OK(Put(2, "key2", "val2"));
1292
+
1293
+ // Record the offset at this point
1294
+ Env* env = options.env;
1295
+ uint64_t wal_file_id = dbfull()->TEST_LogfileNumber();
1296
+ std::string fname = LogFileName(dbname_, wal_file_id);
1297
+ uint64_t offset_to_corrupt;
1298
+ ASSERT_OK(env->GetFileSize(fname, &offset_to_corrupt));
1299
+ ASSERT_GT(offset_to_corrupt, 0);
1300
+
1301
+ ASSERT_OK(Put(1, "key3", "val3"));
1302
+ // Corrupt WAL at location of key3
1303
+ ASSERT_OK(test::CorruptFile(env, fname, static_cast<int>(offset_to_corrupt),
1304
+ 4, false));
1305
+ ASSERT_OK(Put(2, "key4", "val4"));
1306
+ ASSERT_OK(Put(1, "key5", "val5"));
1307
+ ASSERT_OK(Flush(2));
1308
+
1309
+ // PIT recovery & verify
1310
+ options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
1311
+ ASSERT_NOK(TryReopenWithColumnFamilies({"default", "one", "two"}, options));
1312
+ }
1313
+
1314
+ // Test scope:
1315
+ // - We expect to open data store under all circumstances
1316
+ // - We expect only data upto the point where the first error was encountered
1317
+ TEST_P(DBWALTestWithParams, kPointInTimeRecovery) {
1318
+ const int maxkeys =
1319
+ RecoveryTestHelper::kWALFilesCount * RecoveryTestHelper::kKeysPerWALFile;
1320
+
1321
+ bool trunc = std::get<0>(GetParam()); // Corruption style
1322
+ // Corruption offset position
1323
+ int corrupt_offset = std::get<1>(GetParam());
1324
+ int wal_file_id = std::get<2>(GetParam()); // WAL file
1325
+
1326
+ // Fill data for testing
1327
+ Options options = CurrentOptions();
1328
+ const size_t row_count = RecoveryTestHelper::FillData(this, &options);
1329
+
1330
+ // Corrupt the wal
1331
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1332
+ /*len%=*/.1, wal_file_id, trunc);
1333
+
1334
+ // Verify
1335
+ options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
1336
+ options.create_if_missing = false;
1337
+ ASSERT_OK(TryReopen(options));
1338
+
1339
+ // Probe data for invariants
1340
+ size_t recovered_row_count = RecoveryTestHelper::GetData(this);
1341
+ ASSERT_LT(recovered_row_count, row_count);
1342
+
1343
+ // Verify a prefix of keys were recovered. But not in the case of full WAL
1344
+ // truncation, because we have no way to know there was a corruption when
1345
+ // truncation happened on record boundaries (preventing recovery holes in
1346
+ // that case requires using `track_and_verify_wals_in_manifest`).
1347
+ if (!trunc || corrupt_offset != 0) {
1348
+ bool expect_data = true;
1349
+ for (size_t k = 0; k < maxkeys; ++k) {
1350
+ bool found = Get("key" + ToString(k)) != "NOT_FOUND";
1351
+ if (expect_data && !found) {
1352
+ expect_data = false;
1353
+ }
1354
+ ASSERT_EQ(found, expect_data);
1355
+ }
1356
+ }
1357
+
1358
+ const size_t min = RecoveryTestHelper::kKeysPerWALFile *
1359
+ (wal_file_id - RecoveryTestHelper::kWALFileOffset);
1360
+ ASSERT_GE(recovered_row_count, min);
1361
+ if (!trunc && corrupt_offset != 0) {
1362
+ const size_t max = RecoveryTestHelper::kKeysPerWALFile *
1363
+ (wal_file_id - RecoveryTestHelper::kWALFileOffset + 1);
1364
+ ASSERT_LE(recovered_row_count, max);
1365
+ }
1366
+ }
1367
+
1368
+ // Test scope:
1369
+ // - We expect to open the data store under all scenarios
1370
+ // - We expect to have recovered records past the corruption zone
1371
+ TEST_P(DBWALTestWithParams, kSkipAnyCorruptedRecords) {
1372
+ bool trunc = std::get<0>(GetParam()); // Corruption style
1373
+ // Corruption offset position
1374
+ int corrupt_offset = std::get<1>(GetParam());
1375
+ int wal_file_id = std::get<2>(GetParam()); // WAL file
1376
+
1377
+ // Fill data for testing
1378
+ Options options = CurrentOptions();
1379
+ const size_t row_count = RecoveryTestHelper::FillData(this, &options);
1380
+
1381
+ // Corrupt the WAL
1382
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1383
+ /*len%=*/.1, wal_file_id, trunc);
1384
+
1385
+ // Verify behavior
1386
+ options.wal_recovery_mode = WALRecoveryMode::kSkipAnyCorruptedRecords;
1387
+ options.create_if_missing = false;
1388
+ ASSERT_OK(TryReopen(options));
1389
+
1390
+ // Probe data for invariants
1391
+ size_t recovered_row_count = RecoveryTestHelper::GetData(this);
1392
+ ASSERT_LT(recovered_row_count, row_count);
1393
+
1394
+ if (!trunc) {
1395
+ ASSERT_TRUE(corrupt_offset != 0 || recovered_row_count > 0);
1396
+ }
1397
+ }
1398
+
1399
+ TEST_F(DBWALTest, AvoidFlushDuringRecovery) {
1400
+ Options options = CurrentOptions();
1401
+ options.disable_auto_compactions = true;
1402
+ options.avoid_flush_during_recovery = false;
1403
+
1404
+ // Test with flush after recovery.
1405
+ Reopen(options);
1406
+ ASSERT_OK(Put("foo", "v1"));
1407
+ ASSERT_OK(Put("bar", "v2"));
1408
+ ASSERT_OK(Flush());
1409
+ ASSERT_OK(Put("foo", "v3"));
1410
+ ASSERT_OK(Put("bar", "v4"));
1411
+ ASSERT_EQ(1, TotalTableFiles());
1412
+ // Reopen DB. Check if WAL logs flushed.
1413
+ Reopen(options);
1414
+ ASSERT_EQ("v3", Get("foo"));
1415
+ ASSERT_EQ("v4", Get("bar"));
1416
+ ASSERT_EQ(2, TotalTableFiles());
1417
+
1418
+ // Test without flush after recovery.
1419
+ options.avoid_flush_during_recovery = true;
1420
+ DestroyAndReopen(options);
1421
+ ASSERT_OK(Put("foo", "v5"));
1422
+ ASSERT_OK(Put("bar", "v6"));
1423
+ ASSERT_OK(Flush());
1424
+ ASSERT_OK(Put("foo", "v7"));
1425
+ ASSERT_OK(Put("bar", "v8"));
1426
+ ASSERT_EQ(1, TotalTableFiles());
1427
+ // Reopen DB. WAL logs should not be flushed this time.
1428
+ Reopen(options);
1429
+ ASSERT_EQ("v7", Get("foo"));
1430
+ ASSERT_EQ("v8", Get("bar"));
1431
+ ASSERT_EQ(1, TotalTableFiles());
1432
+
1433
+ // Force flush with allow_2pc.
1434
+ options.avoid_flush_during_recovery = true;
1435
+ options.allow_2pc = true;
1436
+ ASSERT_OK(Put("foo", "v9"));
1437
+ ASSERT_OK(Put("bar", "v10"));
1438
+ ASSERT_OK(Flush());
1439
+ ASSERT_OK(Put("foo", "v11"));
1440
+ ASSERT_OK(Put("bar", "v12"));
1441
+ Reopen(options);
1442
+ ASSERT_EQ("v11", Get("foo"));
1443
+ ASSERT_EQ("v12", Get("bar"));
1444
+ ASSERT_EQ(3, TotalTableFiles());
1445
+ }
1446
+
1447
+ TEST_F(DBWALTest, WalCleanupAfterAvoidFlushDuringRecovery) {
1448
+ // Verifies WAL files that were present during recovery, but not flushed due
1449
+ // to avoid_flush_during_recovery, will be considered for deletion at a later
1450
+ // stage. We check at least one such file is deleted during Flush().
1451
+ Options options = CurrentOptions();
1452
+ options.disable_auto_compactions = true;
1453
+ options.avoid_flush_during_recovery = true;
1454
+ Reopen(options);
1455
+
1456
+ ASSERT_OK(Put("foo", "v1"));
1457
+ Reopen(options);
1458
+ for (int i = 0; i < 2; ++i) {
1459
+ if (i > 0) {
1460
+ // Flush() triggers deletion of obsolete tracked files
1461
+ ASSERT_OK(Flush());
1462
+ }
1463
+ VectorLogPtr log_files;
1464
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files));
1465
+ if (i == 0) {
1466
+ ASSERT_GT(log_files.size(), 0);
1467
+ } else {
1468
+ ASSERT_EQ(0, log_files.size());
1469
+ }
1470
+ }
1471
+ }
1472
+
1473
+ TEST_F(DBWALTest, RecoverWithoutFlush) {
1474
+ Options options = CurrentOptions();
1475
+ options.avoid_flush_during_recovery = true;
1476
+ options.create_if_missing = false;
1477
+ options.disable_auto_compactions = true;
1478
+ options.write_buffer_size = 64 * 1024 * 1024;
1479
+
1480
+ size_t count = RecoveryTestHelper::FillData(this, &options);
1481
+ auto validateData = [this, count]() {
1482
+ for (size_t i = 0; i < count; i++) {
1483
+ ASSERT_NE(Get("key" + ToString(i)), "NOT_FOUND");
1484
+ }
1485
+ };
1486
+ Reopen(options);
1487
+ validateData();
1488
+ // Insert some data without flush
1489
+ ASSERT_OK(Put("foo", "foo_v1"));
1490
+ ASSERT_OK(Put("bar", "bar_v1"));
1491
+ Reopen(options);
1492
+ validateData();
1493
+ ASSERT_EQ(Get("foo"), "foo_v1");
1494
+ ASSERT_EQ(Get("bar"), "bar_v1");
1495
+ // Insert again and reopen
1496
+ ASSERT_OK(Put("foo", "foo_v2"));
1497
+ ASSERT_OK(Put("bar", "bar_v2"));
1498
+ Reopen(options);
1499
+ validateData();
1500
+ ASSERT_EQ(Get("foo"), "foo_v2");
1501
+ ASSERT_EQ(Get("bar"), "bar_v2");
1502
+ // manual flush and insert again
1503
+ ASSERT_OK(Flush());
1504
+ ASSERT_EQ(Get("foo"), "foo_v2");
1505
+ ASSERT_EQ(Get("bar"), "bar_v2");
1506
+ ASSERT_OK(Put("foo", "foo_v3"));
1507
+ ASSERT_OK(Put("bar", "bar_v3"));
1508
+ Reopen(options);
1509
+ validateData();
1510
+ ASSERT_EQ(Get("foo"), "foo_v3");
1511
+ ASSERT_EQ(Get("bar"), "bar_v3");
1512
+ }
1513
+
1514
+ TEST_F(DBWALTest, RecoverWithoutFlushMultipleCF) {
1515
+ const std::string kSmallValue = "v";
1516
+ const std::string kLargeValue = DummyString(1024);
1517
+ Options options = CurrentOptions();
1518
+ options.avoid_flush_during_recovery = true;
1519
+ options.create_if_missing = false;
1520
+ options.disable_auto_compactions = true;
1521
+
1522
+ auto countWalFiles = [this]() {
1523
+ VectorLogPtr log_files;
1524
+ if (!dbfull()->GetSortedWalFiles(log_files).ok()) {
1525
+ return size_t{0};
1526
+ }
1527
+ return log_files.size();
1528
+ };
1529
+
1530
+ // Create DB with multiple column families and multiple log files.
1531
+ CreateAndReopenWithCF({"one", "two"}, options);
1532
+ ASSERT_OK(Put(0, "key1", kSmallValue));
1533
+ ASSERT_OK(Put(1, "key2", kLargeValue));
1534
+ ASSERT_OK(Flush(1));
1535
+ ASSERT_EQ(1, countWalFiles());
1536
+ ASSERT_OK(Put(0, "key3", kSmallValue));
1537
+ ASSERT_OK(Put(2, "key4", kLargeValue));
1538
+ ASSERT_OK(Flush(2));
1539
+ ASSERT_EQ(2, countWalFiles());
1540
+
1541
+ // Reopen, insert and flush.
1542
+ options.db_write_buffer_size = 64 * 1024 * 1024;
1543
+ ReopenWithColumnFamilies({"default", "one", "two"}, options);
1544
+ ASSERT_EQ(Get(0, "key1"), kSmallValue);
1545
+ ASSERT_EQ(Get(1, "key2"), kLargeValue);
1546
+ ASSERT_EQ(Get(0, "key3"), kSmallValue);
1547
+ ASSERT_EQ(Get(2, "key4"), kLargeValue);
1548
+ // Insert more data.
1549
+ ASSERT_OK(Put(0, "key5", kLargeValue));
1550
+ ASSERT_OK(Put(1, "key6", kLargeValue));
1551
+ ASSERT_EQ(3, countWalFiles());
1552
+ ASSERT_OK(Flush(1));
1553
+ ASSERT_OK(Put(2, "key7", kLargeValue));
1554
+ ASSERT_OK(dbfull()->FlushWAL(false));
1555
+ ASSERT_EQ(4, countWalFiles());
1556
+
1557
+ // Reopen twice and validate.
1558
+ for (int i = 0; i < 2; i++) {
1559
+ ReopenWithColumnFamilies({"default", "one", "two"}, options);
1560
+ ASSERT_EQ(Get(0, "key1"), kSmallValue);
1561
+ ASSERT_EQ(Get(1, "key2"), kLargeValue);
1562
+ ASSERT_EQ(Get(0, "key3"), kSmallValue);
1563
+ ASSERT_EQ(Get(2, "key4"), kLargeValue);
1564
+ ASSERT_EQ(Get(0, "key5"), kLargeValue);
1565
+ ASSERT_EQ(Get(1, "key6"), kLargeValue);
1566
+ ASSERT_EQ(Get(2, "key7"), kLargeValue);
1567
+ ASSERT_EQ(4, countWalFiles());
1568
+ }
1569
+ }
1570
+
1571
+ // In this test we are trying to do the following:
1572
+ // 1. Create a DB with corrupted WAL log;
1573
+ // 2. Open with avoid_flush_during_recovery = true;
1574
+ // 3. Append more data without flushing, which creates new WAL log.
1575
+ // 4. Open again. See if it can correctly handle previous corruption.
1576
+ TEST_P(DBWALTestWithParamsVaryingRecoveryMode,
1577
+ RecoverFromCorruptedWALWithoutFlush) {
1578
+ const int kAppendKeys = 100;
1579
+ Options options = CurrentOptions();
1580
+ options.avoid_flush_during_recovery = true;
1581
+ options.create_if_missing = false;
1582
+ options.disable_auto_compactions = true;
1583
+ options.write_buffer_size = 64 * 1024 * 1024;
1584
+
1585
+ auto getAll = [this]() {
1586
+ std::vector<std::pair<std::string, std::string>> data;
1587
+ ReadOptions ropt;
1588
+ Iterator* iter = dbfull()->NewIterator(ropt);
1589
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1590
+ data.push_back(
1591
+ std::make_pair(iter->key().ToString(), iter->value().ToString()));
1592
+ }
1593
+ delete iter;
1594
+ return data;
1595
+ };
1596
+
1597
+ bool trunc = std::get<0>(GetParam()); // Corruption style
1598
+ // Corruption offset position
1599
+ int corrupt_offset = std::get<1>(GetParam());
1600
+ int wal_file_id = std::get<2>(GetParam()); // WAL file
1601
+ WALRecoveryMode recovery_mode = std::get<3>(GetParam());
1602
+
1603
+ options.wal_recovery_mode = recovery_mode;
1604
+ // Create corrupted WAL
1605
+ RecoveryTestHelper::FillData(this, &options);
1606
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1607
+ /*len%=*/.1, wal_file_id, trunc);
1608
+ // Skip the test if DB won't open.
1609
+ if (!TryReopen(options).ok()) {
1610
+ ASSERT_TRUE(options.wal_recovery_mode ==
1611
+ WALRecoveryMode::kAbsoluteConsistency ||
1612
+ (!trunc && options.wal_recovery_mode ==
1613
+ WALRecoveryMode::kTolerateCorruptedTailRecords));
1614
+ return;
1615
+ }
1616
+ ASSERT_OK(TryReopen(options));
1617
+ // Append some more data.
1618
+ for (int k = 0; k < kAppendKeys; k++) {
1619
+ std::string key = "extra_key" + ToString(k);
1620
+ std::string value = DummyString(RecoveryTestHelper::kValueSize);
1621
+ ASSERT_OK(Put(key, value));
1622
+ }
1623
+ // Save data for comparison.
1624
+ auto data = getAll();
1625
+ // Reopen. Verify data.
1626
+ ASSERT_OK(TryReopen(options));
1627
+ auto actual_data = getAll();
1628
+ ASSERT_EQ(data, actual_data);
1629
+ }
1630
+
1631
+ // Tests that total log size is recovered if we set
1632
+ // avoid_flush_during_recovery=true.
1633
+ // Flush should trigger if max_total_wal_size is reached.
1634
+ TEST_F(DBWALTest, RestoreTotalLogSizeAfterRecoverWithoutFlush) {
1635
+ class TestFlushListener : public EventListener {
1636
+ public:
1637
+ std::atomic<int> count{0};
1638
+
1639
+ TestFlushListener() = default;
1640
+
1641
+ void OnFlushBegin(DB* /*db*/, const FlushJobInfo& flush_job_info) override {
1642
+ count++;
1643
+ ASSERT_EQ(FlushReason::kWriteBufferManager, flush_job_info.flush_reason);
1644
+ }
1645
+ };
1646
+ std::shared_ptr<TestFlushListener> test_listener =
1647
+ std::make_shared<TestFlushListener>();
1648
+
1649
+ constexpr size_t kKB = 1024;
1650
+ constexpr size_t kMB = 1024 * 1024;
1651
+ Options options = CurrentOptions();
1652
+ options.avoid_flush_during_recovery = true;
1653
+ options.max_total_wal_size = 1 * kMB;
1654
+ options.listeners.push_back(test_listener);
1655
+ // Have to open DB in multi-CF mode to trigger flush when
1656
+ // max_total_wal_size is reached.
1657
+ CreateAndReopenWithCF({"one"}, options);
1658
+ // Write some keys and we will end up with one log file which is slightly
1659
+ // smaller than 1MB.
1660
+ std::string value_100k(100 * kKB, 'v');
1661
+ std::string value_300k(300 * kKB, 'v');
1662
+ ASSERT_OK(Put(0, "foo", "v1"));
1663
+ for (int i = 0; i < 9; i++) {
1664
+ ASSERT_OK(Put(1, "key" + ToString(i), value_100k));
1665
+ }
1666
+ // Get log files before reopen.
1667
+ VectorLogPtr log_files_before;
1668
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files_before));
1669
+ ASSERT_EQ(1, log_files_before.size());
1670
+ uint64_t log_size_before = log_files_before[0]->SizeFileBytes();
1671
+ ASSERT_GT(log_size_before, 900 * kKB);
1672
+ ASSERT_LT(log_size_before, 1 * kMB);
1673
+ ReopenWithColumnFamilies({"default", "one"}, options);
1674
+ // Write one more value to make log larger than 1MB.
1675
+ ASSERT_OK(Put(1, "bar", value_300k));
1676
+ // Get log files again. A new log file will be opened.
1677
+ VectorLogPtr log_files_after_reopen;
1678
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files_after_reopen));
1679
+ ASSERT_EQ(2, log_files_after_reopen.size());
1680
+ ASSERT_EQ(log_files_before[0]->LogNumber(),
1681
+ log_files_after_reopen[0]->LogNumber());
1682
+ ASSERT_GT(log_files_after_reopen[0]->SizeFileBytes() +
1683
+ log_files_after_reopen[1]->SizeFileBytes(),
1684
+ 1 * kMB);
1685
+ // Write one more key to trigger flush.
1686
+ ASSERT_OK(Put(0, "foo", "v2"));
1687
+ for (auto* h : handles_) {
1688
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(h));
1689
+ }
1690
+ // Flushed two column families.
1691
+ ASSERT_EQ(2, test_listener->count.load());
1692
+ }
1693
+
1694
+ #if defined(ROCKSDB_PLATFORM_POSIX)
1695
+ #if defined(ROCKSDB_FALLOCATE_PRESENT)
1696
+ // Tests that we will truncate the preallocated space of the last log from
1697
+ // previous.
1698
+ TEST_F(DBWALTest, TruncateLastLogAfterRecoverWithoutFlush) {
1699
+ constexpr size_t kKB = 1024;
1700
+ Options options = CurrentOptions();
1701
+ options.env = env_;
1702
+ options.avoid_flush_during_recovery = true;
1703
+ if (mem_env_) {
1704
+ ROCKSDB_GTEST_SKIP("Test requires non-mem environment");
1705
+ return;
1706
+ }
1707
+ // Test fallocate support of running file system.
1708
+ // Skip this test if fallocate is not supported.
1709
+ std::string fname_test_fallocate = dbname_ + "/preallocate_testfile";
1710
+ int fd = -1;
1711
+ do {
1712
+ fd = open(fname_test_fallocate.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
1713
+ } while (fd < 0 && errno == EINTR);
1714
+ ASSERT_GT(fd, 0);
1715
+ int alloc_status = fallocate(fd, 0, 0, 1);
1716
+ int err_number = errno;
1717
+ close(fd);
1718
+ ASSERT_OK(options.env->DeleteFile(fname_test_fallocate));
1719
+ if (err_number == ENOSYS || err_number == EOPNOTSUPP) {
1720
+ fprintf(stderr, "Skipped preallocated space check: %s\n", strerror(err_number));
1721
+ return;
1722
+ }
1723
+ ASSERT_EQ(0, alloc_status);
1724
+
1725
+ DestroyAndReopen(options);
1726
+ size_t preallocated_size =
1727
+ dbfull()->TEST_GetWalPreallocateBlockSize(options.write_buffer_size);
1728
+ ASSERT_OK(Put("foo", "v1"));
1729
+ VectorLogPtr log_files_before;
1730
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files_before));
1731
+ ASSERT_EQ(1, log_files_before.size());
1732
+ auto& file_before = log_files_before[0];
1733
+ ASSERT_LT(file_before->SizeFileBytes(), 1 * kKB);
1734
+ // The log file has preallocated space.
1735
+ ASSERT_GE(GetAllocatedFileSize(dbname_ + file_before->PathName()),
1736
+ preallocated_size);
1737
+ Reopen(options);
1738
+ VectorLogPtr log_files_after;
1739
+ ASSERT_OK(dbfull()->GetSortedWalFiles(log_files_after));
1740
+ ASSERT_EQ(1, log_files_after.size());
1741
+ ASSERT_LT(log_files_after[0]->SizeFileBytes(), 1 * kKB);
1742
+ // The preallocated space should be truncated.
1743
+ ASSERT_LT(GetAllocatedFileSize(dbname_ + file_before->PathName()),
1744
+ preallocated_size);
1745
+ }
1746
+ #endif // ROCKSDB_FALLOCATE_PRESENT
1747
+ #endif // ROCKSDB_PLATFORM_POSIX
1748
+
1749
+ #endif // ROCKSDB_LITE
1750
+
1751
+ TEST_F(DBWALTest, WalTermTest) {
1752
+ Options options = CurrentOptions();
1753
+ options.env = env_;
1754
+ CreateAndReopenWithCF({"pikachu"}, options);
1755
+
1756
+ ASSERT_OK(Put(1, "foo", "bar"));
1757
+
1758
+ WriteOptions wo;
1759
+ wo.sync = true;
1760
+ wo.disableWAL = false;
1761
+
1762
+ WriteBatch batch;
1763
+ ASSERT_OK(batch.Put("foo", "bar"));
1764
+ batch.MarkWalTerminationPoint();
1765
+ ASSERT_OK(batch.Put("foo2", "bar2"));
1766
+
1767
+ ASSERT_OK(dbfull()->Write(wo, &batch));
1768
+
1769
+ // make sure we can re-open it.
1770
+ ASSERT_OK(TryReopenWithColumnFamilies({"default", "pikachu"}, options));
1771
+ ASSERT_EQ("bar", Get(1, "foo"));
1772
+ ASSERT_EQ("NOT_FOUND", Get(1, "foo2"));
1773
+ }
1774
+ } // namespace ROCKSDB_NAMESPACE
1775
+
1776
+ int main(int argc, char** argv) {
1777
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
1778
+ ::testing::InitGoogleTest(&argc, argv);
1779
+ return RUN_ALL_TESTS();
1780
+ }