@nxtedition/rocksdb 10.0.13 → 10.0.15

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 (700) hide show
  1. package/.tap/coverage/213879bb-47ae-470e-bb54-f4157d9f60e2.json +162898 -0
  2. package/.tap/processinfo/{4c642b53-6895-4ef0-9391-7c6b8d484262.json → 213879bb-47ae-470e-bb54-f4157d9f60e2.json} +117 -121
  3. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  4. package/.tap/test-results/test/abstract-level-test.js.tap +1705 -0
  5. package/.tap/test-results/test/batch-test.js.tap +12 -0
  6. package/.tap/test-results/test/chained-batch-gc-test.js.tap +11 -0
  7. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +58 -0
  8. package/.tap/test-results/test/clear-gc-test.js.tap +13 -0
  9. package/.tap/test-results/test/column-test.js.tap +55 -0
  10. package/.tap/test-results/test/common.js.tap +0 -0
  11. package/.tap/test-results/test/compression-test.js.tap +30 -0
  12. package/.tap/test-results/test/db-identity.js.tap +12 -0
  13. package/.tap/test-results/test/electron.js.tap +0 -0
  14. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +2 -0
  15. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  16. package/.tap/test-results/test/gc.js.tap +0 -0
  17. package/.tap/test-results/test/getproperty-test.js.tap +29 -0
  18. package/.tap/test-results/test/iterator-gc-test.js.tap +4 -0
  19. package/.tap/test-results/test/iterator-hwm-test.js.tap +24 -0
  20. package/.tap/test-results/test/iterator-recursion-test.js.tap +12 -0
  21. package/.tap/test-results/test/iterator-starvation-test.js.tap +2 -0
  22. package/.tap/test-results/test/iterator-test.js.tap +0 -0
  23. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  24. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  25. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  26. package/.tap/test-results/test/lock-test.js.tap +0 -0
  27. package/.tap/test-results/test/lock.js.tap +0 -0
  28. package/.tap/test-results/test/make.js.tap +0 -0
  29. package/.tap/test-results/test/max-rev-merge.js.tap +0 -12
  30. package/.tap/test-results/test/merge-operator-test.js.tap +0 -0
  31. package/.tap/test-results/test/mkdir-test.js.tap +0 -0
  32. package/.tap/test-results/test/segfault-test.js.tap +0 -0
  33. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  34. package/binding.cc +42 -34
  35. package/deps/rocksdb/rocksdb/CMakeLists.txt +44 -14
  36. package/deps/rocksdb/rocksdb/Makefile +34 -17
  37. package/deps/rocksdb/rocksdb/TARGETS +27 -0
  38. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +95 -42
  39. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +0 -1
  40. package/deps/rocksdb/rocksdb/cache/cache_test.cc +5 -3
  41. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +381 -393
  42. package/deps/rocksdb/rocksdb/cache/clock_cache.h +88 -51
  43. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +14 -7
  44. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +1 -1
  45. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +21 -19
  46. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +8 -7
  47. package/deps/rocksdb/rocksdb/cache/lru_cache.h +1 -1
  48. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +89 -13
  49. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +16 -8
  50. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +6 -6
  51. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +15 -9
  52. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +16 -13
  53. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +306 -23
  54. package/deps/rocksdb/rocksdb/cache/typed_cache.h +3 -4
  55. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +30 -27
  56. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +8 -10
  57. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.cc +20 -0
  58. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +83 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +19 -16
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -5
  61. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +18 -21
  62. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +5 -4
  63. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +7 -6
  64. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +56 -27
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +11 -7
  66. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +20 -19
  67. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +106 -31
  68. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +5 -8
  69. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +4 -2
  70. package/deps/rocksdb/rocksdb/db/builder.cc +89 -44
  71. package/deps/rocksdb/rocksdb/db/builder.h +4 -6
  72. package/deps/rocksdb/rocksdb/db/c.cc +205 -57
  73. package/deps/rocksdb/rocksdb/db/c_test.c +141 -20
  74. package/deps/rocksdb/rocksdb/db/coalescing_iterator.cc +47 -0
  75. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +79 -0
  76. package/deps/rocksdb/rocksdb/db/column_family.cc +100 -36
  77. package/deps/rocksdb/rocksdb/db/column_family.h +46 -28
  78. package/deps/rocksdb/rocksdb/db/column_family_test.cc +168 -46
  79. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +51 -6
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +72 -24
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -14
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +7 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +87 -8
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +310 -70
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +78 -62
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +0 -1
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +33 -96
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +18 -10
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -8
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +42 -22
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +20 -16
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +7 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +18 -17
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +95 -10
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +213 -34
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +4 -4
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -8
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +16 -16
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +75 -142
  103. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +577 -34
  104. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +4 -4
  105. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  106. package/deps/rocksdb/rocksdb/db/corruption_test.cc +7 -38
  107. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +5 -5
  108. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +366 -136
  109. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +9 -10
  110. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +282 -6
  111. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +6 -6
  112. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +551 -150
  113. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +1 -1
  114. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +41 -13
  115. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +54 -17
  116. package/deps/rocksdb/rocksdb/db/db_follower_test.cc +527 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -58
  118. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +34 -45
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +699 -580
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +308 -230
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +180 -107
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -2
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +10 -6
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +36 -61
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +347 -0
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.h +54 -0
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +206 -155
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +5 -8
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +41 -39
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +26 -22
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +14 -9
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +126 -46
  133. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +21 -9
  134. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +294 -0
  135. package/deps/rocksdb/rocksdb/db/db_iter.cc +116 -78
  136. package/deps/rocksdb/rocksdb/db/db_iter.h +31 -7
  137. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +34 -14
  138. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +69 -8
  139. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +153 -18
  140. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +9 -11
  141. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +9 -1
  142. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +6 -2
  143. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +105 -0
  144. package/deps/rocksdb/rocksdb/db/db_options_test.cc +97 -111
  145. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -3
  146. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +82 -30
  147. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +5 -7
  148. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -22
  149. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +74 -0
  150. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +175 -47
  151. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +4 -3
  152. package/deps/rocksdb/rocksdb/db/db_test.cc +133 -109
  153. package/deps/rocksdb/rocksdb/db/db_test2.cc +227 -139
  154. package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -19
  155. package/deps/rocksdb/rocksdb/db/db_test_util.h +67 -24
  156. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +140 -2
  157. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -19
  158. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +332 -87
  159. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +4 -4
  160. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +4 -4
  161. package/deps/rocksdb/rocksdb/db/db_write_test.cc +250 -30
  162. package/deps/rocksdb/rocksdb/db/dbformat.cc +41 -8
  163. package/deps/rocksdb/rocksdb/db/dbformat.h +100 -17
  164. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +48 -8
  165. package/deps/rocksdb/rocksdb/db/error_handler.cc +102 -116
  166. package/deps/rocksdb/rocksdb/db/error_handler.h +28 -6
  167. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +263 -99
  168. package/deps/rocksdb/rocksdb/db/event_helpers.cc +3 -1
  169. package/deps/rocksdb/rocksdb/db/experimental.cc +1073 -7
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +261 -111
  171. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +263 -183
  172. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +31 -12
  173. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +698 -7
  174. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +5 -3
  175. package/deps/rocksdb/rocksdb/db/flush_job.cc +41 -41
  176. package/deps/rocksdb/rocksdb/db/flush_job.h +11 -8
  177. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -13
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +19 -6
  179. package/deps/rocksdb/rocksdb/db/forward_iterator.h +12 -12
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +83 -52
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +169 -2
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -6
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  184. package/deps/rocksdb/rocksdb/db/job_context.h +17 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -4
  186. package/deps/rocksdb/rocksdb/db/log_reader.cc +44 -20
  187. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -0
  188. package/deps/rocksdb/rocksdb/db/log_test.cc +81 -17
  189. package/deps/rocksdb/rocksdb/db/log_writer.cc +135 -92
  190. package/deps/rocksdb/rocksdb/db/log_writer.h +11 -10
  191. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -3
  192. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -1
  193. package/deps/rocksdb/rocksdb/db/memtable.cc +82 -62
  194. package/deps/rocksdb/rocksdb/db/memtable.h +17 -9
  195. package/deps/rocksdb/rocksdb/db/memtable_list.cc +19 -13
  196. package/deps/rocksdb/rocksdb/db/memtable_list.h +3 -1
  197. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +38 -5
  198. package/deps/rocksdb/rocksdb/db/merge_context.h +3 -0
  199. package/deps/rocksdb/rocksdb/db/merge_helper.cc +34 -156
  200. package/deps/rocksdb/rocksdb/db/merge_helper.h +52 -46
  201. package/deps/rocksdb/rocksdb/db/merge_test.cc +16 -11
  202. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +289 -0
  203. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +918 -0
  204. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +4 -6
  205. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  206. package/deps/rocksdb/rocksdb/db/output_validator.cc +8 -12
  207. package/deps/rocksdb/rocksdb/db/output_validator.h +1 -4
  208. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +23 -4
  209. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +2 -3
  210. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -1
  211. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +2 -2
  212. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -6
  213. package/deps/rocksdb/rocksdb/db/prefix_test.cc +21 -8
  214. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +0 -2
  215. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +0 -1
  216. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +17 -4
  217. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +6 -3
  218. package/deps/rocksdb/rocksdb/db/repair.cc +35 -29
  219. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -2
  220. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +428 -156
  221. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +393 -227
  222. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +154 -82
  223. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +2 -2
  224. package/deps/rocksdb/rocksdb/db/table_cache.cc +9 -11
  225. package/deps/rocksdb/rocksdb/db/table_cache.h +2 -1
  226. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +8 -3
  227. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +27 -26
  228. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +23 -23
  229. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +5 -5
  230. package/deps/rocksdb/rocksdb/db/version_builder.cc +6 -0
  231. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +62 -29
  232. package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -2
  233. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -11
  234. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +291 -116
  235. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +54 -11
  236. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +3 -1
  237. package/deps/rocksdb/rocksdb/db/version_set.cc +301 -141
  238. package/deps/rocksdb/rocksdb/db/version_set.h +90 -33
  239. package/deps/rocksdb/rocksdb/db/version_set_test.cc +817 -193
  240. package/deps/rocksdb/rocksdb/db/version_util.h +10 -5
  241. package/deps/rocksdb/rocksdb/db/wal_manager.cc +15 -11
  242. package/deps/rocksdb/rocksdb/db/wal_manager.h +2 -1
  243. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +10 -9
  244. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +403 -28
  245. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +2 -2
  246. package/deps/rocksdb/rocksdb/db/write_batch.cc +204 -18
  247. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +4 -0
  248. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +149 -5
  249. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +7 -7
  250. package/deps/rocksdb/rocksdb/db/write_stall_stats.h +7 -7
  251. package/deps/rocksdb/rocksdb/db/write_thread.cc +86 -47
  252. package/deps/rocksdb/rocksdb/db/write_thread.h +2 -0
  253. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +176 -68
  254. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +337 -125
  255. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +38 -9
  256. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +126 -34
  257. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +1 -1
  258. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -2
  259. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +161 -1
  260. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +267 -9
  261. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +13 -7
  262. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +9 -9
  263. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +535 -86
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +27 -5
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +8 -15
  266. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +46 -21
  267. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +74 -4
  268. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +28 -11
  269. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +426 -151
  270. package/deps/rocksdb/rocksdb/env/composite_env.cc +1 -1
  271. package/deps/rocksdb/rocksdb/env/emulated_clock.h +6 -6
  272. package/deps/rocksdb/rocksdb/env/env.cc +21 -11
  273. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +9 -9
  274. package/deps/rocksdb/rocksdb/env/env_chroot.cc +3 -2
  275. package/deps/rocksdb/rocksdb/env/env_encryption.cc +3 -3
  276. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -2
  277. package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -10
  278. package/deps/rocksdb/rocksdb/env/env_test.cc +24 -18
  279. package/deps/rocksdb/rocksdb/env/file_system.cc +7 -6
  280. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +3 -3
  281. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +3 -3
  282. package/deps/rocksdb/rocksdb/env/fs_on_demand.cc +331 -0
  283. package/deps/rocksdb/rocksdb/env/fs_on_demand.h +139 -0
  284. package/deps/rocksdb/rocksdb/env/fs_posix.cc +14 -15
  285. package/deps/rocksdb/rocksdb/env/io_posix.cc +15 -10
  286. package/deps/rocksdb/rocksdb/env/io_posix.h +86 -92
  287. package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
  288. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +6 -6
  289. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +8 -6
  290. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -1
  291. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +599 -592
  292. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +312 -200
  293. package/deps/rocksdb/rocksdb/file/file_util.cc +19 -14
  294. package/deps/rocksdb/rocksdb/file/file_util.h +34 -24
  295. package/deps/rocksdb/rocksdb/file/filename.cc +32 -17
  296. package/deps/rocksdb/rocksdb/file/filename.h +51 -53
  297. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +82 -441
  298. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +7 -6
  299. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -5
  300. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +9 -3
  301. package/deps/rocksdb/rocksdb/file/read_write_util.h +3 -3
  302. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +6 -2
  303. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +9 -4
  304. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +8 -4
  305. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -89
  306. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +34 -17
  307. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +16 -0
  308. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +39 -189
  309. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +114 -0
  310. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +91 -6
  311. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +52 -7
  312. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -1
  313. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +27 -0
  314. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +146 -0
  315. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +2 -2
  316. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +254 -151
  317. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +39 -36
  318. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -1
  319. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +431 -0
  320. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +1 -1
  321. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +57 -23
  322. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +27 -57
  323. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +74 -0
  324. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +2 -1
  325. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  326. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +11 -11
  327. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +1 -1
  328. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +146 -71
  329. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +6 -1
  330. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +7 -4
  331. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +17 -13
  332. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -19
  333. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +5 -5
  334. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +10 -8
  335. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +18 -2
  336. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +12 -2
  337. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +3 -3
  338. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +118 -116
  339. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +4 -4
  340. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +26 -21
  341. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +18 -6
  342. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +1 -1
  343. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +5 -5
  344. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +8 -8
  345. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +12 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +4 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +3 -3
  348. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +8 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +1 -1
  350. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -4
  351. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +3 -3
  352. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +5 -6
  353. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +159 -167
  354. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +1 -2
  355. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +52 -17
  356. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +3 -4
  357. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/types_util.h +36 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +118 -20
  359. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  360. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +1 -1
  361. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +87 -45
  362. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +26 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +22 -1
  364. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +7 -9
  365. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +5 -6
  366. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +2 -2
  367. package/deps/rocksdb/rocksdb/logging/env_logger.h +3 -3
  368. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -1
  369. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -3
  370. package/deps/rocksdb/rocksdb/memory/arena.h +11 -0
  371. package/deps/rocksdb/rocksdb/memory/arena_test.cc +17 -2
  372. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +1 -1
  373. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +1 -0
  374. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  375. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -1
  376. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +11 -10
  377. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +8 -7
  378. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +2 -2
  379. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +2 -2
  380. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  381. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +3 -3
  382. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +2 -2
  383. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +3 -1
  384. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +2 -2
  385. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +20 -10
  386. package/deps/rocksdb/rocksdb/monitoring/histogram.h +15 -15
  387. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +7 -3
  388. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +14 -14
  389. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -1
  390. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +4 -0
  391. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +8 -1
  392. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -1
  393. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +5 -2
  394. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +64 -58
  395. package/deps/rocksdb/rocksdb/monitoring/statistics_impl.h +11 -12
  396. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  397. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +1 -1
  398. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +7 -1
  399. package/deps/rocksdb/rocksdb/options/cf_options.cc +20 -28
  400. package/deps/rocksdb/rocksdb/options/cf_options.h +7 -14
  401. package/deps/rocksdb/rocksdb/options/configurable.cc +20 -12
  402. package/deps/rocksdb/rocksdb/options/configurable_test.cc +4 -6
  403. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -2
  404. package/deps/rocksdb/rocksdb/options/customizable.cc +1 -1
  405. package/deps/rocksdb/rocksdb/options/customizable_test.cc +3 -2
  406. package/deps/rocksdb/rocksdb/options/db_options.cc +22 -48
  407. package/deps/rocksdb/rocksdb/options/db_options.h +3 -3
  408. package/deps/rocksdb/rocksdb/options/offpeak_time_info.cc +59 -0
  409. package/deps/rocksdb/rocksdb/options/offpeak_time_info.h +37 -0
  410. package/deps/rocksdb/rocksdb/options/options.cc +14 -6
  411. package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -13
  412. package/deps/rocksdb/rocksdb/options/options_helper.h +2 -3
  413. package/deps/rocksdb/rocksdb/options/options_parser.cc +35 -26
  414. package/deps/rocksdb/rocksdb/options/options_parser.h +4 -2
  415. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -3
  416. package/deps/rocksdb/rocksdb/options/options_test.cc +30 -23
  417. package/deps/rocksdb/rocksdb/port/lang.h +1 -1
  418. package/deps/rocksdb/rocksdb/port/port_example.h +7 -7
  419. package/deps/rocksdb/rocksdb/port/port_posix.cc +7 -7
  420. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -7
  421. package/deps/rocksdb/rocksdb/port/stack_trace.cc +85 -24
  422. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -2
  423. package/deps/rocksdb/rocksdb/port/win/io_win.cc +4 -4
  424. package/deps/rocksdb/rocksdb/port/win/io_win.h +13 -17
  425. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  426. package/deps/rocksdb/rocksdb/port/win/port_win.h +4 -4
  427. package/deps/rocksdb/rocksdb/src.mk +16 -1
  428. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -7
  429. package/deps/rocksdb/rocksdb/table/block_based/block.cc +39 -15
  430. package/deps/rocksdb/rocksdb/table/block_based/block.h +7 -7
  431. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +80 -40
  432. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +2 -3
  433. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +20 -5
  434. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +228 -122
  435. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +50 -9
  436. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +82 -25
  437. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +17 -20
  438. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +47 -13
  439. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +163 -50
  440. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +1 -2
  441. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +23 -23
  442. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -12
  443. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -2
  444. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +6 -4
  445. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +32 -27
  446. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -1
  447. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +7 -10
  448. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +2 -2
  449. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  450. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +25 -7
  451. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -5
  452. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +4 -6
  453. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +6 -6
  454. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -1
  455. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -5
  456. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +2 -2
  457. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -5
  458. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +138 -86
  459. package/deps/rocksdb/rocksdb/table/block_fetcher.h +22 -0
  460. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +26 -13
  461. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +11 -11
  462. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +11 -11
  463. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +10 -5
  464. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +6 -7
  465. package/deps/rocksdb/rocksdb/table/format.cc +15 -21
  466. package/deps/rocksdb/rocksdb/table/format.h +8 -0
  467. package/deps/rocksdb/rocksdb/table/get_context.cc +121 -78
  468. package/deps/rocksdb/rocksdb/table/get_context.h +11 -6
  469. package/deps/rocksdb/rocksdb/table/internal_iterator.h +12 -5
  470. package/deps/rocksdb/rocksdb/table/iterator.cc +4 -0
  471. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -1
  472. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -1
  473. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +5 -0
  474. package/deps/rocksdb/rocksdb/table/merging_iterator.h +4 -3
  475. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +15 -11
  476. package/deps/rocksdb/rocksdb/table/meta_blocks.h +8 -4
  477. package/deps/rocksdb/rocksdb/table/mock_table.cc +12 -8
  478. package/deps/rocksdb/rocksdb/table/mock_table.h +1 -3
  479. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +0 -1
  480. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -21
  481. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +4 -14
  482. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +7 -8
  483. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +7 -5
  484. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +15 -8
  485. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +1 -1
  486. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +75 -30
  487. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +7 -2
  488. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +76 -11
  489. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +358 -2
  490. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +93 -16
  491. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +12 -12
  492. package/deps/rocksdb/rocksdb/table/table_builder.h +12 -6
  493. package/deps/rocksdb/rocksdb/table/table_iterator.h +69 -0
  494. package/deps/rocksdb/rocksdb/table/table_properties.cc +1 -1
  495. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +8 -6
  496. package/deps/rocksdb/rocksdb/table/table_test.cc +732 -121
  497. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +3 -1
  498. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/unique_id.cc +2 -2
  500. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +2 -2
  501. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +5 -5
  502. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -6
  503. package/deps/rocksdb/rocksdb/test_util/testharness.cc +2 -4
  504. package/deps/rocksdb/rocksdb/test_util/testutil.cc +56 -32
  505. package/deps/rocksdb/rocksdb/test_util/testutil.h +57 -34
  506. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +18 -1
  507. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  508. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  509. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +210 -112
  510. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +3 -3
  511. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +1 -1
  512. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +22 -27
  513. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +10 -4
  514. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +328 -59
  515. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +34 -2
  516. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +64 -17
  517. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +8 -1
  518. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +3 -2
  519. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +136 -10
  520. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -2
  521. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +50 -8
  522. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +51 -45
  523. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +1 -1
  524. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +10 -10
  525. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +14 -4
  526. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +2 -1
  527. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +2 -2
  528. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -4
  529. package/deps/rocksdb/rocksdb/util/atomic.h +111 -0
  530. package/deps/rocksdb/rocksdb/util/autovector.h +5 -1
  531. package/deps/rocksdb/rocksdb/util/bloom_test.cc +12 -2
  532. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  533. package/deps/rocksdb/rocksdb/util/coding.h +34 -38
  534. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -1
  535. package/deps/rocksdb/rocksdb/util/comparator.cc +18 -5
  536. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -1
  537. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +4 -4
  538. package/deps/rocksdb/rocksdb/util/crc32c.cc +3 -6
  539. package/deps/rocksdb/rocksdb/util/crc32c.h +3 -3
  540. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +3 -4
  541. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -2
  542. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +2 -4
  543. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -4
  544. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -2
  545. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +3 -3
  546. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +83 -59
  547. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -3
  548. package/deps/rocksdb/rocksdb/util/hash.h +4 -4
  549. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +3 -3
  550. package/deps/rocksdb/rocksdb/util/murmurhash.cc +1 -1
  551. package/deps/rocksdb/rocksdb/util/random.cc +3 -4
  552. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +23 -43
  553. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +21 -16
  554. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +44 -24
  555. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +2 -3
  556. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +2 -10
  557. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +2 -2
  558. package/deps/rocksdb/rocksdb/util/slice.cc +4 -5
  559. package/deps/rocksdb/rocksdb/util/slice_test.cc +70 -4
  560. package/deps/rocksdb/rocksdb/util/status.cc +1 -1
  561. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +39 -7
  562. package/deps/rocksdb/rocksdb/util/stderr_logger.h +12 -2
  563. package/deps/rocksdb/rocksdb/util/string_util.cc +31 -18
  564. package/deps/rocksdb/rocksdb/util/string_util.h +9 -9
  565. package/deps/rocksdb/rocksdb/util/string_util_test.cc +36 -0
  566. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +5 -5
  567. package/deps/rocksdb/rocksdb/util/thread_local.cc +1 -1
  568. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +3 -4
  569. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +1 -1
  570. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +4 -4
  571. package/deps/rocksdb/rocksdb/util/vector_iterator.h +12 -16
  572. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  573. package/deps/rocksdb/rocksdb/util/xxhash.h +116 -116
  574. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +4 -5
  575. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_impl.h +2 -2
  576. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -2
  577. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +33 -31
  578. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -22
  579. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +9 -7
  580. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +3 -6
  581. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +22 -55
  582. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +113 -74
  583. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +36 -24
  584. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +27 -11
  585. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -3
  586. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +68 -54
  587. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -6
  588. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +16 -16
  589. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +3 -2
  590. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +29 -9
  591. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +27 -14
  592. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +2 -4
  593. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +3 -3
  594. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +2 -4
  595. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -4
  596. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +2 -4
  597. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +2 -4
  598. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +2 -4
  599. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +8 -8
  600. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -7
  601. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -8
  602. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +2 -4
  603. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +9 -7
  604. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +7 -10
  605. package/deps/rocksdb/rocksdb/utilities/debug.cc +6 -2
  606. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +18 -11
  607. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +2 -2
  608. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +18 -25
  609. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +32 -23
  610. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +51 -48
  611. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +5 -3
  612. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -2
  613. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  614. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +2 -3
  615. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +3 -1
  616. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +7 -7
  617. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +10 -10
  618. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +5 -6
  619. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +5 -6
  620. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +1 -1
  621. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -8
  622. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +29 -21
  623. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +14 -15
  624. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -2
  625. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -1
  626. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +3 -3
  627. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -5
  628. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  629. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +2 -2
  630. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +8 -8
  631. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +4 -4
  632. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +1 -1
  633. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +6 -9
  634. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +2 -2
  635. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +1 -1
  636. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +6 -6
  637. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +1 -2
  638. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +2 -3
  639. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  640. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +1 -1
  641. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  642. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +5 -0
  643. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +1 -1
  644. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +3 -3
  645. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +1 -1
  646. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +4 -0
  647. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +4 -0
  648. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  649. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +4 -0
  650. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +12 -3
  651. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +17 -3
  652. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +3 -3
  653. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +1 -1
  654. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +3 -3
  655. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +4 -2
  656. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +1 -1
  657. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +1 -2
  658. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -3
  659. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +3 -4
  660. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +442 -10
  661. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +27 -9
  662. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +28 -7
  663. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +70 -12
  664. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +50 -22
  665. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -1
  666. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -1
  667. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +64 -3
  668. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +76 -17
  669. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +6 -6
  670. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +573 -77
  671. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -2
  672. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +65 -3
  673. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +13 -11
  674. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +1 -0
  675. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +14 -16
  676. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +37 -24
  677. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +23 -29
  678. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +4 -2
  679. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +31 -40
  680. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +8 -6
  681. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +3 -4
  682. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +34 -18
  683. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +21 -25
  684. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +26 -5
  685. package/deps/rocksdb/rocksdb/utilities/types_util.cc +88 -0
  686. package/deps/rocksdb/rocksdb/utilities/types_util_test.cc +98 -0
  687. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -1
  688. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +463 -90
  689. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +259 -76
  690. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +70 -14
  691. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +609 -10
  692. package/deps/rocksdb/rocksdb.gyp +8 -4
  693. package/index.js +18 -4
  694. package/max_rev_operator.h +2 -0
  695. package/package.json +2 -2
  696. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  697. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  698. package/util.h +29 -5
  699. package/.tap/coverage/4c642b53-6895-4ef0-9391-7c6b8d484262.json +0 -14334
  700. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +0 -57
@@ -92,7 +92,7 @@ class ExternalSSTFileTest
92
92
  : public ExternalSSTFileTestBase,
93
93
  public ::testing::WithParamInterface<std::tuple<bool, bool>> {
94
94
  public:
95
- ExternalSSTFileTest() {}
95
+ ExternalSSTFileTest() = default;
96
96
 
97
97
  Status GenerateOneExternalFile(
98
98
  const Options& options, ColumnFamilyHandle* cfh,
@@ -295,6 +295,25 @@ class ExternalSSTFileTest
295
295
  int last_file_id_ = 0;
296
296
  };
297
297
 
298
+ TEST_F(ExternalSSTFileTest, ComparatorMismatch) {
299
+ Options options = CurrentOptions();
300
+ Options options_diff_ucmp = options;
301
+
302
+ options.comparator = BytewiseComparator();
303
+ options_diff_ucmp.comparator = ReverseBytewiseComparator();
304
+
305
+ SstFileWriter sst_file_writer(EnvOptions(), options_diff_ucmp);
306
+
307
+ std::string file = sst_files_dir_ + "file.sst";
308
+ ASSERT_OK(sst_file_writer.Open(file));
309
+ ASSERT_OK(sst_file_writer.Put("foo", "val"));
310
+ ASSERT_OK(sst_file_writer.Put("bar", "val1"));
311
+ ASSERT_OK(sst_file_writer.Finish());
312
+
313
+ DestroyAndReopen(options);
314
+ ASSERT_NOK(DeprecatedAddFile({file}));
315
+ }
316
+
298
317
  TEST_F(ExternalSSTFileTest, Basic) {
299
318
  do {
300
319
  Options options = CurrentOptions();
@@ -832,7 +851,7 @@ TEST_F(ExternalSSTFileTest, AddList) {
832
851
  TablePropertiesCollection props;
833
852
  ASSERT_OK(db_->GetPropertiesOfAllTables(&props));
834
853
  ASSERT_EQ(props.size(), 2);
835
- for (auto file_props : props) {
854
+ for (const auto& file_props : props) {
836
855
  auto user_props = file_props.second->user_collected_properties;
837
856
  ASSERT_EQ(user_props["abc_SstFileWriterCollector"], "YES");
838
857
  ASSERT_EQ(user_props["xyz_SstFileWriterCollector"], "YES");
@@ -855,7 +874,7 @@ TEST_F(ExternalSSTFileTest, AddList) {
855
874
 
856
875
  ASSERT_OK(db_->GetPropertiesOfAllTables(&props));
857
876
  ASSERT_EQ(props.size(), 3);
858
- for (auto file_props : props) {
877
+ for (const auto& file_props : props) {
859
878
  auto user_props = file_props.second->user_collected_properties;
860
879
  ASSERT_EQ(user_props["abc_SstFileWriterCollector"], "YES");
861
880
  ASSERT_EQ(user_props["xyz_SstFileWriterCollector"], "YES");
@@ -1714,9 +1733,8 @@ TEST_F(ExternalSSTFileTest, WithUnorderedWrite) {
1714
1733
  {"DBImpl::WaitForPendingWrites:BeforeBlock",
1715
1734
  "DBImpl::WriteImpl:BeforeUnorderedWriteMemtable"}});
1716
1735
  SyncPoint::GetInstance()->SetCallBack(
1717
- "DBImpl::IngestExternalFile:NeedFlush", [&](void* need_flush) {
1718
- ASSERT_TRUE(*reinterpret_cast<bool*>(need_flush));
1719
- });
1736
+ "DBImpl::IngestExternalFile:NeedFlush",
1737
+ [&](void* need_flush) { ASSERT_TRUE(*static_cast<bool*>(need_flush)); });
1720
1738
 
1721
1739
  Options options = CurrentOptions();
1722
1740
  options.unordered_write = true;
@@ -1848,6 +1866,92 @@ TEST_P(ExternalSSTFileTest, IngestFileWithGlobalSeqnoAssignedLevel) {
1848
1866
  VerifyDBFromMap(true_data, &kcnt, false);
1849
1867
  }
1850
1868
 
1869
+ TEST_P(ExternalSSTFileTest, IngestFileWithGlobalSeqnoAssignedUniversal) {
1870
+ bool write_global_seqno = std::get<0>(GetParam());
1871
+ bool verify_checksums_before_ingest = std::get<1>(GetParam());
1872
+ Options options = CurrentOptions();
1873
+ options.num_levels = 5;
1874
+ options.compaction_style = kCompactionStyleUniversal;
1875
+ options.disable_auto_compactions = true;
1876
+ DestroyAndReopen(options);
1877
+ std::vector<std::pair<std::string, std::string>> file_data;
1878
+ std::map<std::string, std::string> true_data;
1879
+
1880
+ // Write 200 -> 250 into the bottommost level
1881
+ for (int i = 200; i <= 250; i++) {
1882
+ ASSERT_OK(Put(Key(i), "bottommost"));
1883
+ true_data[Key(i)] = "bottommost";
1884
+ }
1885
+ CompactRangeOptions cro;
1886
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1887
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1888
+ ASSERT_EQ("0,0,0,0,1", FilesPerLevel());
1889
+
1890
+ // Take a snapshot to enforce global sequence number.
1891
+ const Snapshot* snap = db_->GetSnapshot();
1892
+
1893
+ // Insert 100 -> 200 into the memtable
1894
+ for (int i = 100; i <= 200; i++) {
1895
+ ASSERT_OK(Put(Key(i), "memtable"));
1896
+ true_data[Key(i)] = "memtable";
1897
+ }
1898
+
1899
+ // Insert 0 -> 20 using AddFile
1900
+ file_data.clear();
1901
+ for (int i = 0; i <= 20; i++) {
1902
+ file_data.emplace_back(Key(i), "L4");
1903
+ }
1904
+
1905
+ ASSERT_OK(GenerateAndAddExternalFile(
1906
+ options, file_data, -1, true, write_global_seqno,
1907
+ verify_checksums_before_ingest, false, false, &true_data));
1908
+
1909
+ // This file don't overlap with anything in the DB, will go to L4
1910
+ ASSERT_EQ("0,0,0,0,2", FilesPerLevel());
1911
+
1912
+ // Insert 80 -> 130 using AddFile
1913
+ file_data.clear();
1914
+ for (int i = 80; i <= 130; i++) {
1915
+ file_data.emplace_back(Key(i), "L0");
1916
+ }
1917
+ ASSERT_OK(GenerateAndAddExternalFile(
1918
+ options, file_data, -1, true, write_global_seqno,
1919
+ verify_checksums_before_ingest, false, false, &true_data));
1920
+
1921
+ // This file overlap with the memtable, so it will flush it and add
1922
+ // it self to L0
1923
+ ASSERT_EQ("2,0,0,0,2", FilesPerLevel());
1924
+
1925
+ // Insert 30 -> 50 using AddFile
1926
+ file_data.clear();
1927
+ for (int i = 30; i <= 50; i++) {
1928
+ file_data.emplace_back(Key(i), "L4");
1929
+ }
1930
+ ASSERT_OK(GenerateAndAddExternalFile(
1931
+ options, file_data, -1, true, write_global_seqno,
1932
+ verify_checksums_before_ingest, false, false, &true_data));
1933
+
1934
+ // This file don't overlap with anything in the DB and fit in L4 as well
1935
+ ASSERT_EQ("2,0,0,0,3", FilesPerLevel());
1936
+
1937
+ // Insert 10 -> 40 using AddFile
1938
+ file_data.clear();
1939
+ for (int i = 10; i <= 40; i++) {
1940
+ file_data.emplace_back(Key(i), "L3");
1941
+ }
1942
+ ASSERT_OK(GenerateAndAddExternalFile(
1943
+ options, file_data, -1, true, write_global_seqno,
1944
+ verify_checksums_before_ingest, false, false, &true_data));
1945
+
1946
+ // This file overlap with files in L4, we will ingest it into the last
1947
+ // non-overlapping and non-empty level, in this case, it's L0.
1948
+ ASSERT_EQ("3,0,0,0,3", FilesPerLevel());
1949
+
1950
+ size_t kcnt = 0;
1951
+ VerifyDBFromMap(true_data, &kcnt, false);
1952
+ db_->ReleaseSnapshot(snap);
1953
+ }
1954
+
1851
1955
  TEST_P(ExternalSSTFileTest, IngestFileWithGlobalSeqnoMemtableFlush) {
1852
1956
  Options options = CurrentOptions();
1853
1957
  DestroyAndReopen(options);
@@ -2878,7 +2982,7 @@ TEST_P(ExternalSSTFileTest, IngestFilesTriggerFlushingWithTwoWriteQueue) {
2878
2982
  // currently at the front of the 2nd writer queue. We must make
2879
2983
  // sure that it won't enter the 2nd writer queue for the second time.
2880
2984
  std::vector<std::pair<std::string, std::string>> data;
2881
- data.push_back(std::make_pair("1001", "v2"));
2985
+ data.emplace_back("1001", "v2");
2882
2986
  ASSERT_OK(GenerateAndAddExternalFile(options, data, -1, true));
2883
2987
  }
2884
2988
 
@@ -2978,6 +3082,593 @@ TEST_P(ExternalSSTFileTest,
2978
3082
  delete iter;
2979
3083
  }
2980
3084
 
3085
+ TEST_F(ExternalSSTFileTest, FIFOCompaction) {
3086
+ // FIFO always ingests SST files to L0 and assign latest sequence number.
3087
+ Options options = CurrentOptions();
3088
+ options.num_levels = 1;
3089
+ options.compaction_style = kCompactionStyleFIFO;
3090
+ options.max_open_files = -1;
3091
+ DestroyAndReopen(options);
3092
+ std::map<std::string, std::string> true_data;
3093
+
3094
+ for (int i = 0; i < 100; ++i) {
3095
+ ASSERT_OK(Put(Key(i), Key(i) + "_val"));
3096
+ true_data[Key(i)] = Key(i) + "_val";
3097
+ }
3098
+ ASSERT_OK(Flush());
3099
+ ASSERT_EQ("1", FilesPerLevel());
3100
+ std::vector<std::pair<std::string, std::string>> file_data;
3101
+ for (int i = 0; i <= 20; i++) {
3102
+ file_data.emplace_back(Key(i), Key(i) + "_ingest");
3103
+ }
3104
+ // Overlaps with memtable, will trigger flush
3105
+ ASSERT_OK(GenerateAndAddExternalFile(options, file_data, -1,
3106
+ /*allow_global_seqno=*/true, true, false,
3107
+ false, false, &true_data));
3108
+ ASSERT_EQ("2", FilesPerLevel());
3109
+
3110
+ file_data.clear();
3111
+ for (int i = 100; i <= 120; i++) {
3112
+ file_data.emplace_back(Key(i), Key(i) + "_ingest");
3113
+ }
3114
+ // global sequence number is always assigned, so this will fail
3115
+ ASSERT_NOK(GenerateAndAddExternalFile(options, file_data, -1,
3116
+ /*allow_global_seqno=*/false, true,
3117
+ false, false, false, &true_data));
3118
+ ASSERT_OK(GenerateAndAddExternalFile(options, file_data, -1,
3119
+ /*allow_global_seqno=*/true, true, false,
3120
+ false, false, &true_data));
3121
+
3122
+ // Compact to data to lower level to test multi-level FIFO later
3123
+ options.num_levels = 7;
3124
+ options.compaction_style = kCompactionStyleUniversal;
3125
+ ASSERT_OK(TryReopen(options));
3126
+ CompactRangeOptions cro;
3127
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForceOptimized;
3128
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
3129
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
3130
+
3131
+ options.num_levels = 7;
3132
+ options.compaction_style = kCompactionStyleFIFO;
3133
+ ASSERT_OK(TryReopen(options));
3134
+ file_data.clear();
3135
+ for (int i = 200; i <= 220; i++) {
3136
+ file_data.emplace_back(Key(i), Key(i) + "_ingest");
3137
+ }
3138
+ // Files are ingested into L0 for multi-level FIFO
3139
+ ASSERT_OK(GenerateAndAddExternalFile(options, file_data, -1,
3140
+ /*allow_global_seqno=*/true, true, false,
3141
+ false, false, &true_data));
3142
+
3143
+ ASSERT_EQ("1,0,0,0,0,0,1", FilesPerLevel());
3144
+ VerifyDBFromMap(true_data);
3145
+ }
3146
+
3147
+ class ExternalSSTFileWithTimestampTest : public ExternalSSTFileTest {
3148
+ public:
3149
+ ExternalSSTFileWithTimestampTest() = default;
3150
+
3151
+ static const std::string kValueNotFound;
3152
+ static const std::string kTsNotFound;
3153
+
3154
+ std::string EncodeAsUint64(uint64_t v) {
3155
+ std::string dst;
3156
+ PutFixed64(&dst, v);
3157
+ return dst;
3158
+ }
3159
+
3160
+ Status IngestExternalUDTFile(const std::vector<std::string>& files,
3161
+ bool allow_global_seqno = true) {
3162
+ IngestExternalFileOptions opts;
3163
+ opts.snapshot_consistency = true;
3164
+ opts.allow_global_seqno = allow_global_seqno;
3165
+ return db_->IngestExternalFile(files, opts);
3166
+ }
3167
+
3168
+ void VerifyValueAndTs(const std::string& key,
3169
+ const std::string& read_timestamp,
3170
+ const std::string& expected_value,
3171
+ const std::string& expected_timestamp) {
3172
+ Slice read_ts = read_timestamp;
3173
+ ReadOptions read_options;
3174
+ read_options.timestamp = &read_ts;
3175
+ std::string value;
3176
+ std::string timestamp;
3177
+ Status s = db_->Get(read_options, key, &value, &timestamp);
3178
+ if (s.ok()) {
3179
+ ASSERT_EQ(value, expected_value);
3180
+ ASSERT_EQ(timestamp, expected_timestamp);
3181
+ } else if (s.IsNotFound()) {
3182
+ ASSERT_EQ(kValueNotFound, expected_value);
3183
+ ASSERT_EQ(kTsNotFound, expected_timestamp);
3184
+ } else {
3185
+ assert(false);
3186
+ }
3187
+ }
3188
+ };
3189
+
3190
+ const std::string ExternalSSTFileWithTimestampTest::kValueNotFound =
3191
+ "NOT_FOUND";
3192
+ const std::string ExternalSSTFileWithTimestampTest::kTsNotFound =
3193
+ "NOT_FOUND_TS";
3194
+
3195
+ TEST_F(ExternalSSTFileWithTimestampTest, Basic) {
3196
+ do {
3197
+ Options options = CurrentOptions();
3198
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
3199
+ options.persist_user_defined_timestamps = true;
3200
+
3201
+ DestroyAndReopen(options);
3202
+
3203
+ SstFileWriter sst_file_writer(EnvOptions(), options);
3204
+
3205
+ // Current file size should be 0 after sst_file_writer init and before open
3206
+ // a file.
3207
+ ASSERT_EQ(sst_file_writer.FileSize(), 0);
3208
+
3209
+ // file1.sst [0, 50)
3210
+ std::string file1 = sst_files_dir_ + "file1.sst";
3211
+ ASSERT_OK(sst_file_writer.Open(file1));
3212
+ for (int k = 0; k < 50; k++) {
3213
+ // write 3 versions of values for each key, write newer version first
3214
+ // they are treated as logically smaller by the comparator.
3215
+ for (int version = 3; version > 0; version--) {
3216
+ ASSERT_OK(
3217
+ sst_file_writer.Put(Key(k), EncodeAsUint64(k + version),
3218
+ Key(k) + "_val" + std::to_string(version)));
3219
+ }
3220
+ }
3221
+
3222
+ ExternalSstFileInfo file1_info;
3223
+ ASSERT_OK(sst_file_writer.Finish(&file1_info));
3224
+ // sst_file_writer already finished, cannot add this value
3225
+ ASSERT_NOK(sst_file_writer.Put(Key(100), EncodeAsUint64(1), "bad_val"));
3226
+
3227
+ ASSERT_EQ(file1_info.file_path, file1);
3228
+ ASSERT_EQ(file1_info.num_entries, 150);
3229
+ ASSERT_EQ(file1_info.smallest_key, Key(0) + EncodeAsUint64(0 + 3));
3230
+ ASSERT_EQ(file1_info.largest_key, Key(49) + EncodeAsUint64(49 + 1));
3231
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3232
+ // Add file using file path
3233
+ ASSERT_OK(IngestExternalUDTFile({file1}));
3234
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3235
+
3236
+ for (int k = 0; k < 50; k++) {
3237
+ for (int version = 3; version > 0; version--) {
3238
+ VerifyValueAndTs(Key(k), EncodeAsUint64(k + version),
3239
+ Key(k) + "_val" + std::to_string(version),
3240
+ EncodeAsUint64(k + version));
3241
+ }
3242
+ }
3243
+
3244
+ // file2.sst [50, 200)
3245
+ // Put [key=k, ts=k, value=k_val] for k in [50, 200)
3246
+ // RangeDelete[start_key=75, end_key=125, ts=100]
3247
+ std::string file2 = sst_files_dir_ + "file2.sst";
3248
+ int range_del_begin = 75, range_del_end = 125, range_del_ts = 100;
3249
+ ASSERT_OK(sst_file_writer.Open(file2));
3250
+ for (int k = 50; k < 200; k++) {
3251
+ ASSERT_OK(
3252
+ sst_file_writer.Put(Key(k), EncodeAsUint64(k), Key(k) + "_val"));
3253
+ if (k == range_del_ts) {
3254
+ ASSERT_OK(sst_file_writer.DeleteRange(
3255
+ Key(range_del_begin), Key(range_del_end), EncodeAsUint64(k)));
3256
+ }
3257
+ }
3258
+
3259
+ ExternalSstFileInfo file2_info;
3260
+ ASSERT_OK(sst_file_writer.Finish(&file2_info));
3261
+
3262
+ // Current file size should be non-zero after success write.
3263
+ ASSERT_GT(sst_file_writer.FileSize(), 0);
3264
+
3265
+ ASSERT_EQ(file2_info.file_path, file2);
3266
+ ASSERT_EQ(file2_info.num_entries, 150);
3267
+ ASSERT_EQ(file2_info.smallest_key, Key(50) + EncodeAsUint64(50));
3268
+ ASSERT_EQ(file2_info.largest_key, Key(199) + EncodeAsUint64(199));
3269
+ ASSERT_EQ(file2_info.num_range_del_entries, 1);
3270
+ ASSERT_EQ(file2_info.smallest_range_del_key,
3271
+ Key(range_del_begin) + EncodeAsUint64(range_del_ts));
3272
+ ASSERT_EQ(file2_info.largest_range_del_key,
3273
+ Key(range_del_end) + EncodeAsUint64(range_del_ts));
3274
+ // Add file using file path
3275
+ ASSERT_OK(IngestExternalUDTFile({file2}));
3276
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3277
+
3278
+ for (int k = 50; k < 200; k++) {
3279
+ if (k < range_del_begin || k >= range_del_end) {
3280
+ VerifyValueAndTs(Key(k), EncodeAsUint64(k), Key(k) + "_val",
3281
+ EncodeAsUint64(k));
3282
+ }
3283
+ // else {
3284
+ // // FIXME(yuzhangyu): when range tombstone and point data has the
3285
+ // // same seq, on read path, make range tombstone overrides point
3286
+ // // data if it has a newer user-defined timestamp. This is how
3287
+ // // we determine point data's overriding relationship, so we
3288
+ // // should keep it consistent.
3289
+ // VerifyValueAndTs(Key(k), EncodeAsUint64(k), Key(k) + "_val",
3290
+ // EncodeAsUint64(k));
3291
+ // VerifyValueAndTs(Key(k), EncodeAsUint64(range_del_ts),
3292
+ // kValueNotFound,
3293
+ // kTsNotFound);
3294
+ // }
3295
+ }
3296
+
3297
+ // file3.sst [100, 200), key range overlap with db
3298
+ std::string file3 = sst_files_dir_ + "file3.sst";
3299
+ ASSERT_OK(sst_file_writer.Open(file3));
3300
+ for (int k = 100; k < 200; k++) {
3301
+ ASSERT_OK(
3302
+ sst_file_writer.Put(Key(k), EncodeAsUint64(k + 1), Key(k) + "_val1"));
3303
+ }
3304
+ ExternalSstFileInfo file3_info;
3305
+ ASSERT_OK(sst_file_writer.Finish(&file3_info));
3306
+ ASSERT_EQ(file3_info.file_path, file3);
3307
+ ASSERT_EQ(file3_info.num_entries, 100);
3308
+ ASSERT_EQ(file3_info.smallest_key, Key(100) + EncodeAsUint64(101));
3309
+ ASSERT_EQ(file3_info.largest_key, Key(199) + EncodeAsUint64(200));
3310
+
3311
+ // Allowing ingesting a file containing overlap key range with the db is
3312
+ // not safe without verifying the overlapped key has a higher timestamp
3313
+ // than what the db contains, so we do not allow this regardless of
3314
+ // whether global sequence number is allowed.
3315
+ ASSERT_NOK(IngestExternalUDTFile({file2}));
3316
+ ASSERT_NOK(IngestExternalUDTFile({file2}, /*allow_global_seqno*/ false));
3317
+
3318
+ // Write [0, 50)
3319
+ // Write to DB newer versions to cover ingested data and move sequence
3320
+ // number forward.
3321
+ for (int k = 0; k < 50; k++) {
3322
+ ASSERT_OK(dbfull()->Put(WriteOptions(), Key(k), EncodeAsUint64(k + 4),
3323
+ Key(k) + "_val" + std::to_string(4)));
3324
+ }
3325
+
3326
+ // Read all 4 versions (3 from ingested, 1 from live writes).
3327
+ for (int k = 0; k < 50; k++) {
3328
+ for (int version = 4; version > 0; version--) {
3329
+ VerifyValueAndTs(Key(k), EncodeAsUint64(k + version),
3330
+ Key(k) + "_val" + std::to_string(version),
3331
+ EncodeAsUint64(k + version));
3332
+ }
3333
+ }
3334
+ SequenceNumber seq_num_before_ingestion = db_->GetLatestSequenceNumber();
3335
+ ASSERT_GT(seq_num_before_ingestion, 0U);
3336
+
3337
+ // file4.sst [200, 250)
3338
+ std::string file4 = sst_files_dir_ + "file4.sst";
3339
+ ASSERT_OK(sst_file_writer.Open(file4));
3340
+ for (int k = 200; k < 250; k++) {
3341
+ ASSERT_OK(
3342
+ sst_file_writer.Put(Key(k), EncodeAsUint64(k), Key(k) + "_val"));
3343
+ }
3344
+
3345
+ ExternalSstFileInfo file4_info;
3346
+ ASSERT_OK(sst_file_writer.Finish(&file4_info));
3347
+
3348
+ // Current file size should be non-zero after success write.
3349
+ ASSERT_GT(sst_file_writer.FileSize(), 0);
3350
+
3351
+ ASSERT_EQ(file4_info.file_path, file4);
3352
+ ASSERT_EQ(file4_info.num_entries, 50);
3353
+ ASSERT_EQ(file4_info.smallest_key, Key(200) + EncodeAsUint64(200));
3354
+ ASSERT_EQ(file4_info.largest_key, Key(249) + EncodeAsUint64(249));
3355
+ ASSERT_EQ(file4_info.num_range_del_entries, 0);
3356
+ ASSERT_EQ(file4_info.smallest_range_del_key, "");
3357
+ ASSERT_EQ(file4_info.largest_range_del_key, "");
3358
+
3359
+ ASSERT_OK(IngestExternalUDTFile({file4}));
3360
+
3361
+ // In UDT mode, any external file that can be successfully ingested also
3362
+ // should not overlap with the db. As a result, they can always get the
3363
+ // seq 0 assigned.
3364
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), seq_num_before_ingestion);
3365
+
3366
+ DestroyAndRecreateExternalSSTFilesDir();
3367
+ } while (ChangeOptions(kSkipPlainTable | kSkipFIFOCompaction |
3368
+ kRangeDelSkipConfigs));
3369
+ }
3370
+
3371
+ TEST_F(ExternalSSTFileWithTimestampTest, SanityCheck) {
3372
+ Options options = CurrentOptions();
3373
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
3374
+ options.persist_user_defined_timestamps = true;
3375
+ DestroyAndReopen(options);
3376
+
3377
+ SstFileWriter sst_file_writer(EnvOptions(), options);
3378
+
3379
+ // file1.sst [0, 100)
3380
+ std::string file1 = sst_files_dir_ + "file1.sst";
3381
+ ASSERT_OK(sst_file_writer.Open(file1));
3382
+ for (int k = 0; k < 100; k++) {
3383
+ ASSERT_OK(sst_file_writer.Put(Key(k), EncodeAsUint64(k), Key(k) + "_val"));
3384
+ }
3385
+
3386
+ ExternalSstFileInfo file1_info;
3387
+ ASSERT_OK(sst_file_writer.Finish(&file1_info));
3388
+
3389
+ // file2.sst [50, 75)
3390
+ std::string file2 = sst_files_dir_ + "file2.sst";
3391
+ ASSERT_OK(sst_file_writer.Open(file2));
3392
+ for (int k = 50; k < 75; k++) {
3393
+ ASSERT_OK(
3394
+ sst_file_writer.Put(Key(k), EncodeAsUint64(k + 2), Key(k) + "_val"));
3395
+ }
3396
+ ExternalSstFileInfo file2_info;
3397
+ ASSERT_OK(sst_file_writer.Finish(&file2_info));
3398
+
3399
+ // Cannot ingest when files' user key range overlaps. There is no
3400
+ // straightforward way to assign sequence number to the files so that they
3401
+ // meet the user-defined timestamps invariant: for the same user provided key,
3402
+ // the entry with a higher sequence number should not have a smaller
3403
+ // timestamp. In this case: file1 has (key=k, ts=k) for k in [50, 75),
3404
+ // file2 has (key=k, ts=k+2) for k in [50, 75).
3405
+ // The invariant is only met if file2 is ingested after file1. In other cases
3406
+ // when user key ranges are interleaved in files, no order of ingestion can
3407
+ // guarantee this invariant. So we do not allow ingesting files with
3408
+ // overlapping key ranges.
3409
+ ASSERT_TRUE(IngestExternalUDTFile({file1, file2}).IsNotSupported());
3410
+
3411
+ options.allow_ingest_behind = true;
3412
+ DestroyAndReopen(options);
3413
+ IngestExternalFileOptions opts;
3414
+
3415
+ // TODO(yuzhangyu): support ingestion behind for user-defined timestamps?
3416
+ // Ingesting external files with user-defined timestamps requires searching
3417
+ // through the whole lsm tree to make sure there is no key range overlap with
3418
+ // the db. Ingestion behind currently is doing a simply placing it at the
3419
+ // bottom level step without a search, so we don't allow it either.
3420
+ opts.ingest_behind = true;
3421
+ ASSERT_TRUE(db_->IngestExternalFile({file1}, opts).IsNotSupported());
3422
+
3423
+ DestroyAndRecreateExternalSSTFilesDir();
3424
+ }
3425
+
3426
+ TEST_F(ExternalSSTFileWithTimestampTest, UDTSettingsCompatibilityCheck) {
3427
+ Options options = CurrentOptions();
3428
+ Options disable_udt_options = options;
3429
+ Options not_persist_udt_options = options;
3430
+ Options persist_udt_options = options;
3431
+ disable_udt_options.comparator = BytewiseComparator();
3432
+ not_persist_udt_options.comparator =
3433
+ test::BytewiseComparatorWithU64TsWrapper();
3434
+ not_persist_udt_options.persist_user_defined_timestamps = false;
3435
+ not_persist_udt_options.allow_concurrent_memtable_write = false;
3436
+ persist_udt_options.comparator = test::BytewiseComparatorWithU64TsWrapper();
3437
+ persist_udt_options.persist_user_defined_timestamps = true;
3438
+
3439
+ EnvOptions env_options = EnvOptions();
3440
+
3441
+ SstFileWriter disable_udt_sst_writer(env_options, disable_udt_options);
3442
+ SstFileWriter not_persist_udt_sst_writer(env_options,
3443
+ not_persist_udt_options);
3444
+ SstFileWriter persist_udt_sst_writer(env_options, persist_udt_options);
3445
+
3446
+ // File1: [0, 50), contains no timestamps
3447
+ // comparator name: leveldb.BytewiseComparator
3448
+ // user_defined_timestamps_persisted: true
3449
+ std::string disable_udt_sst_file = sst_files_dir_ + "file1.sst";
3450
+ ASSERT_OK(disable_udt_sst_writer.Open(disable_udt_sst_file));
3451
+ for (int k = 0; k < 50; k++) {
3452
+ ASSERT_NOK(
3453
+ disable_udt_sst_writer.Put(Key(k), EncodeAsUint64(1), Key(k) + "_val"));
3454
+ ASSERT_OK(disable_udt_sst_writer.Put(Key(k), Key(k) + "_val"));
3455
+ }
3456
+ ASSERT_OK(disable_udt_sst_writer.Finish());
3457
+
3458
+ // File2: [50, 100), contains no timestamps
3459
+ // comparator name: leveldb.BytewiseComparator.u64ts
3460
+ // user_defined_timestamps_persisted: false
3461
+ std::string not_persist_udt_sst_file = sst_files_dir_ + "file2.sst";
3462
+ ASSERT_OK(not_persist_udt_sst_writer.Open(not_persist_udt_sst_file));
3463
+ for (int k = 50; k < 100; k++) {
3464
+ ASSERT_NOK(not_persist_udt_sst_writer.Put(Key(k), Key(k) + "_val"));
3465
+ ASSERT_NOK(not_persist_udt_sst_writer.Put(Key(k), EncodeAsUint64(k),
3466
+ Key(k) + "_val"));
3467
+ ASSERT_OK(not_persist_udt_sst_writer.Put(Key(k), EncodeAsUint64(0),
3468
+ Key(k) + "_val"));
3469
+ }
3470
+ ASSERT_OK(not_persist_udt_sst_writer.Finish());
3471
+
3472
+ // File3: [100, 150), contains timestamp
3473
+ // comparator name: leveldb.BytewiseComparator.u64ts
3474
+ // user_defined_timestamps_persisted: true
3475
+ std::string persist_udt_sst_file = sst_files_dir_ + "file3.sst";
3476
+ ASSERT_OK(persist_udt_sst_writer.Open(persist_udt_sst_file));
3477
+ for (int k = 100; k < 150; k++) {
3478
+ ASSERT_NOK(persist_udt_sst_writer.Put(Key(k), Key(k) + "_val"));
3479
+ ASSERT_OK(
3480
+ persist_udt_sst_writer.Put(Key(k), EncodeAsUint64(k), Key(k) + "_val"));
3481
+ }
3482
+ ASSERT_OK(persist_udt_sst_writer.Finish());
3483
+
3484
+ DestroyAndReopen(disable_udt_options);
3485
+ ASSERT_OK(
3486
+ IngestExternalUDTFile({disable_udt_sst_file, not_persist_udt_sst_file}));
3487
+ ASSERT_NOK(IngestExternalUDTFile({persist_udt_sst_file}));
3488
+ for (int k = 0; k < 100; k++) {
3489
+ ASSERT_EQ(Get(Key(k)), Key(k) + "_val");
3490
+ }
3491
+
3492
+ DestroyAndReopen(not_persist_udt_options);
3493
+ ASSERT_OK(
3494
+ IngestExternalUDTFile({disable_udt_sst_file, not_persist_udt_sst_file}));
3495
+ ASSERT_NOK(IngestExternalUDTFile({persist_udt_sst_file}));
3496
+ for (int k = 0; k < 100; k++) {
3497
+ VerifyValueAndTs(Key(k), EncodeAsUint64(0), Key(k) + "_val",
3498
+ EncodeAsUint64(0));
3499
+ }
3500
+
3501
+ DestroyAndReopen(persist_udt_options);
3502
+ ASSERT_NOK(
3503
+ IngestExternalUDTFile({disable_udt_sst_file, not_persist_udt_sst_file}));
3504
+ ASSERT_OK(IngestExternalUDTFile({persist_udt_sst_file}));
3505
+ for (int k = 100; k < 150; k++) {
3506
+ VerifyValueAndTs(Key(k), EncodeAsUint64(k), Key(k) + "_val",
3507
+ EncodeAsUint64(k));
3508
+ }
3509
+
3510
+ DestroyAndRecreateExternalSSTFilesDir();
3511
+ }
3512
+
3513
+ TEST_F(ExternalSSTFileWithTimestampTest, TimestampsNotPersistedBasic) {
3514
+ do {
3515
+ Options options = CurrentOptions();
3516
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
3517
+ options.persist_user_defined_timestamps = false;
3518
+ options.allow_concurrent_memtable_write = false;
3519
+
3520
+ DestroyAndReopen(options);
3521
+
3522
+ SstFileWriter sst_file_writer(EnvOptions(), options);
3523
+
3524
+ // file1.sst [0, 50)
3525
+ std::string file1 = sst_files_dir_ + "file1.sst";
3526
+ ASSERT_OK(sst_file_writer.Open(file1));
3527
+ for (int k = 0; k < 50; k++) {
3528
+ // Attempting to write 2 versions of values for each key, only the version
3529
+ // with timestamp 0 goes through.
3530
+ for (int version = 1; version >= 0; version--) {
3531
+ if (version == 1) {
3532
+ ASSERT_NOK(
3533
+ sst_file_writer.Put(Key(k), EncodeAsUint64(version),
3534
+ Key(k) + "_val" + std::to_string(version)));
3535
+ } else {
3536
+ ASSERT_OK(
3537
+ sst_file_writer.Put(Key(k), EncodeAsUint64(version),
3538
+ Key(k) + "_val" + std::to_string(version)));
3539
+ }
3540
+ }
3541
+ }
3542
+
3543
+ ExternalSstFileInfo file1_info;
3544
+ ASSERT_OK(sst_file_writer.Finish(&file1_info));
3545
+ // sst_file_writer already finished, cannot add this value
3546
+ ASSERT_NOK(sst_file_writer.Put(Key(100), EncodeAsUint64(0), "bad_val"));
3547
+
3548
+ ASSERT_EQ(file1_info.file_path, file1);
3549
+ ASSERT_EQ(file1_info.num_entries, 50);
3550
+ ASSERT_EQ(file1_info.smallest_key, Key(0));
3551
+ ASSERT_EQ(file1_info.largest_key, Key(49));
3552
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3553
+ // Add file using file path
3554
+ ASSERT_OK(IngestExternalUDTFile({file1}));
3555
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3556
+
3557
+ // Read ingested file: all data contain minimum timestamps.
3558
+ for (int k = 0; k < 50; k++) {
3559
+ VerifyValueAndTs(Key(k), EncodeAsUint64(0),
3560
+ Key(k) + "_val" + std::to_string(0), EncodeAsUint64(0));
3561
+ }
3562
+
3563
+ // file2.sst [50, 200)
3564
+ // Put [key=k, ts=0, value=k_val0] for k in [50, 200)
3565
+ // RangeDelete[start_key=75, end_key=125, ts=0]
3566
+ std::string file2 = sst_files_dir_ + "file2.sst";
3567
+ int range_del_begin = 75, range_del_end = 125;
3568
+ ASSERT_OK(sst_file_writer.Open(file2));
3569
+ for (int k = 50; k < 200; k++) {
3570
+ // All these timestamps will later be effectively 0
3571
+ ASSERT_OK(
3572
+ sst_file_writer.Put(Key(k), EncodeAsUint64(0), Key(k) + "_val0"));
3573
+ }
3574
+ ASSERT_OK(sst_file_writer.DeleteRange(
3575
+ Key(range_del_begin), Key(range_del_end), EncodeAsUint64(0)));
3576
+
3577
+ ExternalSstFileInfo file2_info;
3578
+ ASSERT_OK(sst_file_writer.Finish(&file2_info));
3579
+
3580
+ // Current file size should be non-zero after success write.
3581
+ ASSERT_GT(sst_file_writer.FileSize(), 0);
3582
+
3583
+ ASSERT_EQ(file2_info.file_path, file2);
3584
+ ASSERT_EQ(file2_info.num_entries, 150);
3585
+ ASSERT_EQ(file2_info.smallest_key, Key(50));
3586
+ ASSERT_EQ(file2_info.largest_key, Key(199));
3587
+ ASSERT_EQ(file2_info.num_range_del_entries, 1);
3588
+ ASSERT_EQ(file2_info.smallest_range_del_key, Key(range_del_begin));
3589
+ ASSERT_EQ(file2_info.largest_range_del_key, Key(range_del_end));
3590
+ // Add file using file path
3591
+ ASSERT_OK(IngestExternalUDTFile({file2}));
3592
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
3593
+
3594
+ // Range deletion covering point data in the same file is over-written.
3595
+ for (int k = 50; k < 200; k++) {
3596
+ VerifyValueAndTs(Key(k), EncodeAsUint64(0), Key(k) + "_val0",
3597
+ EncodeAsUint64(0));
3598
+ }
3599
+
3600
+ // file3.sst [100, 200), key range overlap with db
3601
+ std::string file3 = sst_files_dir_ + "file3.sst";
3602
+ ASSERT_OK(sst_file_writer.Open(file3));
3603
+ for (int k = 100; k < 200; k++) {
3604
+ ASSERT_OK(
3605
+ sst_file_writer.Put(Key(k), EncodeAsUint64(0), Key(k) + "_val0"));
3606
+ }
3607
+ ExternalSstFileInfo file3_info;
3608
+ ASSERT_OK(sst_file_writer.Finish(&file3_info));
3609
+ ASSERT_EQ(file3_info.file_path, file3);
3610
+ ASSERT_EQ(file3_info.num_entries, 100);
3611
+ ASSERT_EQ(file3_info.smallest_key, Key(100));
3612
+ ASSERT_EQ(file3_info.largest_key, Key(199));
3613
+
3614
+ // In UDT mode, file with overlapping key range cannot be ingested.
3615
+ ASSERT_NOK(IngestExternalUDTFile({file3}));
3616
+ ASSERT_NOK(IngestExternalUDTFile({file3}, /*allow_global_seqno*/ false));
3617
+
3618
+ // Write [0, 50)
3619
+ // Write to DB newer versions to cover ingested data and move sequence
3620
+ // number forward.
3621
+ for (int k = 0; k < 50; k++) {
3622
+ for (int version = 1; version < 3; version++) {
3623
+ ASSERT_OK(dbfull()->Put(WriteOptions(), Key(k), EncodeAsUint64(version),
3624
+ Key(k) + "_val" + std::to_string(version)));
3625
+ }
3626
+ }
3627
+
3628
+ // Read three versions (1 from ingested, 2 from live writes)
3629
+ for (int k = 0; k < 50; k++) {
3630
+ for (int version = 0; version < 3; version++) {
3631
+ VerifyValueAndTs(Key(k), EncodeAsUint64(version),
3632
+ Key(k) + "_val" + std::to_string(version),
3633
+ EncodeAsUint64(version));
3634
+ }
3635
+ }
3636
+ SequenceNumber seq_num_before_ingestion = db_->GetLatestSequenceNumber();
3637
+ ASSERT_GT(seq_num_before_ingestion, 0U);
3638
+
3639
+ // file4.sst [200, 250)
3640
+ std::string file4 = sst_files_dir_ + "file4.sst";
3641
+ ASSERT_OK(sst_file_writer.Open(file4));
3642
+ for (int k = 200; k < 250; k++) {
3643
+ ASSERT_OK(
3644
+ sst_file_writer.Put(Key(k), EncodeAsUint64(0), Key(k) + "_val"));
3645
+ }
3646
+
3647
+ ExternalSstFileInfo file4_info;
3648
+ ASSERT_OK(sst_file_writer.Finish(&file4_info));
3649
+
3650
+ // Current file size should be non-zero after success write.
3651
+ ASSERT_GT(sst_file_writer.FileSize(), 0);
3652
+
3653
+ ASSERT_EQ(file4_info.file_path, file4);
3654
+ ASSERT_EQ(file4_info.num_entries, 50);
3655
+ ASSERT_EQ(file4_info.smallest_key, Key(200));
3656
+ ASSERT_EQ(file4_info.largest_key, Key(249));
3657
+ ASSERT_EQ(file4_info.num_range_del_entries, 0);
3658
+ ASSERT_EQ(file4_info.smallest_range_del_key, "");
3659
+ ASSERT_EQ(file4_info.largest_range_del_key, "");
3660
+
3661
+ ASSERT_OK(IngestExternalUDTFile({file4}));
3662
+
3663
+ // Ingested files do not overlap with db, they can always have global seqno
3664
+ // 0 assigned.
3665
+ ASSERT_EQ(db_->GetLatestSequenceNumber(), seq_num_before_ingestion);
3666
+
3667
+ DestroyAndRecreateExternalSSTFilesDir();
3668
+ } while (ChangeOptions(kSkipPlainTable | kSkipFIFOCompaction |
3669
+ kRangeDelSkipConfigs));
3670
+ }
3671
+
2981
3672
  INSTANTIATE_TEST_CASE_P(ExternalSSTFileTest, ExternalSSTFileTest,
2982
3673
  testing::Values(std::make_tuple(false, false),
2983
3674
  std::make_tuple(false, true),