@nxtedition/rocksdb 13.5.7 → 13.5.9

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 (509) hide show
  1. package/binding.cc +248 -70
  2. package/binding.gyp +2 -2
  3. package/deps/rocksdb/rocksdb/BUCK +12 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  5. package/deps/rocksdb/rocksdb/Makefile +28 -23
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  16. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  26. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  27. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  28. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  29. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  31. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  59. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  60. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  61. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  63. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  64. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  65. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  66. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  67. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  68. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  69. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  70. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  71. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  87. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  88. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  89. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  90. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  91. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  92. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  93. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  95. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  96. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  97. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  98. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  99. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  100. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  101. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  102. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  104. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  105. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  106. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  107. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  108. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  109. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  110. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  111. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  112. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  113. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  114. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  115. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  116. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  117. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  118. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  119. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  120. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  124. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  125. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  126. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  127. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  129. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  130. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  131. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  132. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  133. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  134. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  135. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  136. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  137. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  138. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  139. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  140. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  141. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  142. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  143. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  144. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  145. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  146. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  147. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  148. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  149. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  150. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  153. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  154. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  155. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  156. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  157. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  158. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  160. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  161. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  163. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  164. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  165. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  166. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  168. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  169. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  170. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  171. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  172. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  173. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  174. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  175. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  176. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  177. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  178. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  180. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  181. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  182. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  191. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  193. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  194. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  195. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  196. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  198. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  199. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  200. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  201. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  202. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  204. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  205. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  206. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  207. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  210. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  212. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  213. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  214. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  215. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  218. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  220. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  221. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  224. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  226. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  228. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  229. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  230. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  232. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  234. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  235. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  238. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  241. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  242. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  243. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  245. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  249. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  253. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  254. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  256. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  257. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  258. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  260. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  269. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  270. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  276. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  277. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  278. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  279. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  281. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  283. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  284. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  285. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  286. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  288. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  289. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  290. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  291. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  292. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  293. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  294. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  295. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  296. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  297. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  298. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  299. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  300. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  301. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  302. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  303. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  304. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  305. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  306. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  307. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  308. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  309. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  310. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  311. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  312. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  314. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  315. package/deps/rocksdb/rocksdb/src.mk +17 -11
  316. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  325. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  327. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  328. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  329. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  330. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  334. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  335. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  338. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  340. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  342. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  343. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  345. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  349. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  350. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  351. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  352. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  353. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  354. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  356. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  357. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  362. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  364. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  366. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  367. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  368. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  369. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  370. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  371. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  372. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  374. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  376. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  377. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  380. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  381. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  382. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  384. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  385. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  386. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  388. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  391. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  393. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  395. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  396. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  397. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  398. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  399. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  400. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  401. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  402. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  403. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  404. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  405. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  406. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  408. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  409. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  416. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  426. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  428. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  430. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  433. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  435. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  436. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  437. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  439. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  442. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  443. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  458. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  464. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  467. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  468. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  479. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  482. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  485. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  486. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  499. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  500. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  504. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  505. package/deps/rocksdb/rocksdb.gyp +9 -4
  506. package/index.js +50 -9
  507. package/package.json +8 -1
  508. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  509. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -11,10 +11,12 @@
11
11
  #include "port/stack_trace.h"
12
12
  #include "rocksdb/advanced_options.h"
13
13
  #include "rocksdb/options.h"
14
+ #include "rocksdb/perf_context.h"
14
15
  #include "rocksdb/sst_file_writer.h"
15
16
  #include "test_util/testharness.h"
16
17
  #include "test_util/testutil.h"
17
18
  #include "util/defer.h"
19
+ #include "util/file_checksum_helper.h"
18
20
  #include "util/random.h"
19
21
  #include "utilities/fault_injection_env.h"
20
22
 
@@ -259,15 +261,6 @@ TEST_F(ExternalSSTFileBasicTest, Basic) {
259
261
  s = sst_file_writer.DeleteRange(Key(100), Key(200));
260
262
  ASSERT_NOK(s) << s.ToString();
261
263
 
262
- DestroyAndReopen(options);
263
- // Add file using file path
264
- s = DeprecatedAddFile({file1});
265
- ASSERT_OK(s) << s.ToString();
266
- ASSERT_EQ(db_->GetLatestSequenceNumber(), 0U);
267
- for (int k = 0; k < 100; k++) {
268
- ASSERT_EQ(Get(Key(k)), Key(k) + "_val");
269
- }
270
-
271
264
  DestroyAndRecreateExternalSSTFilesDir();
272
265
  }
273
266
 
@@ -354,7 +347,8 @@ class ChecksumVerifyHelper {
354
347
 
355
348
  Status GetSingleFileChecksumAndFuncName(
356
349
  const std::string& file_path, std::string* file_checksum,
357
- std::string* file_checksum_func_name) {
350
+ std::string* file_checksum_func_name,
351
+ const std::string& requested_func_name = {}) {
358
352
  Status s;
359
353
  EnvOptions soptions;
360
354
  std::unique_ptr<SequentialFile> file_reader;
@@ -372,6 +366,8 @@ class ChecksumVerifyHelper {
372
366
  return Status::OK();
373
367
  } else {
374
368
  FileChecksumGenContext gen_context;
369
+ gen_context.file_name = file_path;
370
+ gen_context.requested_checksum_func_name = requested_func_name;
375
371
  std::unique_ptr<FileChecksumGenerator> file_checksum_gen =
376
372
  file_checksum_gen_factory->CreateFileChecksumGenerator(gen_context);
377
373
  *file_checksum_func_name = file_checksum_gen->Name();
@@ -447,10 +443,50 @@ TEST_F(ExternalSSTFileBasicTest, BasicWithFileChecksumCrc32c) {
447
443
  DestroyAndRecreateExternalSSTFilesDir();
448
444
  }
449
445
 
446
+ namespace {
447
+ class VariousFileChecksumGenerator : public FileChecksumGenCrc32c {
448
+ public:
449
+ explicit VariousFileChecksumGenerator(const std::string& name)
450
+ : FileChecksumGenCrc32c({}), name_(name) {}
451
+
452
+ const char* Name() const override { return name_.c_str(); }
453
+
454
+ std::string GetChecksum() const override {
455
+ return FileChecksumGenCrc32c::GetChecksum() + "_" + name_;
456
+ }
457
+
458
+ private:
459
+ const std::string name_;
460
+ };
461
+
462
+ class VariousFileChecksumGenFactory : public FileChecksumGenFactory {
463
+ public:
464
+ std::unique_ptr<FileChecksumGenerator> CreateFileChecksumGenerator(
465
+ const FileChecksumGenContext& context) override {
466
+ static RelaxedAtomic<int> counter{0};
467
+ if (Slice(context.requested_checksum_func_name).starts_with("Various")) {
468
+ return std::make_unique<VariousFileChecksumGenerator>(
469
+ context.requested_checksum_func_name);
470
+ } else if (context.requested_checksum_func_name.empty()) {
471
+ // Lacking a specific request, use a different function name for each
472
+ // result.
473
+ return std::make_unique<VariousFileChecksumGenerator>(
474
+ "Various" + std::to_string(counter.FetchAddRelaxed(1)));
475
+ } else {
476
+ return nullptr;
477
+ }
478
+ }
479
+
480
+ static const char* kClassName() { return "VariousFileChecksumGenFactory"; }
481
+ const char* Name() const override { return kClassName(); }
482
+ };
483
+ } // namespace
484
+
450
485
  TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
451
486
  Options old_options = CurrentOptions();
452
487
  Options options = CurrentOptions();
453
- options.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
488
+ options.file_checksum_gen_factory =
489
+ std::make_shared<VariousFileChecksumGenFactory>();
454
490
  const ImmutableCFOptions ioptions(options);
455
491
  ChecksumVerifyHelper checksum_helper(options);
456
492
 
@@ -471,7 +507,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
471
507
  ASSERT_EQ(file1_info.largest_key, Key(1099));
472
508
  std::string file_checksum1, file_checksum_func_name1;
473
509
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
474
- file1, &file_checksum1, &file_checksum_func_name1));
510
+ file1, &file_checksum1, &file_checksum_func_name1,
511
+ file1_info.file_checksum_func_name));
475
512
  ASSERT_EQ(file1_info.file_checksum, file_checksum1);
476
513
  ASSERT_EQ(file1_info.file_checksum_func_name, file_checksum_func_name1);
477
514
 
@@ -490,7 +527,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
490
527
  ASSERT_EQ(file2_info.largest_key, Key(1299));
491
528
  std::string file_checksum2, file_checksum_func_name2;
492
529
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
493
- file2, &file_checksum2, &file_checksum_func_name2));
530
+ file2, &file_checksum2, &file_checksum_func_name2,
531
+ file2_info.file_checksum_func_name));
494
532
  ASSERT_EQ(file2_info.file_checksum, file_checksum2);
495
533
  ASSERT_EQ(file2_info.file_checksum_func_name, file_checksum_func_name2);
496
534
 
@@ -509,7 +547,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
509
547
  ASSERT_EQ(file3_info.largest_key, Key(1499));
510
548
  std::string file_checksum3, file_checksum_func_name3;
511
549
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
512
- file3, &file_checksum3, &file_checksum_func_name3));
550
+ file3, &file_checksum3, &file_checksum_func_name3,
551
+ file3_info.file_checksum_func_name));
513
552
  ASSERT_EQ(file3_info.file_checksum, file_checksum3);
514
553
  ASSERT_EQ(file3_info.file_checksum_func_name, file_checksum_func_name3);
515
554
 
@@ -528,7 +567,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
528
567
  ASSERT_EQ(file4_info.largest_key, Key(1799));
529
568
  std::string file_checksum4, file_checksum_func_name4;
530
569
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
531
- file4, &file_checksum4, &file_checksum_func_name4));
570
+ file4, &file_checksum4, &file_checksum_func_name4,
571
+ file4_info.file_checksum_func_name));
532
572
  ASSERT_EQ(file4_info.file_checksum, file_checksum4);
533
573
  ASSERT_EQ(file4_info.file_checksum_func_name, file_checksum_func_name4);
534
574
 
@@ -547,7 +587,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
547
587
  ASSERT_EQ(file5_info.largest_key, Key(1999));
548
588
  std::string file_checksum5, file_checksum_func_name5;
549
589
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
550
- file5, &file_checksum5, &file_checksum_func_name5));
590
+ file5, &file_checksum5, &file_checksum_func_name5,
591
+ file5_info.file_checksum_func_name));
551
592
  ASSERT_EQ(file5_info.file_checksum, file_checksum5);
552
593
  ASSERT_EQ(file5_info.file_checksum_func_name, file_checksum_func_name5);
553
594
 
@@ -566,7 +607,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
566
607
  ASSERT_EQ(file6_info.largest_key, Key(2199));
567
608
  std::string file_checksum6, file_checksum_func_name6;
568
609
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
569
- file6, &file_checksum6, &file_checksum_func_name6));
610
+ file6, &file_checksum6, &file_checksum_func_name6,
611
+ file6_info.file_checksum_func_name));
570
612
  ASSERT_EQ(file6_info.file_checksum, file_checksum6);
571
613
  ASSERT_EQ(file6_info.file_checksum_func_name, file_checksum_func_name6);
572
614
 
@@ -636,18 +678,23 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
636
678
  }
637
679
  ASSERT_OK(env_->FileExists(file2));
638
680
 
639
- // Enable verify_file_checksum option
640
- // No checksum information is provided, generate it when ingesting
641
- std::vector<std::string> checksum, checksum_func;
642
- s = AddFileWithFileChecksum({file3}, checksum, checksum_func, true, false,
643
- false, false);
681
+ // Enable verify_file_checksum option. No checksum information is provided,
682
+ // so it is generated when ingesting. The configured checksum factory will
683
+ // use a different function than before.
684
+ s = AddFileWithFileChecksum({file3}, {}, {}, true, false, false, false);
644
685
  ASSERT_OK(s) << s.ToString();
645
686
  std::vector<LiveFileMetaData> live_files2;
646
687
  dbfull()->GetLiveFilesMetaData(&live_files2);
647
688
  for (const auto& f : live_files2) {
648
689
  if (set1.find(f.name) == set1.end()) {
649
- ASSERT_EQ(f.file_checksum, file_checksum3);
650
- ASSERT_EQ(f.file_checksum_func_name, file_checksum_func_name3);
690
+ // Recomputed checksum, different function
691
+ EXPECT_NE(f.file_checksum_func_name, file_checksum_func_name3);
692
+ std::string cur_checksum3, cur_checksum_func_name3;
693
+ ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
694
+ dbname_ + f.name, &cur_checksum3, &cur_checksum_func_name3,
695
+ f.file_checksum_func_name));
696
+ EXPECT_EQ(f.file_checksum, cur_checksum3);
697
+ EXPECT_EQ(f.file_checksum_func_name, cur_checksum_func_name3);
651
698
  set1.insert(f.name);
652
699
  }
653
700
  }
@@ -661,8 +708,9 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
661
708
  ASSERT_NOK(s) << s.ToString();
662
709
 
663
710
  // Does not enable verify_file_checksum options
664
- // Checksum function name matches, store the checksum being ingested.
665
- s = AddFileWithFileChecksum({file4}, {"asd"}, {file_checksum_func_name4},
711
+ // Checksum function name is recognized, so store the checksum being ingested.
712
+ std::string file_checksum_func_name4alt = "VariousABCD";
713
+ s = AddFileWithFileChecksum({file4}, {"asd"}, {file_checksum_func_name4alt},
666
714
  false, false, false, false);
667
715
  ASSERT_OK(s) << s.ToString();
668
716
  std::vector<LiveFileMetaData> live_files3;
@@ -671,7 +719,7 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
671
719
  if (set1.find(f.name) == set1.end()) {
672
720
  ASSERT_FALSE(f.file_checksum == file_checksum4);
673
721
  ASSERT_EQ(f.file_checksum, "asd");
674
- ASSERT_EQ(f.file_checksum_func_name, file_checksum_func_name4);
722
+ ASSERT_EQ(f.file_checksum_func_name, file_checksum_func_name4alt);
675
723
  set1.insert(f.name);
676
724
  }
677
725
  }
@@ -680,7 +728,8 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
680
728
 
681
729
  // enable verify_file_checksum options, DB enable checksum, and enable
682
730
  // write_global_seq. So the checksum stored is different from the one
683
- // ingested due to the sequence number changes.
731
+ // ingested due to the sequence number changes. The checksum function name
732
+ // may also change since the checksum is recomputed.
684
733
  s = AddFileWithFileChecksum({file5}, {file_checksum5},
685
734
  {file_checksum_func_name5}, true, false, false,
686
735
  true);
@@ -689,11 +738,14 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
689
738
  dbfull()->GetLiveFilesMetaData(&live_files4);
690
739
  for (const auto& f : live_files4) {
691
740
  if (set1.find(f.name) == set1.end()) {
741
+ // Recomputed checksum, different function
742
+ EXPECT_NE(f.file_checksum_func_name, file_checksum_func_name5);
692
743
  std::string cur_checksum5, cur_checksum_func_name5;
693
744
  ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
694
- dbname_ + f.name, &cur_checksum5, &cur_checksum_func_name5));
695
- ASSERT_EQ(f.file_checksum, cur_checksum5);
696
- ASSERT_EQ(f.file_checksum_func_name, file_checksum_func_name5);
745
+ dbname_ + f.name, &cur_checksum5, &cur_checksum_func_name5,
746
+ f.file_checksum_func_name));
747
+ EXPECT_EQ(f.file_checksum, cur_checksum5);
748
+ EXPECT_EQ(f.file_checksum_func_name, cur_checksum_func_name5);
697
749
  set1.insert(f.name);
698
750
  }
699
751
  }
@@ -701,18 +753,22 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileWithFileChecksum) {
701
753
  ASSERT_OK(env_->FileExists(file5));
702
754
 
703
755
  // Does not enable verify_file_checksum options and also the ingested file
704
- // checksum information is empty. DB will generate and store the checksum
705
- // in Manifest.
706
- std::vector<std::string> files_c6, files_name6;
707
- s = AddFileWithFileChecksum({file6}, files_c6, files_name6, false, false,
708
- false, false);
756
+ // checksum information is empty. DB will generate and store file checksum
757
+ // in Manifest, which could be different from the previous invocation.
758
+ s = AddFileWithFileChecksum({file6}, {}, {}, false, false, false, false);
709
759
  ASSERT_OK(s) << s.ToString();
710
760
  std::vector<LiveFileMetaData> live_files6;
711
761
  dbfull()->GetLiveFilesMetaData(&live_files6);
712
762
  for (const auto& f : live_files6) {
713
763
  if (set1.find(f.name) == set1.end()) {
714
- ASSERT_EQ(f.file_checksum, file_checksum6);
715
- ASSERT_EQ(f.file_checksum_func_name, file_checksum_func_name6);
764
+ // Recomputed checksum, different function
765
+ EXPECT_NE(f.file_checksum_func_name, file_checksum_func_name6);
766
+ std::string cur_checksum6, cur_checksum_func_name6;
767
+ ASSERT_OK(checksum_helper.GetSingleFileChecksumAndFuncName(
768
+ dbname_ + f.name, &cur_checksum6, &cur_checksum_func_name6,
769
+ f.file_checksum_func_name));
770
+ EXPECT_EQ(f.file_checksum, cur_checksum6);
771
+ EXPECT_EQ(f.file_checksum_func_name, cur_checksum_func_name6);
716
772
  set1.insert(f.name);
717
773
  }
718
774
  }
@@ -1913,21 +1969,44 @@ TEST_F(ExternalSSTFileBasicTest, OverlappingFiles) {
1913
1969
  SstFileWriter sst_file_writer(EnvOptions(), options);
1914
1970
  std::string file3 = sst_files_dir_ + "file3.sst";
1915
1971
  ASSERT_OK(sst_file_writer.Open(file3));
1916
- ASSERT_OK(sst_file_writer.Put("j", "j1"));
1972
+ ASSERT_OK(sst_file_writer.Put("k", "k1"));
1917
1973
  ASSERT_OK(sst_file_writer.Put("m", "m1"));
1918
1974
  ExternalSstFileInfo file3_info;
1919
1975
  ASSERT_OK(sst_file_writer.Finish(&file3_info));
1920
1976
  files.push_back(std::move(file3));
1921
1977
  }
1922
1978
 
1979
+ // This could be ingested to the same level as file3 and file4, but the
1980
+ // greedy/simple overlap check relegates it to a later level
1981
+ {
1982
+ SstFileWriter sst_file_writer(EnvOptions(), options);
1983
+ std::string file4 = sst_files_dir_ + "file4.sst";
1984
+ ASSERT_OK(sst_file_writer.Open(file4));
1985
+ ASSERT_OK(sst_file_writer.Put("j", "j1"));
1986
+ ExternalSstFileInfo file4_info;
1987
+ ASSERT_OK(sst_file_writer.Finish(&file4_info));
1988
+ files.push_back(std::move(file4));
1989
+ }
1990
+
1991
+ {
1992
+ SstFileWriter sst_file_writer(EnvOptions(), options);
1993
+ std::string file5 = sst_files_dir_ + "file5.sst";
1994
+ ASSERT_OK(sst_file_writer.Open(file5));
1995
+ ASSERT_OK(sst_file_writer.Put("i", "i3"));
1996
+ ExternalSstFileInfo file5_info;
1997
+ ASSERT_OK(sst_file_writer.Finish(&file5_info));
1998
+ files.push_back(std::move(file5));
1999
+ }
2000
+
1923
2001
  IngestExternalFileOptions ifo;
1924
2002
  ifo.allow_global_seqno = false;
1925
2003
  ASSERT_NOK(db_->IngestExternalFile(files, ifo));
1926
2004
  ifo.allow_global_seqno = true;
1927
2005
  ASSERT_OK(db_->IngestExternalFile(files, ifo));
1928
2006
  ASSERT_EQ(Get("a"), "a1");
1929
- ASSERT_EQ(Get("i"), "i2");
2007
+ ASSERT_EQ(Get("i"), "i3");
1930
2008
  ASSERT_EQ(Get("j"), "j1");
2009
+ ASSERT_EQ(Get("k"), "k1");
1931
2010
  ASSERT_EQ(Get("m"), "m1");
1932
2011
 
1933
2012
  int total_keys = 0;
@@ -1938,10 +2017,11 @@ TEST_F(ExternalSSTFileBasicTest, OverlappingFiles) {
1938
2017
  }
1939
2018
  ASSERT_OK(iter->status());
1940
2019
  delete iter;
1941
- ASSERT_EQ(total_keys, 4);
2020
+ ASSERT_EQ(total_keys, 5);
1942
2021
 
1943
2022
  ASSERT_EQ(1, NumTableFilesAtLevel(6));
1944
2023
  ASSERT_EQ(2, NumTableFilesAtLevel(5));
2024
+ ASSERT_EQ(2, NumTableFilesAtLevel(4));
1945
2025
  }
1946
2026
 
1947
2027
  class CompactionJobStatsCheckerForFilteredFiles : public EventListener {
@@ -2628,51 +2708,358 @@ TEST_F(ExternalSSTFileBasicTest, IngestWithTemperature) {
2628
2708
  }
2629
2709
  }
2630
2710
 
2631
- TEST_F(ExternalSSTFileBasicTest, FailIfNotBottommostLevel) {
2711
+ // This tests an internal user's exact usage and expectation of the
2712
+ // IngestExternalFiles APIs to bulk load and replace files.
2713
+ TEST_F(ExternalSSTFileBasicTest,
2714
+ AtomicReplaceColumnFamilyWithIngestedVersionKey) {
2632
2715
  Options options = GetDefaultOptions();
2633
-
2634
- std::string file_path = sst_files_dir_ + std::to_string(1);
2635
- SstFileWriter sfw(EnvOptions(), options);
2636
-
2637
- ASSERT_OK(sfw.Open(file_path));
2638
- ASSERT_OK(sfw.Put("b", "dontcare"));
2639
- ASSERT_OK(sfw.Finish());
2640
-
2641
- // Test universal compaction + ingest with snapshot consistency
2642
2716
  options.create_if_missing = true;
2643
2717
  options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
2718
+ options.num_levels = 7;
2719
+ options.disallow_memtable_writes = false;
2720
+
2644
2721
  DestroyAndReopen(options);
2645
- {
2646
- const Snapshot* snapshot = db_->GetSnapshot();
2647
- ManagedSnapshot snapshot_guard(db_, snapshot);
2648
- IngestExternalFileOptions ifo;
2649
- ifo.fail_if_not_bottommost_level = true;
2650
- ifo.snapshot_consistency = true;
2651
- const Status s = db_->IngestExternalFile({file_path}, ifo);
2652
- ASSERT_TRUE(s.ok());
2722
+ SstFileWriter sst_file_writer(EnvOptions(), options);
2723
+ std::string data_file_original = sst_files_dir_ + "data_original";
2724
+ ASSERT_OK(sst_file_writer.Open(data_file_original));
2725
+ ASSERT_OK(sst_file_writer.Put("ukey1", "uval1_orig"));
2726
+ ASSERT_OK(sst_file_writer.Put("ukey2", "uval2_orig"));
2727
+ ASSERT_OK(sst_file_writer.Finish());
2728
+ ASSERT_OK(db_->IngestExternalFile(db_->DefaultColumnFamily(),
2729
+ {data_file_original},
2730
+ IngestExternalFileOptions()));
2731
+
2732
+ ASSERT_OK(Put("data_version", "v_original"));
2733
+ ASSERT_OK(Flush());
2734
+ std::string value;
2735
+ ASSERT_OK(db_->Get(ReadOptions(), "data_version", &value));
2736
+ ASSERT_EQ(value, "v_original");
2737
+ ASSERT_OK(db_->Get(ReadOptions(), "ukey1", &value));
2738
+ ASSERT_EQ(value, "uval1_orig");
2739
+ ASSERT_OK(db_->Get(ReadOptions(), "ukey2", &value));
2740
+ ASSERT_EQ(value, "uval2_orig");
2741
+ // Set up a 1) data version key file on L0, and 2) a user data file on L6
2742
+ // to test the initial transitioning to use `atomic_replace_range`.
2743
+ ASSERT_EQ("1,0,0,0,0,0,1", FilesPerLevel());
2744
+
2745
+ // Test multiple cycles of replacing by atomically ingest a data file and a
2746
+ // version key file while replace the whole range in the column family.
2747
+ for (int i = 0; i < 10; i++) {
2748
+ std::string version_file_path =
2749
+ sst_files_dir_ + "version" + std::to_string(i);
2750
+ ASSERT_OK(sst_file_writer.Open(version_file_path));
2751
+ ASSERT_OK(sst_file_writer.Put("data_version", "v" + std::to_string(i)));
2752
+ ASSERT_OK(sst_file_writer.Finish());
2753
+
2754
+ std::string file_path = sst_files_dir_ + std::to_string(i);
2755
+ ASSERT_OK(sst_file_writer.Open(file_path));
2756
+ ASSERT_OK(sst_file_writer.Put("ukey1", "uval1" + std::to_string(i)));
2757
+ ASSERT_OK(sst_file_writer.Put("ukey2", "uval2" + std::to_string(i)));
2758
+ ASSERT_OK(sst_file_writer.Finish());
2759
+
2760
+ IngestExternalFileArg arg;
2761
+ arg.column_family = db_->DefaultColumnFamily();
2762
+ arg.external_files = {version_file_path, file_path};
2763
+ arg.atomic_replace_range = {{nullptr, nullptr}};
2764
+ // Test both fail_if_not_bottomost_level: true and false
2765
+ arg.options.fail_if_not_bottommost_level = i % 2 == 0;
2766
+ arg.options.snapshot_consistency = false;
2767
+ // Ingest 1) a new data version file and 2) a new user data file while erase
2768
+ // the whole column family
2769
+ Status s = db_->IngestExternalFiles({arg});
2770
+ ASSERT_OK(s);
2771
+
2772
+ // Check ingestion result and the expected LSM shape:
2773
+ // Two files on L6, 1) a data version file 2) a user data file.
2774
+ ASSERT_OK(db_->Get(ReadOptions(), "ukey1", &value));
2775
+ ASSERT_EQ(value, "uval1" + std::to_string(i));
2776
+ ASSERT_OK(db_->Get(ReadOptions(), "ukey2", &value));
2777
+ ASSERT_EQ(value, "uval2" + std::to_string(i));
2778
+ ASSERT_OK(db_->Get(ReadOptions(), "data_version", &value));
2779
+ ASSERT_EQ(value, "v" + std::to_string(i));
2780
+ ASSERT_EQ("0,0,0,0,0,0,2", FilesPerLevel());
2653
2781
  }
2654
2782
 
2655
- // Test level compaction
2656
- options.compaction_style = CompactionStyle::kCompactionStyleLevel;
2657
- options.num_levels = 2;
2658
- DestroyAndReopen(options);
2659
- ASSERT_OK(db_->Put(WriteOptions(), "a", "dontcare"));
2660
- ASSERT_OK(db_->Put(WriteOptions(), "c", "dontcare"));
2661
- ASSERT_OK(db_->Flush(FlushOptions()));
2783
+ Close();
2784
+ }
2662
2785
 
2663
- ASSERT_OK(db_->Put(WriteOptions(), "b", "dontcare"));
2664
- ASSERT_OK(db_->Put(WriteOptions(), "d", "dontcare"));
2665
- ASSERT_OK(db_->Flush(FlushOptions()));
2786
+ TEST_F(ExternalSSTFileBasicTest, FailIfNotBottommostLevelAndDisallowMemtable) {
2787
+ for (bool disallow_memtable : {false, true}) {
2788
+ Options options = GetDefaultOptions();
2666
2789
 
2667
- {
2668
- CompactRangeOptions cro;
2669
- cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
2670
- ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
2790
+ // First test with universal compaction
2791
+ options.create_if_missing = true;
2792
+ options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
2793
+ DestroyAndReopen(options);
2671
2794
 
2672
- IngestExternalFileOptions ifo;
2673
- ifo.fail_if_not_bottommost_level = true;
2674
- const Status s = db_->IngestExternalFile({file_path}, ifo);
2675
- ASSERT_TRUE(s.IsTryAgain());
2795
+ // And a CF potentially disallowing memtable write
2796
+ options.disallow_memtable_writes = disallow_memtable;
2797
+ CreateColumnFamilies({"cf0"}, options);
2798
+ ASSERT_EQ(db_->GetOptions(handles_[0]).disallow_memtable_writes,
2799
+ disallow_memtable);
2800
+
2801
+ // Ingest with snapshot consistency
2802
+ std::string file_path = sst_files_dir_ + std::to_string(1);
2803
+ std::string file_path2 = sst_files_dir_ + std::to_string(2);
2804
+ SstFileWriter sfw(EnvOptions(), options);
2805
+
2806
+ ASSERT_OK(sfw.Open(file_path));
2807
+ ASSERT_OK(sfw.Put("b", "0"));
2808
+ ASSERT_OK(sfw.Finish());
2809
+
2810
+ {
2811
+ const Snapshot* snapshot = db_->GetSnapshot();
2812
+ ManagedSnapshot snapshot_guard(db_, snapshot);
2813
+ IngestExternalFileOptions ifo;
2814
+ ifo.fail_if_not_bottommost_level = true;
2815
+ ifo.snapshot_consistency = true;
2816
+ ASSERT_OK(db_->IngestExternalFile(handles_[0], {file_path}, ifo));
2817
+ }
2818
+ ASSERT_EQ(Get(0, "b"), "0");
2819
+
2820
+ // Test level compaction
2821
+ options.compaction_style = CompactionStyle::kCompactionStyleLevel;
2822
+ options.num_levels = 2;
2823
+ CreateColumnFamilies({"cf1"}, options);
2824
+ ASSERT_EQ(db_->GetOptions(handles_[1]).disallow_memtable_writes,
2825
+ disallow_memtable);
2826
+
2827
+ if (!disallow_memtable) {
2828
+ ASSERT_OK(Put(1, "a", "1"));
2829
+ ASSERT_OK(Put(1, "c", "3"));
2830
+ ASSERT_OK(Flush(1));
2831
+
2832
+ ASSERT_OK(Put(1, "b", "2"));
2833
+ ASSERT_OK(Put(1, "d", "4"));
2834
+ ASSERT_OK(Flush(1));
2835
+ } else {
2836
+ // Memtable write disallowed
2837
+ EXPECT_EQ(Put(1, "a", "1").code(), Status::Code::kInvalidArgument);
2838
+
2839
+ // Use ingestion to get to the same state as above
2840
+ ASSERT_OK(sfw.Open(file_path2));
2841
+ ASSERT_OK(sfw.Put("a", "1"));
2842
+ ASSERT_OK(sfw.Put("c", "3"));
2843
+ ASSERT_OK(sfw.Finish());
2844
+ ASSERT_OK(db_->IngestExternalFile(handles_[1], {file_path2}, {}));
2845
+
2846
+ ASSERT_OK(sfw.Open(file_path2));
2847
+ ASSERT_OK(sfw.Put("b", "2"));
2848
+ ASSERT_OK(sfw.Put("d", "4"));
2849
+ ASSERT_OK(sfw.Finish());
2850
+ ASSERT_OK(db_->IngestExternalFile(handles_[1], {file_path2}, {}));
2851
+ }
2852
+ ASSERT_EQ(Get(1, "a"), "1");
2853
+ ASSERT_EQ(Get(1, "b"), "2");
2854
+ ASSERT_EQ(Get(1, "c"), "3");
2855
+ ASSERT_EQ(Get(1, "d"), "4");
2856
+
2857
+ {
2858
+ // Test fail_if_not_bottommost_level, which fails if there's any overlap
2859
+ // anywhere, even with snapshot_consistency=false
2860
+ IngestExternalFileOptions ifo;
2861
+ ASSERT_FALSE(ifo.fail_if_not_bottommost_level);
2862
+ ifo.fail_if_not_bottommost_level = true;
2863
+ ifo.snapshot_consistency = false;
2864
+ // Fails with overlap on earlier level
2865
+ Status s = db_->IngestExternalFile(handles_[1], {file_path}, ifo);
2866
+ ASSERT_EQ(s.code(), Status::Code::kTryAgain);
2867
+
2868
+ CompactRangeOptions cro;
2869
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
2870
+ ASSERT_OK(db_->CompactRange(cro, handles_[1], nullptr, nullptr));
2871
+
2872
+ // Fails with overlap on last level
2873
+ s = db_->IngestExternalFile(handles_[1], {file_path}, ifo);
2874
+ ASSERT_EQ(s.code(), Status::Code::kTryAgain);
2875
+
2876
+ // No change to data
2877
+ ASSERT_EQ(Get(1, "a"), "1");
2878
+ ASSERT_EQ(Get(1, "b"), "2");
2879
+ ASSERT_EQ(Get(1, "c"), "3");
2880
+ ASSERT_EQ(Get(1, "d"), "4");
2881
+ }
2882
+
2883
+ if (!disallow_memtable) {
2884
+ // Test allow_blocking_flush=false (fail because of memtable overlap)
2885
+ IngestExternalFileOptions ifo;
2886
+ ASSERT_TRUE(ifo.allow_blocking_flush);
2887
+ ifo.allow_blocking_flush = false;
2888
+ ASSERT_OK(Put(1, "b", "42"));
2889
+ Status s = db_->IngestExternalFile(handles_[1], {file_path}, ifo);
2890
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2891
+
2892
+ ASSERT_EQ(Get(1, "a"), "1");
2893
+ ASSERT_EQ(Get(1, "b"), "42");
2894
+ ASSERT_EQ(Get(1, "c"), "3");
2895
+ ASSERT_EQ(Get(1, "d"), "4");
2896
+
2897
+ // Revert state
2898
+ ASSERT_OK(Put(1, "b", "2"));
2899
+ ASSERT_OK(Flush(1));
2900
+ }
2901
+
2902
+ {
2903
+ // Test atomic_replace_range
2904
+ IngestExternalFileArg arg;
2905
+ arg.column_family = handles_[1];
2906
+ arg.external_files = {file_path};
2907
+ arg.atomic_replace_range = {{"a", "zzz"}};
2908
+
2909
+ // start with some failure cases
2910
+ // TODO: support snapshot consistency with tombstone file
2911
+ ASSERT_TRUE(arg.options.snapshot_consistency);
2912
+ Status s = db_->IngestExternalFiles({arg});
2913
+ ASSERT_EQ(s.code(), Status::Code::kNotSupported);
2914
+
2915
+ ASSERT_EQ(Get(1, "a"), "1");
2916
+ ASSERT_EQ(Get(1, "b"), "2");
2917
+ ASSERT_EQ(Get(1, "c"), "3");
2918
+ ASSERT_EQ(Get(1, "d"), "4");
2919
+
2920
+ arg.options.snapshot_consistency = false;
2921
+ // Can usually be used with atomic_replace_range and
2922
+ // snapshot_consistency=false, except it requires no input overlap
2923
+ arg.options.fail_if_not_bottommost_level = true;
2924
+
2925
+ // one-sided ranges not yet supported
2926
+ arg.atomic_replace_range = {{{}, "zzz"}};
2927
+ s = db_->IngestExternalFiles({arg});
2928
+ ASSERT_EQ(s.code(), Status::Code::kNotSupported);
2929
+
2930
+ arg.atomic_replace_range = {{"a", {}}};
2931
+ s = db_->IngestExternalFiles({arg});
2932
+ ASSERT_EQ(s.code(), Status::Code::kNotSupported);
2933
+
2934
+ // rejected because doesn't cover ingested file
2935
+ arg.atomic_replace_range = {{"x", "z"}};
2936
+ s = db_->IngestExternalFiles({arg});
2937
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2938
+
2939
+ // rejected because of partial file overlap
2940
+ arg.atomic_replace_range = {{"a", "c"}};
2941
+ s = db_->IngestExternalFiles({arg});
2942
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2943
+
2944
+ if (!disallow_memtable) {
2945
+ // memtable overlap with replace range
2946
+ ASSERT_OK(Put(1, "e", "5"));
2947
+ arg.options.allow_blocking_flush = false;
2948
+
2949
+ // rejected because of memtable overlap
2950
+ arg.atomic_replace_range = {{"a", "z"}};
2951
+ s = db_->IngestExternalFiles({arg});
2952
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2953
+
2954
+ // rejected because of memtable overlap
2955
+ arg.atomic_replace_range = {{nullptr, nullptr}};
2956
+ s = db_->IngestExternalFiles({arg});
2957
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2958
+
2959
+ // FIXME: upper bound should be exclusive (DeleteRange semantics).
2960
+ // currently rejected because of documented bug
2961
+ arg.atomic_replace_range = {{"a", "e"}};
2962
+ s = db_->IngestExternalFiles({arg});
2963
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2964
+
2965
+ // work-around ensuring no memtable overlap
2966
+ arg.atomic_replace_range = {{"a", "d2"}};
2967
+ ASSERT_OK(db_->IngestExternalFiles({arg}));
2968
+
2969
+ ASSERT_EQ(Get(1, "e"), "5");
2970
+ } else {
2971
+ // rejected because of partial file overlap
2972
+ arg.atomic_replace_range = {{"b", "z"}};
2973
+ s = db_->IngestExternalFiles({arg});
2974
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
2975
+
2976
+ // no memtable complications
2977
+ arg.atomic_replace_range = {{"a", "z"}};
2978
+ ASSERT_OK(db_->IngestExternalFiles({arg}));
2979
+
2980
+ ASSERT_EQ(Get(1, "e"), "NOT_FOUND");
2981
+ }
2982
+ ASSERT_EQ(Get(1, "a"), "NOT_FOUND");
2983
+ ASSERT_EQ(Get(1, "b"), "0");
2984
+ ASSERT_EQ(Get(1, "c"), "NOT_FOUND");
2985
+ ASSERT_EQ(Get(1, "d"), "NOT_FOUND");
2986
+
2987
+ // The single ingested file replaced everything (except perhaps memtable)
2988
+ std::vector<LiveFileMetaData> live_files;
2989
+ db_->GetLiveFilesMetaData(&live_files);
2990
+ // One file in each CF
2991
+ ASSERT_EQ(live_files.size(), 2);
2992
+
2993
+ ASSERT_OK(sfw.Open(file_path));
2994
+ ASSERT_OK(sfw.Put("f", "6"));
2995
+ ASSERT_OK(sfw.Finish());
2996
+
2997
+ // Another file
2998
+ ASSERT_OK(sfw.Open(file_path2));
2999
+ ASSERT_OK(sfw.Put("f", "7"));
3000
+ ASSERT_OK(sfw.Put("g", "8"));
3001
+ ASSERT_OK(sfw.Finish());
3002
+
3003
+ if (!disallow_memtable) {
3004
+ // rejected because of memtable overlap with range
3005
+ arg.atomic_replace_range = {{"e", "z"}};
3006
+ s = db_->IngestExternalFiles({arg});
3007
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
3008
+
3009
+ // allow blocking flush of "e" (which is then replaced), and the file
3010
+ // with just "b" is not replaced
3011
+ arg.options.allow_blocking_flush = true;
3012
+ ASSERT_OK(db_->IngestExternalFiles({arg}));
3013
+
3014
+ ASSERT_EQ(Get(1, "b"), "0");
3015
+ ASSERT_EQ(Get(1, "e"), "NOT_FOUND");
3016
+ ASSERT_EQ(Get(1, "f"), "6");
3017
+ ASSERT_EQ(Get(1, "g"), "NOT_FOUND");
3018
+
3019
+ // memtable overlap with replace range
3020
+ ASSERT_OK(Put(1, "e", "5"));
3021
+ arg.options.allow_blocking_flush = false;
3022
+ arg.external_files = {file_path2};
3023
+
3024
+ // rejected because of memtable overlap
3025
+ arg.atomic_replace_range = {{nullptr, nullptr}};
3026
+ s = db_->IngestExternalFiles({arg});
3027
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
3028
+
3029
+ // Replace everything, including with memtable flush
3030
+ arg.options.allow_blocking_flush = true;
3031
+ ASSERT_OK(db_->IngestExternalFiles({arg}));
3032
+
3033
+ ASSERT_EQ(Get(1, "b"), "NOT_FOUND");
3034
+ ASSERT_EQ(Get(1, "e"), "NOT_FOUND");
3035
+ ASSERT_EQ(Get(1, "f"), "7");
3036
+ ASSERT_EQ(Get(1, "g"), "8");
3037
+ } else {
3038
+ arg.external_files = {file_path2, file_path};
3039
+
3040
+ // rejected because of overlap in files to ingest with fail_if_ = true
3041
+ arg.atomic_replace_range = {{"e", "z"}};
3042
+ s = db_->IngestExternalFiles({arg});
3043
+ ASSERT_EQ(s.code(), Status::Code::kTryAgain);
3044
+
3045
+ arg.options.fail_if_not_bottommost_level = false;
3046
+
3047
+ // rejected because range doesn't cover ingested files
3048
+ // FIXME: upper bound should be exclusive "g" instead
3049
+ arg.atomic_replace_range = {{"e", "f2"}};
3050
+ s = db_->IngestExternalFiles({arg});
3051
+ ASSERT_EQ(s.code(), Status::Code::kInvalidArgument);
3052
+
3053
+ // Loaded into different levels, and the file with just "b" is not
3054
+ // replaced
3055
+ arg.atomic_replace_range = {{"e", "z"}};
3056
+ ASSERT_OK(db_->IngestExternalFiles({arg}));
3057
+
3058
+ ASSERT_EQ(Get(1, "b"), "0");
3059
+ ASSERT_EQ(Get(1, "f"), "6"); // earlier file listed later to ingest
3060
+ ASSERT_EQ(Get(1, "g"), "8");
3061
+ }
3062
+ }
2676
3063
  }
2677
3064
  }
2678
3065
 
@@ -2878,7 +3265,6 @@ INSTANTIATE_TEST_CASE_P(ExternalSSTFileBasicTest, ExternalSSTFileBasicTest,
2878
3265
  std::make_tuple(false, true),
2879
3266
  std::make_tuple(false, false)));
2880
3267
 
2881
-
2882
3268
  } // namespace ROCKSDB_NAMESPACE
2883
3269
 
2884
3270
  int main(int argc, char** argv) {