@nxtedition/rocksdb 6.0.1 → 6.0.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 (310) hide show
  1. package/BUILDING.md +2 -2
  2. package/binding.cc +14 -17
  3. package/deps/rocksdb/build_version.cc +4 -10
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
  5. package/deps/rocksdb/rocksdb/Makefile +57 -86
  6. package/deps/rocksdb/rocksdb/TARGETS +4 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
  8. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
  12. package/deps/rocksdb/rocksdb/common.mk +30 -0
  13. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  14. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  15. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  16. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  17. package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
  18. package/deps/rocksdb/rocksdb/db/c.cc +45 -0
  19. package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
  20. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
  21. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  22. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
  36. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  38. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  39. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  40. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  42. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  43. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  44. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  45. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
  54. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  55. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  56. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  57. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  58. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  59. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  60. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  61. package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
  62. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  63. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  64. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
  65. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
  66. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  67. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
  72. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  74. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
  75. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  76. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  77. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  78. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  79. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
  80. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
  81. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  82. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  83. package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
  84. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  85. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  86. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  87. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
  88. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  89. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  90. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  91. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  93. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  94. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  95. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  96. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  97. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  98. package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
  99. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  100. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
  101. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  102. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
  103. package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
  104. package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
  105. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  106. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  107. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  108. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  110. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  111. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  120. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
  121. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  122. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  123. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  124. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  125. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  126. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  127. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  128. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  129. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  130. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  131. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  132. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  133. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  134. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  135. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  136. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
  137. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  138. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  139. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  140. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
  141. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
  142. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  144. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  145. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  148. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  149. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  150. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  151. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
  152. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  153. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  154. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  155. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  157. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
  159. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  160. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  162. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  163. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  164. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  165. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  166. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  167. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  168. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  169. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  170. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  171. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  172. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  173. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
  174. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  175. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  176. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  177. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  178. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  179. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  180. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  181. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  182. package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
  183. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  184. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  185. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  186. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  187. package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
  188. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  189. package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
  190. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  191. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
  192. package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
  193. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  194. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  195. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  196. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  197. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  198. package/deps/rocksdb/rocksdb/src.mk +2 -0
  199. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  200. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  201. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  202. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  203. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
  204. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  205. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
  206. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
  208. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
  209. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  210. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  211. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  212. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  213. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  214. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  215. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
  217. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
  218. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  219. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
  220. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  221. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  222. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  223. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  224. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  225. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  226. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  227. package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
  228. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  229. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  230. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  231. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  232. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  233. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  234. package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
  235. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
  236. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
  237. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  238. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  239. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  240. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  241. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  242. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
  243. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  244. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  246. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  247. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  248. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  249. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
  250. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  251. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  252. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  253. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  254. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  255. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  256. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  257. package/deps/rocksdb/rocksdb/util/compression.h +7 -7
  258. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  259. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  260. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  261. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  262. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  263. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  264. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  265. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  266. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  267. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  268. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  269. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  270. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  271. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  272. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  273. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  274. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  275. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  276. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  277. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  278. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  279. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  280. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  281. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  282. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  283. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  284. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  285. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  286. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  287. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  288. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  289. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  290. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  291. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  292. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  293. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  294. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  295. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  296. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  297. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  298. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  299. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  300. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  301. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  302. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  303. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  304. package/deps/rocksdb/rocksdb.gyp +8 -2
  305. package/package.json +1 -1
  306. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  307. package/prebuilds/linux-x64/node.napi.node +0 -0
  308. package/deps/rocksdb/rocksdb/python.mk +0 -9
  309. package/prebuilds/darwin-x64/node.napi.node +0 -0
  310. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -397,7 +397,7 @@ TEST_P(ComparatorDBTest, DoubleComparator) {
397
397
  for (uint32_t j = 0; j < divide_order; j++) {
398
398
  to_divide *= 10.0;
399
399
  }
400
- source_strings.push_back(ToString(r / to_divide));
400
+ source_strings.push_back(std::to_string(r / to_divide));
401
401
  }
402
402
 
403
403
  DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 200, 1000, 66);
@@ -40,7 +40,8 @@ Status VerifySstFileChecksum(const Options& options,
40
40
  Status VerifySstFileChecksum(const Options& options,
41
41
  const EnvOptions& env_options,
42
42
  const ReadOptions& read_options,
43
- const std::string& file_path) {
43
+ const std::string& file_path,
44
+ const SequenceNumber& largest_seqno) {
44
45
  std::unique_ptr<FSRandomAccessFile> file;
45
46
  uint64_t file_size;
46
47
  InternalKeyComparator internal_comparator(options.comparator);
@@ -61,12 +62,13 @@ Status VerifySstFileChecksum(const Options& options,
61
62
  nullptr /* stats */, 0 /* hist_type */, nullptr /* file_read_hist */,
62
63
  ioptions.rate_limiter.get()));
63
64
  const bool kImmortal = true;
65
+ auto reader_options = TableReaderOptions(
66
+ ioptions, options.prefix_extractor, env_options, internal_comparator,
67
+ false /* skip_filters */, !kImmortal, false /* force_direct_prefetch */,
68
+ -1 /* level */);
69
+ reader_options.largest_seqno = largest_seqno;
64
70
  s = ioptions.table_factory->NewTableReader(
65
- TableReaderOptions(ioptions, options.prefix_extractor, env_options,
66
- internal_comparator, false /* skip_filters */,
67
- !kImmortal, false /* force_direct_prefetch */,
68
- -1 /* level */),
69
- std::move(file_reader), file_size, &table_reader,
71
+ reader_options, std::move(file_reader), file_size, &table_reader,
70
72
  false /* prefetch_index_and_filter_in_cache */);
71
73
  if (!s.ok()) {
72
74
  return s;
@@ -308,7 +308,7 @@ class CorruptionTest : public testing::Test {
308
308
  uint64_t new_size = old_size - bytes_to_truncate;
309
309
  // If bytes_to_truncate == 0, it will do full truncation.
310
310
  if (bytes_to_truncate == 0) {
311
- new_size = old_size;
311
+ new_size = 0;
312
312
  }
313
313
  ASSERT_OK(test::TruncateFile(env_, path, new_size));
314
314
  }
@@ -354,6 +354,7 @@ TEST_F(CorruptionTest, PostPITRCorruptionWALsRetained) {
354
354
  options_.create_missing_column_families = true;
355
355
  std::vector<ColumnFamilyHandle*> cfhs;
356
356
  ASSERT_OK(DB::Open(options_, dbname_, cf_descs, &cfhs, &db_));
357
+ assert(db_ != nullptr); // suppress false clang-analyze report
357
358
 
358
359
  ASSERT_OK(db_->Put(WriteOptions(), cfhs[0], "k", "v"));
359
360
  ASSERT_OK(db_->Put(WriteOptions(), cfhs[1], "k", "v"));
@@ -375,6 +376,8 @@ TEST_F(CorruptionTest, PostPITRCorruptionWALsRetained) {
375
376
  options_.avoid_flush_during_recovery = true;
376
377
  std::vector<ColumnFamilyHandle*> cfhs;
377
378
  ASSERT_OK(DB::Open(options_, dbname_, cf_descs, &cfhs, &db_));
379
+ assert(db_ != nullptr); // suppress false clang-analyze report
380
+
378
381
  // Flush one but not both CFs and write some data so there's a seqno gap
379
382
  // between the PITR corruption and the next DB session's first WAL.
380
383
  ASSERT_OK(db_->Put(WriteOptions(), cfhs[1], "k2", "v2"));
@@ -391,6 +394,7 @@ TEST_F(CorruptionTest, PostPITRCorruptionWALsRetained) {
391
394
  for (int i = 0; i < 2; ++i) {
392
395
  std::vector<ColumnFamilyHandle*> cfhs;
393
396
  ASSERT_OK(DB::Open(options_, dbname_, cf_descs, &cfhs, &db_));
397
+ assert(db_ != nullptr); // suppress false clang-analyze report
394
398
 
395
399
  for (auto* cfh : cfhs) {
396
400
  delete cfh;
@@ -1045,16 +1049,23 @@ INSTANTIATE_TEST_CASE_P(CorruptionTest, CrashDuringRecoveryWithCorruptionTest,
1045
1049
  // "Column family inconsistency: SST file contains data beyond the point of
1046
1050
  // corruption" error will be hit, causing recovery to fail.
1047
1051
  //
1048
- // After adding the fix, corrupted WALs whose numbers are larger than the
1049
- // corrupted wal and smaller than the new WAL are moved to a separate folder.
1050
- // Only after new WAL is synced, RocksDB persist a new MANIFEST with column
1051
- // families to ensure RocksDB is in consistent state.
1052
+ // After adding the fix, only after new WAL is synced, RocksDB persist a new
1053
+ // MANIFEST with column families to ensure RocksDB is in consistent state.
1052
1054
  // RocksDB writes an empty WriteBatch as a sentinel to the new WAL which is
1053
1055
  // synced immediately afterwards. The sequence number of the sentinel
1054
1056
  // WriteBatch will be the next sequence number immediately after the largest
1055
1057
  // sequence number recovered from previous WALs and MANIFEST because of which DB
1056
1058
  // will be in consistent state.
1057
- TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1059
+ // If a future recovery starts from the new MANIFEST, then it means the new WAL
1060
+ // is successfully synced. Due to the sentinel empty write batch at the
1061
+ // beginning, kPointInTimeRecovery of WAL is guaranteed to go after this point.
1062
+ // If future recovery starts from the old MANIFEST, it means the writing the new
1063
+ // MANIFEST failed. It won't have the "SST ahead of WAL" error.
1064
+ //
1065
+ // The combination of corrupting a WAL and injecting an error during subsequent
1066
+ // re-open exposes the bug of prematurely persisting a new MANIFEST with
1067
+ // advanced ColumnFamilyData::log_number.
1068
+ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
1058
1069
  CloseDb();
1059
1070
  Options options;
1060
1071
  options.track_and_verify_wals_in_manifest =
@@ -1064,7 +1075,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1064
1075
  options.env = env_;
1065
1076
  ASSERT_OK(DestroyDB(dbname_, options));
1066
1077
  options.create_if_missing = true;
1067
- options.max_write_buffer_number = 3;
1078
+ options.max_write_buffer_number = 8;
1068
1079
 
1069
1080
  Reopen(&options);
1070
1081
  Status s;
@@ -1090,13 +1101,15 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1090
1101
 
1091
1102
  // Write one key to test_cf.
1092
1103
  ASSERT_OK(db_->Put(WriteOptions(), handles[1], "old_key", "dontcare"));
1104
+ ASSERT_OK(db_->Flush(FlushOptions(), handles[1]));
1105
+
1093
1106
  // Write to default_cf and flush this cf several times to advance wal
1094
- // number.
1107
+ // number. TEST_SwitchMemtable makes sure WALs are not synced and test can
1108
+ // corrupt un-sync WAL.
1095
1109
  for (int i = 0; i < 2; ++i) {
1096
1110
  ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i), "value"));
1097
1111
  ASSERT_OK(dbimpl->TEST_SwitchMemtable());
1098
1112
  }
1099
- ASSERT_OK(db_->Put(WriteOptions(), handles[1], "dontcare", "dontcare"));
1100
1113
 
1101
1114
  for (auto* h : handles) {
1102
1115
  delete h;
@@ -1105,12 +1118,13 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1105
1118
  CloseDb();
1106
1119
  }
1107
1120
 
1108
- // 2. Corrupt second last wal file to emulate power reset which caused the DB
1109
- // to lose the un-synced WAL.
1121
+ // 2. Corrupt second last un-syned wal file to emulate power reset which
1122
+ // caused the DB to lose the un-synced WAL.
1110
1123
  {
1111
1124
  std::vector<uint64_t> file_nums;
1112
1125
  GetSortedWalFiles(file_nums);
1113
1126
  size_t size = file_nums.size();
1127
+ assert(size >= 2);
1114
1128
  uint64_t log_num = file_nums[size - 2];
1115
1129
  CorruptFileWithTruncation(FileType::kWalFile, log_num,
1116
1130
  /*bytes_to_truncate=*/8);
@@ -1127,25 +1141,31 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1127
1141
  // Case2: If avoid_flush_during_recovery = false, all column families have
1128
1142
  // flushed their data from WAL to L0 during recovery, and none of them will
1129
1143
  // ever need to read the WALs again.
1144
+
1145
+ // 4. Fault is injected to fail the recovery.
1130
1146
  {
1131
- options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1147
+ SyncPoint::GetInstance()->DisableProcessing();
1148
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1149
+ SyncPoint::GetInstance()->SetCallBack(
1150
+ "DBImpl::GetLogSizeAndMaybeTruncate:0", [&](void* arg) {
1151
+ auto* tmp_s = reinterpret_cast<Status*>(arg);
1152
+ assert(tmp_s);
1153
+ *tmp_s = Status::IOError("Injected");
1154
+ });
1155
+ SyncPoint::GetInstance()->EnableProcessing();
1156
+
1157
+ handles.clear();
1158
+ options.avoid_flush_during_recovery = true;
1132
1159
  s = DB::Open(options, dbname_, cf_descs, &handles, &db_);
1133
- ASSERT_OK(s);
1160
+ ASSERT_TRUE(s.IsIOError());
1161
+ ASSERT_EQ("IO error: Injected", s.ToString());
1134
1162
  for (auto* h : handles) {
1135
1163
  delete h;
1136
1164
  }
1137
- handles.clear();
1138
1165
  CloseDb();
1139
- }
1140
1166
 
1141
- // 4. Corrupt max_wal_num to emulate second power reset which caused the
1142
- // DB to again lose the un-synced WAL.
1143
- {
1144
- std::vector<uint64_t> file_nums;
1145
- GetSortedWalFiles(file_nums);
1146
- size_t size = file_nums.size();
1147
- uint64_t log_num = file_nums[size - 1];
1148
- CorruptFileWithTruncation(FileType::kWalFile, log_num);
1167
+ SyncPoint::GetInstance()->DisableProcessing();
1168
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1149
1169
  }
1150
1170
 
1151
1171
  // 5. After second crash reopen the db with second corruption. Default family
@@ -1183,16 +1203,24 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1183
1203
  // file contains data beyond the point of corruption" error will be hit, causing
1184
1204
  // recovery to fail.
1185
1205
  //
1186
- // After adding the fix, corrupted WALs whose numbers are larger than the
1187
- // corrupted wal and smaller than the new WAL are moved to a separate folder.
1188
- // Only after new WAL is synced, RocksDB persist a new MANIFEST with column
1189
- // families to ensure RocksDB is in consistent state.
1206
+ // After adding the fix, only after new WAL is synced, RocksDB persist a new
1207
+ // MANIFEST with column families to ensure RocksDB is in consistent state.
1190
1208
  // RocksDB writes an empty WriteBatch as a sentinel to the new WAL which is
1191
1209
  // synced immediately afterwards. The sequence number of the sentinel
1192
1210
  // WriteBatch will be the next sequence number immediately after the largest
1193
1211
  // sequence number recovered from previous WALs and MANIFEST because of which DB
1194
1212
  // will be in consistent state.
1195
- TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1213
+ // If a future recovery starts from the new MANIFEST, then it means the new WAL
1214
+ // is successfully synced. Due to the sentinel empty write batch at the
1215
+ // beginning, kPointInTimeRecovery of WAL is guaranteed to go after this point.
1216
+ // If future recovery starts from the old MANIFEST, it means the writing the new
1217
+ // MANIFEST failed. It won't have the "SST ahead of WAL" error.
1218
+ //
1219
+ // The combination of corrupting a WAL and injecting an error during subsequent
1220
+ // re-open exposes the bug of prematurely persisting a new MANIFEST with
1221
+ // advanced ColumnFamilyData::log_number.
1222
+ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1223
+ DISABLED_TxnDbCrashDuringRecovery) {
1196
1224
  CloseDb();
1197
1225
  Options options;
1198
1226
  options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
@@ -1225,7 +1253,6 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1225
1253
  // advance wal number so that some column families have advanced log_number
1226
1254
  // while other don't.
1227
1255
  {
1228
- options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1229
1256
  ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs,
1230
1257
  &handles, &txn_db));
1231
1258
 
@@ -1234,6 +1261,8 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1234
1261
  ASSERT_OK(txn->Put(handles[1], "foo", "value"));
1235
1262
  ASSERT_OK(txn->SetName("txn0"));
1236
1263
  ASSERT_OK(txn->Prepare());
1264
+ ASSERT_OK(txn_db->Flush(FlushOptions()));
1265
+
1237
1266
  delete txn;
1238
1267
  txn = nullptr;
1239
1268
 
@@ -1253,6 +1282,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1253
1282
 
1254
1283
  delete txn;
1255
1284
  txn = nullptr;
1285
+
1256
1286
  for (auto* h : handles) {
1257
1287
  delete h;
1258
1288
  }
@@ -1266,6 +1296,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1266
1296
  std::vector<uint64_t> file_nums;
1267
1297
  GetSortedWalFiles(file_nums);
1268
1298
  size_t size = file_nums.size();
1299
+ assert(size >= 2);
1269
1300
  uint64_t log_num = file_nums[size - 2];
1270
1301
  CorruptFileWithTruncation(FileType::kWalFile, log_num,
1271
1302
  /*bytes_to_truncate=*/8);
@@ -1275,24 +1306,38 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1275
1306
  // family has higher log number than corrupted wal number. There may be old
1276
1307
  // WAL files that it must not delete because they can contain data of
1277
1308
  // uncommitted transactions. As a result, min_log_number_to_keep won't change.
1309
+
1278
1310
  {
1279
- options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1280
- ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs,
1281
- &handles, &txn_db));
1311
+ SyncPoint::GetInstance()->DisableProcessing();
1312
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1313
+ SyncPoint::GetInstance()->SetCallBack(
1314
+ "DBImpl::Open::BeforeSyncWAL", [&](void* arg) {
1315
+ auto* tmp_s = reinterpret_cast<Status*>(arg);
1316
+ assert(tmp_s);
1317
+ *tmp_s = Status::IOError("Injected");
1318
+ });
1319
+ SyncPoint::GetInstance()->EnableProcessing();
1282
1320
 
1321
+ handles.clear();
1322
+ s = TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs, &handles,
1323
+ &txn_db);
1324
+ ASSERT_TRUE(s.IsIOError());
1325
+ ASSERT_EQ("IO error: Injected", s.ToString());
1283
1326
  for (auto* h : handles) {
1284
1327
  delete h;
1285
1328
  }
1286
- handles.clear();
1287
- delete txn_db;
1329
+ CloseDb();
1330
+
1331
+ SyncPoint::GetInstance()->DisableProcessing();
1332
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1288
1333
  }
1289
1334
 
1290
- // 4. Corrupt max_wal_num to emulate second power reset which caused the
1291
- // DB to again lose the un-synced WAL.
1335
+ // 4. Corrupt max_wal_num.
1292
1336
  {
1293
1337
  std::vector<uint64_t> file_nums;
1294
1338
  GetSortedWalFiles(file_nums);
1295
1339
  size_t size = file_nums.size();
1340
+ assert(size >= 2);
1296
1341
  uint64_t log_num = file_nums[size - 1];
1297
1342
  CorruptFileWithTruncation(FileType::kWalFile, log_num);
1298
1343
  }
@@ -1307,8 +1352,6 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1307
1352
  // recovered from previous WALs and MANIFEST, db will be in consistent state
1308
1353
  // and opens successfully.
1309
1354
  {
1310
- options.avoid_flush_during_recovery = false;
1311
-
1312
1355
  ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs,
1313
1356
  &handles, &txn_db));
1314
1357
  for (auto* h : handles) {
@@ -1318,6 +1361,134 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1318
1361
  }
1319
1362
  }
1320
1363
 
1364
+ // This test is similar to
1365
+ // CrashDuringRecoveryWithCorruptionTest.CrashDuringRecovery except it calls
1366
+ // flush and corrupts Last WAL. It calls flush to sync some of the WALs and
1367
+ // remaining are unsyned one of which is then corrupted to simulate crash.
1368
+ //
1369
+ // In case of non-TransactionDB with avoid_flush_during_recovery = true, RocksDB
1370
+ // won't flush the data from WAL to L0 for all column families if possible. As a
1371
+ // result, not all column families can increase their log_numbers, and
1372
+ // min_log_number_to_keep won't change.
1373
+ // It may prematurely persist a new MANIFEST even before we can declare the DB
1374
+ // is in consistent state after recovery (this is when the new WAL is synced)
1375
+ // and advances log_numbers for some column families.
1376
+ //
1377
+ // If there is power failure before we sync the new WAL, we will end up in
1378
+ // a situation in which after persisting the MANIFEST, RocksDB will see some
1379
+ // column families' log_numbers larger than the corrupted wal, and
1380
+ // "Column family inconsistency: SST file contains data beyond the point of
1381
+ // corruption" error will be hit, causing recovery to fail.
1382
+ //
1383
+ // After adding the fix, only after new WAL is synced, RocksDB persist a new
1384
+ // MANIFEST with column families to ensure RocksDB is in consistent state.
1385
+ // RocksDB writes an empty WriteBatch as a sentinel to the new WAL which is
1386
+ // synced immediately afterwards. The sequence number of the sentinel
1387
+ // WriteBatch will be the next sequence number immediately after the largest
1388
+ // sequence number recovered from previous WALs and MANIFEST because of which DB
1389
+ // will be in consistent state.
1390
+ // If a future recovery starts from the new MANIFEST, then it means the new WAL
1391
+ // is successfully synced. Due to the sentinel empty write batch at the
1392
+ // beginning, kPointInTimeRecovery of WAL is guaranteed to go after this point.
1393
+ // If future recovery starts from the old MANIFEST, it means the writing the new
1394
+ // MANIFEST failed. It won't have the "SST ahead of WAL" error.
1395
+
1396
+ // The combination of corrupting a WAL and injecting an error during subsequent
1397
+ // re-open exposes the bug of prematurely persisting a new MANIFEST with
1398
+ // advanced ColumnFamilyData::log_number.
1399
+ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1400
+ DISABLED_CrashDuringRecoveryWithFlush) {
1401
+ CloseDb();
1402
+ Options options;
1403
+ options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
1404
+ options.avoid_flush_during_recovery = false;
1405
+ options.env = env_;
1406
+ options.create_if_missing = true;
1407
+
1408
+ ASSERT_OK(DestroyDB(dbname_, options));
1409
+ Reopen(&options);
1410
+
1411
+ ColumnFamilyHandle* cfh = nullptr;
1412
+ const std::string test_cf_name = "test_cf";
1413
+ Status s = db_->CreateColumnFamily(options, test_cf_name, &cfh);
1414
+ ASSERT_OK(s);
1415
+ delete cfh;
1416
+
1417
+ CloseDb();
1418
+
1419
+ std::vector<ColumnFamilyDescriptor> cf_descs;
1420
+ cf_descs.emplace_back(kDefaultColumnFamilyName, options);
1421
+ cf_descs.emplace_back(test_cf_name, options);
1422
+ std::vector<ColumnFamilyHandle*> handles;
1423
+
1424
+ {
1425
+ ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
1426
+
1427
+ // Write one key to test_cf.
1428
+ ASSERT_OK(db_->Put(WriteOptions(), handles[1], "old_key", "dontcare"));
1429
+
1430
+ // Write to default_cf and flush this cf several times to advance wal
1431
+ // number.
1432
+ for (int i = 0; i < 2; ++i) {
1433
+ ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i), "value"));
1434
+ ASSERT_OK(db_->Flush(FlushOptions()));
1435
+ }
1436
+
1437
+ ASSERT_OK(db_->Put(WriteOptions(), handles[1], "dontcare", "dontcare"));
1438
+ for (auto* h : handles) {
1439
+ delete h;
1440
+ }
1441
+ handles.clear();
1442
+ CloseDb();
1443
+ }
1444
+
1445
+ // Corrupt second last un-syned wal file to emulate power reset which
1446
+ // caused the DB to lose the un-synced WAL.
1447
+ {
1448
+ std::vector<uint64_t> file_nums;
1449
+ GetSortedWalFiles(file_nums);
1450
+ size_t size = file_nums.size();
1451
+ uint64_t log_num = file_nums[size - 1];
1452
+ CorruptFileWithTruncation(FileType::kWalFile, log_num,
1453
+ /*bytes_to_truncate=*/8);
1454
+ }
1455
+
1456
+ // Fault is injected to fail the recovery.
1457
+ {
1458
+ SyncPoint::GetInstance()->DisableProcessing();
1459
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1460
+ SyncPoint::GetInstance()->SetCallBack(
1461
+ "DBImpl::GetLogSizeAndMaybeTruncate:0", [&](void* arg) {
1462
+ auto* tmp_s = reinterpret_cast<Status*>(arg);
1463
+ assert(tmp_s);
1464
+ *tmp_s = Status::IOError("Injected");
1465
+ });
1466
+ SyncPoint::GetInstance()->EnableProcessing();
1467
+
1468
+ handles.clear();
1469
+ options.avoid_flush_during_recovery = true;
1470
+ s = DB::Open(options, dbname_, cf_descs, &handles, &db_);
1471
+ ASSERT_TRUE(s.IsIOError());
1472
+ ASSERT_EQ("IO error: Injected", s.ToString());
1473
+ for (auto* h : handles) {
1474
+ delete h;
1475
+ }
1476
+ CloseDb();
1477
+
1478
+ SyncPoint::GetInstance()->DisableProcessing();
1479
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1480
+ }
1481
+
1482
+ // Reopen db again
1483
+ {
1484
+ options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1485
+ ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
1486
+ for (auto* h : handles) {
1487
+ delete h;
1488
+ }
1489
+ }
1490
+ }
1491
+
1321
1492
  } // namespace ROCKSDB_NAMESPACE
1322
1493
 
1323
1494
  int main(int argc, char** argv) {
@@ -95,8 +95,8 @@ class CuckooTableDBTest : public testing::Test {
95
95
 
96
96
  int NumTableFilesAtLevel(int level) {
97
97
  std::string property;
98
- EXPECT_TRUE(db_->GetProperty("rocksdb.num-files-at-level" + ToString(level),
99
- &property));
98
+ EXPECT_TRUE(db_->GetProperty(
99
+ "rocksdb.num-files-at-level" + std::to_string(level), &property));
100
100
  return atoi(property.c_str());
101
101
  }
102
102
 
@@ -3783,7 +3783,7 @@ TEST_P(DBBasicTestDeadline, PointLookupDeadline) {
3783
3783
 
3784
3784
  Random rnd(301);
3785
3785
  for (int i = 0; i < 400; ++i) {
3786
- std::string key = "k" + ToString(i);
3786
+ std::string key = "k" + std::to_string(i);
3787
3787
  ASSERT_OK(Put(key, rnd.RandomString(100)));
3788
3788
  }
3789
3789
  ASSERT_OK(Flush());
@@ -3866,7 +3866,7 @@ TEST_P(DBBasicTestDeadline, IteratorDeadline) {
3866
3866
 
3867
3867
  Random rnd(301);
3868
3868
  for (int i = 0; i < 400; ++i) {
3869
- std::string key = "k" + ToString(i);
3869
+ std::string key = "k" + std::to_string(i);
3870
3870
  ASSERT_OK(Put(key, rnd.RandomString(100)));
3871
3871
  }
3872
3872
  ASSERT_OK(Flush());