@nxtedition/rocksdb 10.1.5 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/binding.cc +19 -11
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
  3. package/deps/rocksdb/rocksdb/Makefile +38 -15
  4. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
  9. package/deps/rocksdb/rocksdb/db/builder.h +1 -1
  10. package/deps/rocksdb/rocksdb/db/c.cc +205 -6
  11. package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
  12. package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
  14. package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
  26. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
  27. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
  28. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
  29. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
  30. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
  38. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
  39. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
  40. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  44. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
  45. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
  46. package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
  47. package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
  48. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
  50. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
  51. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
  52. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
  53. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
  55. package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
  56. package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
  57. package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
  58. package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
  59. package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
  60. package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
  61. package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
  62. package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
  64. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
  65. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
  68. package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
  69. package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
  70. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
  71. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
  72. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
  73. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
  74. package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
  75. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
  76. package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
  77. package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
  78. package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
  79. package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
  80. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
  82. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
  83. package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
  84. package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
  85. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  86. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
  90. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
  91. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
  95. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
  96. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
  97. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
  98. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
  99. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
  100. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
  101. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
  102. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
  103. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
  104. package/deps/rocksdb/rocksdb/env/env.cc +6 -0
  105. package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
  106. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  107. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
  108. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
  109. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
  110. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
  111. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
  113. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
  115. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
  119. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
  122. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
  128. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  129. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
  130. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  131. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  132. package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
  133. package/deps/rocksdb/rocksdb/options/options.cc +3 -0
  134. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  136. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
  137. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
  138. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  139. package/deps/rocksdb/rocksdb/src.mk +4 -0
  140. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
  147. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
  149. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
  150. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
  151. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
  152. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
  153. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
  154. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
  155. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
  156. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
  157. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
  158. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
  160. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
  161. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
  163. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
  165. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
  166. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
  167. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
  168. package/deps/rocksdb/rocksdb/table/format.cc +1 -2
  169. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
  170. package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
  171. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
  172. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
  173. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
  174. package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
  175. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  176. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
  177. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
  178. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
  179. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
  180. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
  181. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
  182. package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
  183. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  184. package/deps/rocksdb/rocksdb/util/random.cc +2 -1
  185. package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
  186. package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
  187. package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
  188. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
  189. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
  191. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
  192. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
  193. package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
  194. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
  195. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
  196. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
  197. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
  198. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
  199. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
  200. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
  202. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
  203. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  204. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
  205. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
  206. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
  207. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
  208. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
  209. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
  210. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
  211. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
  212. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
  213. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
  214. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
  215. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
  216. package/package.json +1 -1
  217. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  218. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  219. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  220. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  221. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  222. package/.tap/test-results/test/batch-test.js.tap +0 -12
  223. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  224. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  225. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  226. package/.tap/test-results/test/column-test.js.tap +0 -55
  227. package/.tap/test-results/test/common.js.tap +0 -0
  228. package/.tap/test-results/test/compression-test.js.tap +0 -30
  229. package/.tap/test-results/test/db-identity.js.tap +0 -12
  230. package/.tap/test-results/test/electron.js.tap +0 -0
  231. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  232. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  233. package/.tap/test-results/test/gc.js.tap +0 -0
  234. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  235. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  236. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  237. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  238. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  239. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  240. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  241. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  242. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  243. package/.tap/test-results/test/lock-test.js.tap +0 -18
  244. package/.tap/test-results/test/lock.js.tap +0 -0
  245. package/.tap/test-results/test/make.js.tap +0 -0
  246. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  247. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  248. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  249. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  250. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  251. package/deps/rocksdb/rocksdb/README.md +0 -29
  252. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  253. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  254. package/deps/rocksdb/rocksdb/port/README +0 -10
  255. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -369,7 +369,7 @@ class WALDumperCommand : public LDBCommand {
369
369
  const std::map<std::string, std::string>& options,
370
370
  const std::vector<std::string>& flags);
371
371
 
372
- bool NoDBOpen() override { return true; }
372
+ bool NoDBOpen() override { return no_db_open_; }
373
373
 
374
374
  static void Help(std::string& ret);
375
375
 
@@ -380,6 +380,7 @@ class WALDumperCommand : public LDBCommand {
380
380
  std::string wal_file_;
381
381
  bool print_values_;
382
382
  bool is_write_committed_; // default will be set to true
383
+ bool no_db_open_ = true;
383
384
 
384
385
  static const std::string ARG_WAL_FILE;
385
386
  static const std::string ARG_WRITE_COMMITTED;
@@ -619,6 +620,7 @@ class DBQuerierCommand : public LDBCommand {
619
620
  static const char* GET_CMD;
620
621
  static const char* PUT_CMD;
621
622
  static const char* DELETE_CMD;
623
+ static const char* COUNT_CMD;
622
624
  };
623
625
 
624
626
  class CheckConsistencyCommand : public LDBCommand {
@@ -28,6 +28,9 @@ void LDBCommandRunner::PrintHelp(const LDBOptions& ldb_options,
28
28
  ret.append(" --" + LDBCommand::ARG_SECONDARY_PATH +
29
29
  "=<secondary_path> to open DB as secondary instance. Operations "
30
30
  "not supported in secondary instance will fail.\n\n");
31
+ ret.append(" --" + LDBCommand::ARG_LEADER_PATH +
32
+ "=<leader_path> to open DB as a follower instance. Operations "
33
+ "not supported in follower instance will fail.\n\n");
31
34
  ret.append(
32
35
  "The following optional parameters control if keys/values are "
33
36
  "input/output as hex or as plain strings:\n");
@@ -0,0 +1,24 @@
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
+ #pragma once
10
+
11
+ #include <cstddef>
12
+
13
+ #include "rocksdb/rocksdb_namespace.h"
14
+
15
+ namespace ROCKSDB_NAMESPACE {
16
+
17
+ template <typename T, std::size_t Align = alignof(T)>
18
+ struct aligned_storage {
19
+ struct type {
20
+ alignas(Align) unsigned char data[sizeof(T)];
21
+ };
22
+ };
23
+
24
+ } // namespace ROCKSDB_NAMESPACE
@@ -726,7 +726,7 @@ double FilterBench::RandomQueryTest(uint32_t inside_threshold, bool dry_run,
726
726
  } else {
727
727
  may_match = info.full_block_reader_->KeyMayMatch(
728
728
  batch_slices[i],
729
- /*no_io=*/false, /*const_ikey_ptr=*/nullptr,
729
+ /*const_ikey_ptr=*/nullptr,
730
730
  /*get_context=*/nullptr,
731
731
  /*lookup_context=*/nullptr, ROCKSDB_NAMESPACE::ReadOptions());
732
732
  }
@@ -13,6 +13,7 @@
13
13
  #include <utility>
14
14
 
15
15
  #include "port/likely.h"
16
+ #include "util/aligned_storage.h"
16
17
  #include "util/thread_local.h"
17
18
 
18
19
  #define STORAGE_DECL static thread_local
@@ -21,7 +22,7 @@ namespace ROCKSDB_NAMESPACE {
21
22
 
22
23
  Random* Random::GetTLSInstance() {
23
24
  STORAGE_DECL Random* tls_instance;
24
- STORAGE_DECL std::aligned_storage<sizeof(Random)>::type tls_instance_bytes;
25
+ STORAGE_DECL aligned_storage<Random>::type tls_instance_bytes;
25
26
 
26
27
  auto rv = tls_instance;
27
28
  if (UNLIKELY(rv == nullptr)) {
@@ -17,7 +17,7 @@ namespace ROCKSDB_NAMESPACE {
17
17
  class StderrLogger : public Logger {
18
18
  public:
19
19
  explicit StderrLogger(const InfoLogLevel log_level = InfoLogLevel::INFO_LEVEL)
20
- : Logger(log_level), log_prefix(nullptr) {}
20
+ : Logger(log_level), log_prefix(nullptr), log_prefix_len(0) {}
21
21
  explicit StderrLogger(const InfoLogLevel log_level, const std::string prefix)
22
22
  : Logger(log_level),
23
23
  log_prefix(strdup(prefix.c_str())),
@@ -158,6 +158,39 @@ Status TimestampRecoveryHandler::PutCF(uint32_t cf, const Slice& key,
158
158
  return WriteBatchInternal::Put(new_batch_.get(), cf, new_key, value);
159
159
  }
160
160
 
161
+ Status TimestampRecoveryHandler::PutEntityCF(uint32_t cf, const Slice& key,
162
+ const Slice& entity) {
163
+ std::string new_key_buf;
164
+ Slice new_key;
165
+ Status status = TimestampRecoveryHandler::ReconcileTimestampDiscrepancy(
166
+ cf, key, &new_key_buf, &new_key);
167
+ if (!status.ok()) {
168
+ return status;
169
+ }
170
+ Slice entity_copy = entity;
171
+ WideColumns columns;
172
+ if (!WideColumnSerialization::Deserialize(entity_copy, columns).ok()) {
173
+ return Status::Corruption("Unable to deserialize entity",
174
+ entity.ToString(/* hex */ true));
175
+ }
176
+
177
+ return WriteBatchInternal::PutEntity(new_batch_.get(), cf, new_key, columns);
178
+ }
179
+
180
+ Status TimestampRecoveryHandler::TimedPutCF(uint32_t cf, const Slice& key,
181
+ const Slice& value,
182
+ uint64_t write_time) {
183
+ std::string new_key_buf;
184
+ Slice new_key;
185
+ Status status =
186
+ ReconcileTimestampDiscrepancy(cf, key, &new_key_buf, &new_key);
187
+ if (!status.ok()) {
188
+ return status;
189
+ }
190
+ return WriteBatchInternal::TimedPut(new_batch_.get(), cf, new_key, value,
191
+ write_time);
192
+ }
193
+
161
194
  Status TimestampRecoveryHandler::DeleteCF(uint32_t cf, const Slice& key) {
162
195
  std::string new_key_buf;
163
196
  Slice new_key;
@@ -11,6 +11,7 @@
11
11
  #include <unordered_map>
12
12
  #include <vector>
13
13
 
14
+ #include "db/wide/wide_column_serialization.h"
14
15
  #include "db/write_batch_internal.h"
15
16
  #include "rocksdb/slice.h"
16
17
  #include "rocksdb/status.h"
@@ -116,6 +117,12 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
116
117
 
117
118
  Status PutCF(uint32_t cf, const Slice& key, const Slice& value) override;
118
119
 
120
+ Status PutEntityCF(uint32_t cf, const Slice& key,
121
+ const Slice& entity) override;
122
+
123
+ Status TimedPutCF(uint32_t cf, const Slice& key, const Slice& value,
124
+ uint64_t write_time) override;
125
+
119
126
  Status DeleteCF(uint32_t cf, const Slice& key) override;
120
127
 
121
128
  Status SingleDeleteCF(uint32_t cf, const Slice& key) override;
@@ -16,6 +16,7 @@ namespace ROCKSDB_NAMESPACE {
16
16
  namespace {
17
17
  static const std::string kTestKeyWithoutTs = "key";
18
18
  static const std::string kValuePlaceHolder = "value";
19
+ static const uint64_t kWriteUnixTime = 100;
19
20
  } // namespace
20
21
 
21
22
  class HandleTimestampSizeDifferenceTest : public testing::Test {
@@ -38,6 +39,34 @@ class HandleTimestampSizeDifferenceTest : public testing::Test {
38
39
  return AddKey(cf, key);
39
40
  }
40
41
 
42
+ Status TimedPutCF(uint32_t cf, const Slice& key, const Slice& value,
43
+ uint64_t write_unix_time) override {
44
+ if (value.compare(kValuePlaceHolder) != 0) {
45
+ return Status::InvalidArgument();
46
+ }
47
+ if (write_unix_time != kWriteUnixTime) {
48
+ return Status::InvalidArgument();
49
+ }
50
+ return AddKey(cf, key);
51
+ }
52
+
53
+ Status PutEntityCF(uint32_t cf, const Slice& key,
54
+ const Slice& entity) override {
55
+ Slice entity_copy = entity;
56
+ WideColumns columns;
57
+ Status s = WideColumnSerialization::Deserialize(entity_copy, columns);
58
+ if (!s.ok()) {
59
+ return s;
60
+ }
61
+ if (columns.size() != 1) {
62
+ return Status::InvalidArgument();
63
+ }
64
+ if (columns[0].value().compare(kValuePlaceHolder) != 0) {
65
+ return Status::InvalidArgument();
66
+ }
67
+ return AddKey(cf, key);
68
+ }
69
+
41
70
  Status DeleteCF(uint32_t cf, const Slice& key) override {
42
71
  return AddKey(cf, key);
43
72
  }
@@ -117,6 +146,10 @@ class HandleTimestampSizeDifferenceTest : public testing::Test {
117
146
  WriteBatchInternal::Merge(batch, cf_id, key, kValuePlaceHolder));
118
147
  ASSERT_OK(WriteBatchInternal::PutBlobIndex(batch, cf_id, key,
119
148
  kValuePlaceHolder));
149
+ ASSERT_OK(WriteBatchInternal::TimedPut(
150
+ batch, cf_id, key, kValuePlaceHolder, kWriteUnixTime));
151
+ WideColumns columns{{kDefaultWideColumnName, kValuePlaceHolder}};
152
+ ASSERT_OK(WriteBatchInternal::PutEntity(batch, cf_id, key, columns));
120
153
  }
121
154
  }
122
155
 
@@ -32,6 +32,11 @@ class ColumnFamilyCollector : public WriteBatch::Handler {
32
32
  return AddColumnFamilyId(column_family_id);
33
33
  }
34
34
 
35
+ Status PutEntityCF(uint32_t column_family_id, const Slice&,
36
+ const Slice&) override {
37
+ return AddColumnFamilyId(column_family_id);
38
+ }
39
+
35
40
  Status TimedPutCF(uint32_t column_family_id, const Slice&, const Slice&,
36
41
  uint64_t) override {
37
42
  return AddColumnFamilyId(column_family_id);
@@ -11,6 +11,15 @@
11
11
  #ifndef XXH_NAMESPACE
12
12
  #define XXH_NAMESPACE ROCKSDB_
13
13
  #endif // !defined(XXH_NAMESPACE)
14
+
15
+ #if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) || \
16
+ defined(XXH_IMPLEMENTATION)) && \
17
+ !defined(XXH_IMPLEM_13a8737387)
18
+ #if defined(__cplusplus) && (__cplusplus > 202002L)
19
+ /* C++23 and future versions have std::unreachable() */
20
+ #include <utility> /* std::unreachable() */
21
+ #endif
22
+ #endif
14
23
  /* END RocksDB customizations */
15
24
 
16
25
  // clang-format off
@@ -1294,7 +1303,7 @@ struct XXH3_state_s {
1294
1303
  * Note that this doesn't prepare the state for a streaming operation,
1295
1304
  * it's still necessary to use XXH3_NNbits_reset*() afterwards.
1296
1305
  */
1297
- #define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; }
1306
+ #define XXH3_INITSTATE(XXH3_state_ptr) do { (XXH3_state_ptr)->seed = 0; } while (0)
1298
1307
 
1299
1308
 
1300
1309
  /*!
@@ -2064,8 +2073,6 @@ static int XXH_isLittleEndian(void)
2064
2073
  # define XXH_UNREACHABLE() unreachable()
2065
2074
 
2066
2075
  #elif defined(__cplusplus) && (__cplusplus > 202002L)
2067
- /* C++23 and future versions have std::unreachable() */
2068
- # include <utility> /* std::unreachable() */
2069
2076
  # define XXH_UNREACHABLE() std::unreachable()
2070
2077
 
2071
2078
  #elif XXH_HAS_BUILTIN(__builtin_unreachable)
@@ -3962,7 +3962,7 @@ TEST_P(BackupEngineTestWithParam, BackupUsingDirectIO) {
3962
3962
  OpenDBAndBackupEngine(true /* destroy_old_data */);
3963
3963
  for (int i = 0; i < kNumBackups; ++i) {
3964
3964
  FillDB(db_.get(), i * kNumKeysPerBackup /* from */,
3965
- (i + 1) * kNumKeysPerBackup /* to */, kFlushAll);
3965
+ (i + 1) * kNumKeysPerBackup /* to */);
3966
3966
 
3967
3967
  // Clear the file open counters and then do a bunch of backup engine ops.
3968
3968
  // For all ops, files should be opened in direct mode.
@@ -4406,9 +4406,9 @@ TEST_F(BackupEngineTest, ExcludeFiles) {
4406
4406
  delete db;
4407
4407
  db = nullptr;
4408
4408
 
4409
- for (auto be_pair :
4410
- {std::make_pair(backup_engine_.get(), alt_backup_engine),
4411
- std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4409
+ auto backup_engine = backup_engine_.get();
4410
+ for (auto be_pair : {std::make_pair(backup_engine, alt_backup_engine),
4411
+ std::make_pair(alt_backup_engine, backup_engine)}) {
4412
4412
  ASSERT_OK(DestroyDB(dbname_, options_));
4413
4413
  RestoreOptions ro;
4414
4414
  // Fails without alternate dir
@@ -4430,9 +4430,9 @@ TEST_F(BackupEngineTest, ExcludeFiles) {
4430
4430
  CloseBackupEngine();
4431
4431
  OpenBackupEngine();
4432
4432
 
4433
- for (auto be_pair :
4434
- {std::make_pair(backup_engine_.get(), alt_backup_engine),
4435
- std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4433
+ backup_engine = backup_engine_.get();
4434
+ for (auto be_pair : {std::make_pair(backup_engine, alt_backup_engine),
4435
+ std::make_pair(alt_backup_engine, backup_engine)}) {
4436
4436
  ASSERT_OK(DestroyDB(dbname_, options_));
4437
4437
  RestoreOptions ro;
4438
4438
  ro.alternate_dirs.push_front(be_pair.second);
@@ -4459,9 +4459,9 @@ TEST_F(BackupEngineTest, ExcludeFiles) {
4459
4459
  AssertBackupInfoConsistency(/*allow excluded*/ true);
4460
4460
 
4461
4461
  // Excluded file(s) deleted, unable to restore
4462
- for (auto be_pair :
4463
- {std::make_pair(backup_engine_.get(), alt_backup_engine),
4464
- std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4462
+ backup_engine = backup_engine_.get();
4463
+ for (auto be_pair : {std::make_pair(backup_engine, alt_backup_engine),
4464
+ std::make_pair(alt_backup_engine, backup_engine)}) {
4465
4465
  RestoreOptions ro;
4466
4466
  ro.alternate_dirs.push_front(be_pair.second);
4467
4467
  ASSERT_TRUE(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro)
@@ -4475,9 +4475,9 @@ TEST_F(BackupEngineTest, ExcludeFiles) {
4475
4475
  AssertBackupInfoConsistency(/*allow excluded*/ true);
4476
4476
 
4477
4477
  // Excluded file(s) deleted, unable to restore
4478
- for (auto be_pair :
4479
- {std::make_pair(backup_engine_.get(), alt_backup_engine),
4480
- std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4478
+ backup_engine = backup_engine_.get();
4479
+ for (auto be_pair : {std::make_pair(backup_engine, alt_backup_engine),
4480
+ std::make_pair(alt_backup_engine, backup_engine)}) {
4481
4481
  RestoreOptions ro;
4482
4482
  ro.alternate_dirs.push_front(be_pair.second);
4483
4483
  ASSERT_TRUE(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro)
@@ -13,6 +13,7 @@
13
13
  #ifndef OS_WIN
14
14
  #include <unistd.h>
15
15
  #endif
16
+ #include <cstdlib>
16
17
  #include <iostream>
17
18
  #include <thread>
18
19
  #include <utility>
@@ -23,6 +24,7 @@
23
24
  #include "port/stack_trace.h"
24
25
  #include "rocksdb/db.h"
25
26
  #include "rocksdb/env.h"
27
+ #include "rocksdb/rocksdb_namespace.h"
26
28
  #include "rocksdb/utilities/transaction_db.h"
27
29
  #include "test_util/sync_point.h"
28
30
  #include "test_util/testharness.h"
@@ -253,6 +255,13 @@ class CheckpointTest : public testing::Test {
253
255
  }
254
256
  return result;
255
257
  }
258
+
259
+ int NumTableFilesAtLevel(int level) {
260
+ std::string property;
261
+ EXPECT_TRUE(db_->GetProperty(
262
+ "rocksdb.num-files-at-level" + std::to_string(level), &property));
263
+ return atoi(property.c_str());
264
+ }
256
265
  };
257
266
 
258
267
  TEST_F(CheckpointTest, GetSnapshotLink) {
@@ -760,18 +769,65 @@ TEST_F(CheckpointTest, CheckpointWithParallelWrites) {
760
769
  thread.join();
761
770
  }
762
771
 
763
- TEST_F(CheckpointTest, CheckpointWithUnsyncedDataDropped) {
772
+ class CheckpointTestWithWalParams
773
+ : public CheckpointTest,
774
+ public testing::WithParamInterface<
775
+ std::tuple<uint64_t, bool, bool, bool>> {
776
+ public:
777
+ uint64_t GetLogSizeForFlush() { return std::get<0>(GetParam()); }
778
+ bool GetWalsInManifest() { return std::get<1>(GetParam()); }
779
+ bool GetManualWalFlush() { return std::get<2>(GetParam()); }
780
+ bool GetBackgroundCloseInactiveWals() { return std::get<3>(GetParam()); }
781
+ };
782
+
783
+ INSTANTIATE_TEST_CASE_P(NormalWalParams, CheckpointTestWithWalParams,
784
+ ::testing::Combine(::testing::Values(0U, 100000000U),
785
+ ::testing::Bool(), ::testing::Bool(),
786
+ ::testing::Values(false)));
787
+
788
+ INSTANTIATE_TEST_CASE_P(DeprecatedWalParams, CheckpointTestWithWalParams,
789
+ ::testing::Values(std::make_tuple(100000000U, true,
790
+ false, true)));
791
+
792
+ TEST_P(CheckpointTestWithWalParams, CheckpointWithUnsyncedDataDropped) {
764
793
  Options options = CurrentOptions();
765
- std::unique_ptr<FaultInjectionTestEnv> env(new FaultInjectionTestEnv(env_));
766
- options.env = env.get();
794
+ options.max_write_buffer_number = 4;
795
+ options.track_and_verify_wals_in_manifest = GetWalsInManifest();
796
+ options.manual_wal_flush = GetManualWalFlush();
797
+ options.background_close_inactive_wals = GetBackgroundCloseInactiveWals();
798
+ auto fault_fs = std::make_shared<FaultInjectionTestFS>(FileSystem::Default());
799
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
800
+
801
+ if (options.background_close_inactive_wals) {
802
+ // Disable this hygiene check when the fix is disabled
803
+ fault_fs->SetAllowLinkOpenFile();
804
+ }
805
+
806
+ options.env = fault_fs_env.get();
767
807
  Reopen(options);
768
808
  ASSERT_OK(Put("key1", "val1"));
809
+ if (GetLogSizeForFlush() > 0) {
810
+ // When not flushing memtable for checkpoint, this is the simplest way
811
+ // to get
812
+ // * one inactive WAL, synced
813
+ // * one inactive WAL, not synced, and
814
+ // * one active WAL, not synced
815
+ // with a single thread, so that we have at least one that can be hard
816
+ // linked, etc.
817
+ ASSERT_OK(static_cast_with_check<DBImpl>(db_)->PauseBackgroundWork());
818
+ ASSERT_OK(static_cast_with_check<DBImpl>(db_)->TEST_SwitchMemtable());
819
+ ASSERT_OK(db_->SyncWAL());
820
+ }
821
+ ASSERT_OK(Put("key2", "val2"));
822
+ if (GetLogSizeForFlush() > 0) {
823
+ ASSERT_OK(static_cast_with_check<DBImpl>(db_)->TEST_SwitchMemtable());
824
+ }
825
+ ASSERT_OK(Put("key3", "val3"));
769
826
  Checkpoint* checkpoint;
770
827
  ASSERT_OK(Checkpoint::Create(db_, &checkpoint));
771
- ASSERT_OK(checkpoint->CreateCheckpoint(snapshot_name_));
828
+ ASSERT_OK(checkpoint->CreateCheckpoint(snapshot_name_, GetLogSizeForFlush()));
772
829
  delete checkpoint;
773
- ASSERT_OK(env->DropUnsyncedFileData());
774
-
830
+ ASSERT_OK(fault_fs->DropUnsyncedFileData());
775
831
  // make sure it's openable even though whatever data that wasn't synced got
776
832
  // dropped.
777
833
  options.env = env_;
@@ -781,6 +837,10 @@ TEST_F(CheckpointTest, CheckpointWithUnsyncedDataDropped) {
781
837
  std::string get_result;
782
838
  ASSERT_OK(snapshot_db->Get(read_opts, "key1", &get_result));
783
839
  ASSERT_EQ("val1", get_result);
840
+ ASSERT_OK(snapshot_db->Get(read_opts, "key2", &get_result));
841
+ ASSERT_EQ("val2", get_result);
842
+ ASSERT_OK(snapshot_db->Get(read_opts, "key3", &get_result));
843
+ ASSERT_EQ("val3", get_result);
784
844
  delete snapshot_db;
785
845
  delete db_;
786
846
  db_ = nullptr;
@@ -797,15 +857,19 @@ TEST_F(CheckpointTest, CheckpointOptionsFileFailedToPersist) {
797
857
  // Setup `FaultInjectionTestFS` and `SyncPoint` callbacks to fail one
798
858
  // operation when inside the OPTIONS file persisting code.
799
859
  std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
800
- fault_fs->SetRandomMetadataWriteError(1 /* one_in */);
860
+ fault_fs->SetThreadLocalErrorContext(
861
+ FaultInjectionIOType::kWrite, 7 /* seed*/, 1 /* one_in */,
862
+ false /* retryable */, false /* has_data_loss*/);
801
863
  SyncPoint::GetInstance()->SetCallBack(
802
864
  "PersistRocksDBOptions:start", [fault_fs](void* /* arg */) {
803
- fault_fs->EnableMetadataWriteErrorInjection();
865
+ fault_fs->EnableThreadLocalErrorInjection(
866
+ FaultInjectionIOType::kMetadataWrite);
804
867
  });
805
868
  SyncPoint::GetInstance()->SetCallBack(
806
869
  "FaultInjectionTestFS::InjectMetadataWriteError:Injected",
807
870
  [fault_fs](void* /* arg */) {
808
- fault_fs->DisableMetadataWriteErrorInjection();
871
+ fault_fs->DisableThreadLocalErrorInjection(
872
+ FaultInjectionIOType::kMetadataWrite);
809
873
  });
810
874
  options.env = fault_fs_env.get();
811
875
  SyncPoint::GetInstance()->EnableProcessing();
@@ -930,49 +994,41 @@ TEST_F(CheckpointTest, CheckpointWithDbPath) {
930
994
  delete checkpoint;
931
995
  }
932
996
 
933
- TEST_F(CheckpointTest, PutRaceWithCheckpointTrackedWalSync) {
934
- // Repro for a race condition where a user write comes in after the checkpoint
935
- // syncs WAL for `track_and_verify_wals_in_manifest` but before the
936
- // corresponding MANIFEST update. With the bug, that scenario resulted in an
937
- // unopenable DB with error "Corruption: Size mismatch: WAL ...".
938
- Options options = CurrentOptions();
939
- std::unique_ptr<FaultInjectionTestEnv> fault_env(
940
- new FaultInjectionTestEnv(env_));
941
- options.env = fault_env.get();
942
- options.track_and_verify_wals_in_manifest = true;
943
- Reopen(options);
944
-
945
- ASSERT_OK(Put("key1", "val1"));
946
-
947
- SyncPoint::GetInstance()->SetCallBack(
948
- "DBImpl::SyncWAL:BeforeMarkLogsSynced:1",
949
- [this](void* /* arg */) { ASSERT_OK(Put("key2", "val2")); });
997
+ TEST_F(CheckpointTest, CheckpointWithArchievedLog) {
998
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
999
+ {{"WalManager::ArchiveWALFile",
1000
+ "CheckpointTest:CheckpointWithArchievedLog"}});
950
1001
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1002
+ Options options = CurrentOptions();
1003
+ options.WAL_ttl_seconds = 3600;
1004
+ options.disable_auto_compactions = true;
1005
+ DestroyAndReopen(options);
951
1006
 
952
- std::unique_ptr<Checkpoint> checkpoint;
953
- {
954
- Checkpoint* checkpoint_ptr;
955
- ASSERT_OK(Checkpoint::Create(db_, &checkpoint_ptr));
956
- checkpoint.reset(checkpoint_ptr);
957
- }
958
-
959
- ASSERT_OK(checkpoint->CreateCheckpoint(snapshot_name_));
960
-
961
- // Ensure callback ran.
962
- ASSERT_EQ("val2", Get("key2"));
963
-
964
- Close();
965
-
966
- // Simulate full loss of unsynced data. This drops "key2" -> "val2" from the
967
- // DB WAL.
968
- ASSERT_OK(fault_env->DropUnsyncedFileData());
1007
+ ASSERT_OK(Put("key1", std::string(1024 * 1024, 'a')));
1008
+ // flush and archive the first log
1009
+ ASSERT_OK(Flush());
1010
+ ASSERT_OK(Put("key2", std::string(1024, 'a')));
969
1011
 
970
- // Before the bug fix, reopening the DB would fail because the MANIFEST's
971
- // AddWal entry indicated the WAL should be synced through "key2" -> "val2".
972
- Reopen(options);
1012
+ Checkpoint* checkpoint;
1013
+ ASSERT_OK(Checkpoint::Create(db_, &checkpoint));
1014
+ TEST_SYNC_POINT("CheckpointTest:CheckpointWithArchievedLog");
1015
+ ASSERT_OK(checkpoint->CreateCheckpoint(snapshot_name_, 1024 * 1024));
1016
+ // unflushed log size < 1024 * 1024 < total file size including archived log,
1017
+ // so flush shouldn't occur, there is only one file at level 0
1018
+ ASSERT_EQ(NumTableFilesAtLevel(0), 1);
1019
+ delete checkpoint;
1020
+ checkpoint = nullptr;
973
1021
 
974
- // Need to close before `fault_env` goes out of scope.
975
- Close();
1022
+ DB* snapshot_db;
1023
+ ASSERT_OK(DB::Open(options, snapshot_name_, &snapshot_db));
1024
+ ReadOptions read_opts;
1025
+ std::string get_result;
1026
+ ASSERT_OK(snapshot_db->Get(read_opts, "key1", &get_result));
1027
+ ASSERT_EQ(std::string(1024 * 1024, 'a'), get_result);
1028
+ get_result.clear();
1029
+ ASSERT_OK(snapshot_db->Get(read_opts, "key2", &get_result));
1030
+ ASSERT_EQ(std::string(1024, 'a'), get_result);
1031
+ delete snapshot_db;
976
1032
  }
977
1033
 
978
1034
  } // namespace ROCKSDB_NAMESPACE
@@ -85,9 +85,21 @@ Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
85
85
  ScopedArenaPtr<InternalIterator> iter(
86
86
  idb->NewInternalIterator(read_options, &arena, kMaxSequenceNumber, cfh));
87
87
 
88
- if (!begin_key.empty()) {
88
+ const Comparator* ucmp = icmp.user_comparator();
89
+ size_t ts_sz = ucmp->timestamp_size();
90
+
91
+ Slice from_slice = begin_key;
92
+ bool has_begin = !begin_key.empty();
93
+ Slice end_slice = end_key;
94
+ bool has_end = !end_key.empty();
95
+ std::string begin_key_buf, end_key_buf;
96
+ auto [from, end] = MaybeAddTimestampsToRange(
97
+ has_begin ? &from_slice : nullptr, has_end ? &end_slice : nullptr, ts_sz,
98
+ &begin_key_buf, &end_key_buf);
99
+ if (has_begin) {
100
+ assert(from.has_value());
89
101
  InternalKey ikey;
90
- ikey.SetMinPossibleForUserKey(begin_key);
102
+ ikey.SetMinPossibleForUserKey(from.value());
91
103
  iter->Seek(ikey.Encode());
92
104
  } else {
93
105
  iter->SeekToFirst();
@@ -102,8 +114,8 @@ Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
102
114
  return pik_status;
103
115
  }
104
116
 
105
- if (!end_key.empty() &&
106
- icmp.user_comparator()->Compare(ikey.user_key, end_key) > 0) {
117
+ if (has_end && end.has_value() &&
118
+ icmp.user_comparator()->Compare(ikey.user_key, end.value()) > 0) {
107
119
  break;
108
120
  }
109
121