@nxtedition/rocksdb 13.5.8 → 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 (508) hide show
  1. package/binding.cc +209 -2
  2. package/deps/rocksdb/rocksdb/BUCK +12 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  4. package/deps/rocksdb/rocksdb/Makefile +28 -23
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  7. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  11. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  12. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  14. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  15. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  16. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  25. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  26. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  27. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  28. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  29. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  30. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  57. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  59. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  60. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  61. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  62. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  67. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  68. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  69. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  70. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  86. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  87. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  88. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  89. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  90. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  91. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  92. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  93. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  94. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  95. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  96. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  97. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  98. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  99. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  100. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  101. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  102. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  104. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  105. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  106. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  107. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  108. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  109. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  110. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  111. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  112. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  113. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  114. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  115. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  116. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  117. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  118. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  119. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  120. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  124. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  125. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  126. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  127. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  129. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  130. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  131. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  132. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  133. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  134. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  135. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  136. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  137. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  138. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  139. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  140. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  141. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  142. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  143. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  144. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  145. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  146. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  147. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  148. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  149. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  150. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  153. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  154. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  155. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  156. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  157. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  158. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  160. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  161. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  163. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  164. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  165. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  166. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  168. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  169. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  170. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  171. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  172. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  173. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  174. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  175. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  176. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  177. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  178. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  179. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  180. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  181. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  182. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  191. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  193. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  194. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  195. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  196. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  198. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  199. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  200. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  201. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  202. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  204. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  205. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  206. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  207. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  210. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  212. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  213. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  214. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  215. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  218. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  220. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  221. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  224. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  226. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  228. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  229. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  230. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  232. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  234. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  235. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  238. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  241. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  242. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  243. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  245. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  247. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  249. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  253. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  254. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  257. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  260. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  269. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  270. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  276. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  277. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  278. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  279. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  281. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  283. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  284. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  285. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  286. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  288. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  289. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  290. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  291. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  292. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  293. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  294. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  295. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  296. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  297. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  298. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  299. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  300. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  301. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  302. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  303. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  304. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  305. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  306. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  307. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  308. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  309. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  310. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  311. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  312. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  314. package/deps/rocksdb/rocksdb/src.mk +17 -11
  315. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  316. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  325. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  327. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  328. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  329. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  330. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  334. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  335. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  338. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  340. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  342. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  343. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  345. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  349. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  350. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  351. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  352. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  353. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  354. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  356. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  357. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  362. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  364. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  366. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  367. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  368. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  369. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  370. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  371. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  372. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  374. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  376. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  377. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  380. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  381. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  382. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  384. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  385. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  386. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  388. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  391. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  393. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  395. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  396. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  397. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  398. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  399. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  400. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  401. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  402. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  403. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  404. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  405. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  406. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  408. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  409. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  410. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  411. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  412. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  413. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  414. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  416. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  428. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  430. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  433. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  435. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  436. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  437. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  439. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  442. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  443. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  458. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  464. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  467. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  468. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  479. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  482. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  485. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  486. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  499. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  500. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  504. package/deps/rocksdb/rocksdb.gyp +5 -0
  505. package/index.js +47 -2
  506. package/package.json +8 -1
  507. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  508. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -862,9 +862,9 @@ Version::~Version() {
862
862
  // to get current mutable options from
863
863
  auto* sv = cfd_->GetSuperVersion();
864
864
  uint32_t path_id = f->fd.GetPathId();
865
- assert(path_id < cfd_->ioptions()->cf_paths.size());
865
+ assert(path_id < cfd_->ioptions().cf_paths.size());
866
866
  vset_->obsolete_files_.emplace_back(
867
- f, cfd_->ioptions()->cf_paths[path_id].path,
867
+ f, cfd_->ioptions().cf_paths[path_id].path,
868
868
  sv ? sv->mutable_cf_options.uncache_aggressiveness : 0,
869
869
  cfd_->GetFileMetadataCacheReservationManager());
870
870
  }
@@ -1002,7 +1002,8 @@ class LevelIterator final : public InternalIterator {
1002
1002
  skip_filters_(skip_filters),
1003
1003
  allow_unprepared_value_(allow_unprepared_value),
1004
1004
  is_next_read_sequential_(false),
1005
- to_return_sentinel_(false) {
1005
+ to_return_sentinel_(false),
1006
+ scan_opts_(nullptr) {
1006
1007
  // Empty level is not supported.
1007
1008
  assert(flevel_ != nullptr && flevel_->num_files > 0);
1008
1009
  if (range_tombstone_iter_ptr_) {
@@ -1098,6 +1099,13 @@ class LevelIterator final : public InternalIterator {
1098
1099
  read_seq_ = read_seq;
1099
1100
  }
1100
1101
 
1102
+ void Prepare(const std::vector<ScanOptions>* scan_opts) override {
1103
+ scan_opts_ = scan_opts;
1104
+ if (file_iter_.iter()) {
1105
+ file_iter_.Prepare(scan_opts_);
1106
+ }
1107
+ }
1108
+
1101
1109
  private:
1102
1110
  // Return true if at least one invalid file is seen and skipped.
1103
1111
  bool SkipEmptyFileForward();
@@ -1223,6 +1231,7 @@ class LevelIterator final : public InternalIterator {
1223
1231
  bool prefix_exhausted_ = false;
1224
1232
  // Whether next/prev key is a sentinel key.
1225
1233
  bool to_return_sentinel_ = false;
1234
+ const std::vector<ScanOptions>* scan_opts_;
1226
1235
 
1227
1236
  // Sets flags for if we should return the sentinel key next.
1228
1237
  // The condition for returning sentinel is reaching the end of current
@@ -1533,6 +1542,11 @@ void LevelIterator::SetFileIterator(InternalIterator* iter) {
1533
1542
  }
1534
1543
 
1535
1544
  InternalIterator* old_iter = file_iter_.Set(iter);
1545
+ // Since this is a new table iterator, no need to call Prepare() if
1546
+ // scan_opts_ is null
1547
+ if (iter && scan_opts_) {
1548
+ file_iter_.Prepare(scan_opts_);
1549
+ }
1536
1550
 
1537
1551
  // Update the read pattern for PrefetchBuffer.
1538
1552
  if (is_next_read_sequential_) {
@@ -1574,8 +1588,8 @@ Status Version::GetTableProperties(const ReadOptions& read_options,
1574
1588
  std::shared_ptr<const TableProperties>* tp,
1575
1589
  const FileMetaData* file_meta,
1576
1590
  const std::string* fname) const {
1577
- auto table_cache = cfd_->table_cache();
1578
- auto ioptions = cfd_->ioptions();
1591
+ auto* table_cache = cfd_->table_cache();
1592
+ const auto& ioptions = cfd_->ioptions();
1579
1593
  Status s = table_cache->GetTableProperties(
1580
1594
  file_options_, read_options, cfd_->internal_comparator(), *file_meta, tp,
1581
1595
  mutable_cf_options_, true /* no io */);
@@ -1596,11 +1610,11 @@ Status Version::GetTableProperties(const ReadOptions& read_options,
1596
1610
  if (fname != nullptr) {
1597
1611
  file_name = *fname;
1598
1612
  } else {
1599
- file_name = TableFileName(ioptions->cf_paths, file_meta->fd.GetNumber(),
1613
+ file_name = TableFileName(ioptions.cf_paths, file_meta->fd.GetNumber(),
1600
1614
  file_meta->fd.GetPathId());
1601
1615
  }
1602
- s = ioptions->fs->NewRandomAccessFile(file_name, file_options_, &file,
1603
- nullptr);
1616
+ s = ioptions.fs->NewRandomAccessFile(file_name, file_options_, &file,
1617
+ nullptr);
1604
1618
  if (!s.ok()) {
1605
1619
  return s;
1606
1620
  }
@@ -1609,26 +1623,26 @@ Status Version::GetTableProperties(const ReadOptions& read_options,
1609
1623
  // the magic number check in the footer.
1610
1624
  std::unique_ptr<RandomAccessFileReader> file_reader(
1611
1625
  new RandomAccessFileReader(
1612
- std::move(file), file_name, ioptions->clock /* clock */, io_tracer_,
1613
- ioptions->stats /* stats */,
1626
+ std::move(file), file_name, ioptions.clock /* clock */, io_tracer_,
1627
+ ioptions.stats /* stats */,
1614
1628
  Histograms::SST_READ_MICROS /* hist_type */,
1615
1629
  nullptr /* file_read_hist */, nullptr /* rate_limiter */,
1616
- ioptions->listeners));
1630
+ ioptions.listeners));
1617
1631
  std::unique_ptr<TableProperties> props;
1618
1632
  s = ReadTableProperties(
1619
1633
  file_reader.get(), file_meta->fd.GetFileSize(),
1620
- Footer::kNullTableMagicNumber /* table's magic number */, *ioptions,
1634
+ Footer::kNullTableMagicNumber /* table's magic number */, ioptions,
1621
1635
  read_options, &props);
1622
1636
  if (!s.ok()) {
1623
1637
  return s;
1624
1638
  }
1625
1639
  *tp = std::move(props);
1626
- RecordTick(ioptions->stats, NUMBER_DIRECT_LOAD_TABLE_PROPERTIES);
1640
+ RecordTick(ioptions.stats, NUMBER_DIRECT_LOAD_TABLE_PROPERTIES);
1627
1641
  return s;
1628
1642
  }
1629
1643
 
1630
- Status Version::GetPropertiesOfAllTables(const ReadOptions& read_options,
1631
- TablePropertiesCollection* props) {
1644
+ Status Version::GetPropertiesOfAllTables(
1645
+ const ReadOptions& read_options, TablePropertiesCollection* props) const {
1632
1646
  Status s;
1633
1647
  for (int level = 0; level < storage_info_.num_levels_; level++) {
1634
1648
  s = GetPropertiesOfAllTables(read_options, props, level);
@@ -1654,7 +1668,7 @@ Status Version::TablesRangeTombstoneSummary(int max_entries_to_print,
1654
1668
  for (int level = 0; level < storage_info_.num_levels_; level++) {
1655
1669
  for (const auto& file_meta : storage_info_.files_[level]) {
1656
1670
  auto fname =
1657
- TableFileName(cfd_->ioptions()->cf_paths, file_meta->fd.GetNumber(),
1671
+ TableFileName(cfd_->ioptions().cf_paths, file_meta->fd.GetNumber(),
1658
1672
  file_meta->fd.GetPathId());
1659
1673
 
1660
1674
  ss << "=== file : " << fname << " ===\n";
@@ -1699,10 +1713,10 @@ Status Version::TablesRangeTombstoneSummary(int max_entries_to_print,
1699
1713
 
1700
1714
  Status Version::GetPropertiesOfAllTables(const ReadOptions& read_options,
1701
1715
  TablePropertiesCollection* props,
1702
- int level) {
1716
+ int level) const {
1703
1717
  for (const auto& file_meta : storage_info_.files_[level]) {
1704
1718
  auto fname =
1705
- TableFileName(cfd_->ioptions()->cf_paths, file_meta->fd.GetNumber(),
1719
+ TableFileName(cfd_->ioptions().cf_paths, file_meta->fd.GetNumber(),
1706
1720
  file_meta->fd.GetPathId());
1707
1721
  // 1. If the table is already present in table cache, load table
1708
1722
  // properties from there.
@@ -1732,7 +1746,7 @@ Status Version::GetPropertiesOfTablesInRange(
1732
1746
  false);
1733
1747
  for (const auto& file_meta : files) {
1734
1748
  auto fname =
1735
- TableFileName(cfd_->ioptions()->cf_paths, file_meta->fd.GetNumber(),
1749
+ TableFileName(cfd_->ioptions().cf_paths, file_meta->fd.GetNumber(),
1736
1750
  file_meta->fd.GetPathId());
1737
1751
  if (props->count(fname) == 0) {
1738
1752
  // 1. If the table is already present in table cache, load table
@@ -1753,6 +1767,24 @@ Status Version::GetPropertiesOfTablesInRange(
1753
1767
  return Status::OK();
1754
1768
  }
1755
1769
 
1770
+ Status Version::GetPropertiesOfTablesByLevel(
1771
+ const ReadOptions& read_options,
1772
+ std::vector<std::unique_ptr<TablePropertiesCollection>>* props_by_level)
1773
+ const {
1774
+ Status s;
1775
+
1776
+ props_by_level->reserve(storage_info_.num_levels_);
1777
+ for (int level = 0; level < storage_info_.num_levels_; level++) {
1778
+ props_by_level->push_back(std::make_unique<TablePropertiesCollection>());
1779
+ s = GetPropertiesOfAllTables(read_options, props_by_level->back().get(),
1780
+ level);
1781
+ if (!s.ok()) {
1782
+ return s;
1783
+ }
1784
+ }
1785
+ return Status::OK();
1786
+ }
1787
+
1756
1788
  Status Version::GetAggregatedTableProperties(
1757
1789
  const ReadOptions& read_options, std::shared_ptr<const TableProperties>* tp,
1758
1790
  int level) {
@@ -1800,7 +1832,7 @@ void Version::GetColumnFamilyMetaData(ColumnFamilyMetaData* cf_meta) {
1800
1832
  cf_meta->blob_file_count = 0;
1801
1833
  cf_meta->blob_files.clear();
1802
1834
 
1803
- auto* ioptions = cfd_->ioptions();
1835
+ const auto& ioptions = cfd_->ioptions();
1804
1836
  auto* vstorage = storage_info();
1805
1837
 
1806
1838
  for (int level = 0; level < cfd_->NumberLevels(); level++) {
@@ -1810,11 +1842,11 @@ void Version::GetColumnFamilyMetaData(ColumnFamilyMetaData* cf_meta) {
1810
1842
  for (const auto& file : vstorage->LevelFiles(level)) {
1811
1843
  uint32_t path_id = file->fd.GetPathId();
1812
1844
  std::string file_path;
1813
- if (path_id < ioptions->cf_paths.size()) {
1814
- file_path = ioptions->cf_paths[path_id].path;
1845
+ if (path_id < ioptions.cf_paths.size()) {
1846
+ file_path = ioptions.cf_paths[path_id].path;
1815
1847
  } else {
1816
- assert(!ioptions->cf_paths.empty());
1817
- file_path = ioptions->cf_paths.back().path;
1848
+ assert(!ioptions.cf_paths.empty());
1849
+ file_path = ioptions.cf_paths.back().path;
1818
1850
  }
1819
1851
  const uint64_t file_number = file->fd.GetNumber();
1820
1852
  files.emplace_back(
@@ -1841,7 +1873,7 @@ void Version::GetColumnFamilyMetaData(ColumnFamilyMetaData* cf_meta) {
1841
1873
 
1842
1874
  cf_meta->blob_files.emplace_back(
1843
1875
  meta->GetBlobFileNumber(), BlobFileName("", meta->GetBlobFileNumber()),
1844
- ioptions->cf_paths.front().path, meta->GetBlobFileSize(),
1876
+ ioptions.cf_paths.front().path, meta->GetBlobFileSize(),
1845
1877
  meta->GetTotalBlobCount(), meta->GetTotalBlobBytes(),
1846
1878
  meta->GetGarbageBlobCount(), meta->GetGarbageBlobBytes(),
1847
1879
  meta->GetChecksumMethod(), meta->GetChecksumValue());
@@ -2202,31 +2234,31 @@ VersionStorageInfo::VersionStorageInfo(
2202
2234
 
2203
2235
  Version::Version(ColumnFamilyData* column_family_data, VersionSet* vset,
2204
2236
  const FileOptions& file_opt,
2205
- const MutableCFOptions mutable_cf_options,
2237
+ const MutableCFOptions& mutable_cf_options,
2206
2238
  const std::shared_ptr<IOTracer>& io_tracer,
2207
2239
  uint64_t version_number,
2208
2240
  EpochNumberRequirement epoch_number_requirement)
2209
2241
  : env_(vset->env_),
2210
2242
  clock_(vset->clock_),
2211
2243
  cfd_(column_family_data),
2212
- info_log_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->logger),
2213
- db_statistics_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->stats),
2244
+ info_log_((cfd_ == nullptr) ? nullptr : cfd_->ioptions().logger),
2245
+ db_statistics_((cfd_ == nullptr) ? nullptr : cfd_->ioptions().stats),
2214
2246
  table_cache_((cfd_ == nullptr) ? nullptr : cfd_->table_cache()),
2215
2247
  blob_source_(cfd_ ? cfd_->blob_source() : nullptr),
2216
2248
  merge_operator_(
2217
- (cfd_ == nullptr) ? nullptr : cfd_->ioptions()->merge_operator.get()),
2249
+ (cfd_ == nullptr) ? nullptr : cfd_->ioptions().merge_operator.get()),
2218
2250
  storage_info_(
2219
2251
  (cfd_ == nullptr) ? nullptr : &cfd_->internal_comparator(),
2220
2252
  (cfd_ == nullptr) ? nullptr : cfd_->user_comparator(),
2221
2253
  cfd_ == nullptr ? 0 : cfd_->NumberLevels(),
2222
2254
  cfd_ == nullptr ? kCompactionStyleLevel
2223
- : cfd_->ioptions()->compaction_style,
2255
+ : cfd_->ioptions().compaction_style,
2224
2256
  (cfd_ == nullptr || cfd_->current() == nullptr)
2225
2257
  ? nullptr
2226
2258
  : cfd_->current()->storage_info(),
2227
- cfd_ == nullptr ? false : cfd_->ioptions()->force_consistency_checks,
2259
+ cfd_ == nullptr ? false : cfd_->ioptions().force_consistency_checks,
2228
2260
  epoch_number_requirement,
2229
- cfd_ == nullptr ? nullptr : cfd_->ioptions()->clock,
2261
+ cfd_ == nullptr ? nullptr : cfd_->ioptions().clock,
2230
2262
  cfd_ == nullptr ? 0
2231
2263
  : mutable_cf_options.bottommost_file_compaction_delay,
2232
2264
  vset->offpeak_time_option()),
@@ -3064,7 +3096,7 @@ Status Version::MultiGetAsync(
3064
3096
  bool Version::IsFilterSkipped(int level, bool is_file_last_in_level) {
3065
3097
  // Reaching the bottom level implies misses at all upper levels, so we'll
3066
3098
  // skip checking the filters when we predict a hit.
3067
- return cfd_->ioptions()->optimize_filters_for_hits &&
3099
+ return cfd_->ioptions().optimize_filters_for_hits &&
3068
3100
  (level > 0 || is_file_last_in_level) &&
3069
3101
  level == storage_info_.num_non_empty_levels() - 1;
3070
3102
  }
@@ -3091,8 +3123,7 @@ void VersionStorageInfo::PrepareForVersionAppend(
3091
3123
  GenerateFileLocationIndex();
3092
3124
  }
3093
3125
 
3094
- void Version::PrepareAppend(const MutableCFOptions& mutable_cf_options,
3095
- const ReadOptions& read_options,
3126
+ void Version::PrepareAppend(const ReadOptions& read_options,
3096
3127
  bool update_stats) {
3097
3128
  TEST_SYNC_POINT_CALLBACK(
3098
3129
  "Version::PrepareAppend:forced_check",
@@ -3102,7 +3133,7 @@ void Version::PrepareAppend(const MutableCFOptions& mutable_cf_options,
3102
3133
  UpdateAccumulatedStats(read_options);
3103
3134
  }
3104
3135
 
3105
- storage_info_.PrepareForVersionAppend(*cfd_->ioptions(), mutable_cf_options);
3136
+ storage_info_.PrepareForVersionAppend(cfd_->ioptions(), mutable_cf_options_);
3106
3137
  }
3107
3138
 
3108
3139
  bool Version::MaybeInitializeFileMetaData(const ReadOptions& read_options,
@@ -3987,26 +4018,25 @@ void SortFileByOverlappingRatio(
3987
4018
  ? VersionStorageInfo::kNumberFilesToSort
3988
4019
  : temp->size();
3989
4020
 
3990
- std::partial_sort(temp->begin(), temp->begin() + num_to_sort, temp->end(),
3991
- [&](const Fsize& f1, const Fsize& f2) -> bool {
3992
- // If score is the same, pick file with smaller keys.
3993
- // This makes the algorithm more deterministic, and also
3994
- // help the trivial move case to have more files to
3995
- // extend.
3996
- if (f1.file->marked_for_compaction ==
3997
- f2.file->marked_for_compaction) {
3998
- if (file_to_order[f1.file->fd.GetNumber()] ==
3999
- file_to_order[f2.file->fd.GetNumber()]) {
4000
- return icmp.Compare(f1.file->smallest,
4001
- f2.file->smallest) < 0;
4002
- }
4003
- return file_to_order[f1.file->fd.GetNumber()] <
4004
- file_to_order[f2.file->fd.GetNumber()];
4005
- } else {
4006
- return f1.file->marked_for_compaction >
4007
- f2.file->marked_for_compaction;
4008
- }
4009
- });
4021
+ std::partial_sort(
4022
+ temp->begin(), temp->begin() + num_to_sort, temp->end(),
4023
+ [&](const Fsize& f1, const Fsize& f2) -> bool {
4024
+ // If score is the same, pick file with smaller keys.
4025
+ // This makes the algorithm more deterministic, and also
4026
+ // help the trivial move case to have more files to
4027
+ // extend.
4028
+ if (f1.file->marked_for_compaction == f2.file->marked_for_compaction) {
4029
+ if (file_to_order[f1.file->fd.GetNumber()] ==
4030
+ file_to_order[f2.file->fd.GetNumber()]) {
4031
+ return icmp.Compare(f1.file->smallest, f2.file->smallest) < 0;
4032
+ }
4033
+ return file_to_order[f1.file->fd.GetNumber()] <
4034
+ file_to_order[f2.file->fd.GetNumber()];
4035
+ } else {
4036
+ return f1.file->marked_for_compaction >
4037
+ f2.file->marked_for_compaction;
4038
+ }
4039
+ });
4010
4040
  }
4011
4041
 
4012
4042
  void SortFileByRoundRobin(const InternalKeyComparator& icmp,
@@ -4086,7 +4116,7 @@ void VersionStorageInfo::UpdateFilesByCompactionPri(
4086
4116
  temp[i].file = files[i];
4087
4117
  }
4088
4118
 
4089
- // sort the top number_of_files_to_sort_ based on file size
4119
+ // sort the top kNumberFilesToSort based on file size
4090
4120
  size_t num = VersionStorageInfo::kNumberFilesToSort;
4091
4121
  if (num > temp.size()) {
4092
4122
  num = temp.size();
@@ -4614,12 +4644,12 @@ void VersionStorageInfo::RecoverEpochNumbers(ColumnFamilyData* cfd,
4614
4644
  cfd->ResetNextEpochNumber();
4615
4645
 
4616
4646
  bool reserve_epoch_num_for_file_ingested_behind =
4617
- cfd->ioptions()->allow_ingest_behind;
4647
+ cfd->ioptions().allow_ingest_behind;
4618
4648
  if (reserve_epoch_num_for_file_ingested_behind) {
4619
4649
  uint64_t reserved_epoch_number = cfd->NewEpochNumber();
4620
4650
  assert(reserved_epoch_number ==
4621
4651
  kReservedEpochNumberForFileIngestedBehind);
4622
- ROCKS_LOG_INFO(cfd->ioptions()->info_log.get(),
4652
+ ROCKS_LOG_INFO(cfd->ioptions().info_log.get(),
4623
4653
  "[%s]CF has reserved epoch number %" PRIu64
4624
4654
  " for files ingested "
4625
4655
  "behind since `Options::allow_ingest_behind` is true",
@@ -4647,7 +4677,7 @@ void VersionStorageInfo::RecoverEpochNumbers(ColumnFamilyData* cfd,
4647
4677
  if (missing_epoch_number) {
4648
4678
  assert(epoch_number_requirement_ ==
4649
4679
  EpochNumberRequirement::kMightMissing);
4650
- ROCKS_LOG_WARN(cfd->ioptions()->info_log.get(),
4680
+ ROCKS_LOG_WARN(cfd->ioptions().info_log.get(),
4651
4681
  "[%s]CF's epoch numbers are inferred based on seqno",
4652
4682
  cfd->GetName().c_str());
4653
4683
  epoch_number_requirement_ = EpochNumberRequirement::kMustPresent;
@@ -4763,7 +4793,7 @@ void VersionStorageInfo::CalculateBaseBytes(const ImmutableOptions& ioptions,
4763
4793
  cur_level_size <= base_bytes_min &&
4764
4794
  (options.preclude_last_level_data_seconds == 0 ||
4765
4795
  i < num_levels_ - 2)) {
4766
- // When per_key_placement is enabled, the penultimate level is
4796
+ // When per_key_placement is enabled, the proximal level is
4767
4797
  // necessary.
4768
4798
  lowest_unnecessary_level_ = i;
4769
4799
  }
@@ -4905,24 +4935,38 @@ bool VersionStorageInfo::RangeMightExistAfterSortedRun(
4905
4935
  }
4906
4936
 
4907
4937
  Env::WriteLifeTimeHint VersionStorageInfo::CalculateSSTWriteHint(
4908
- int level) const {
4909
- if (compaction_style_ != kCompactionStyleLevel) {
4938
+ int level, CompactionStyleSet compaction_style_set) const {
4939
+ if (!compaction_style_set.Contains(compaction_style_)) {
4910
4940
  return Env::WLTH_NOT_SET;
4911
4941
  }
4912
- if (level == 0) {
4913
- return Env::WLTH_MEDIUM;
4914
- }
4915
4942
 
4916
- // L1: medium, L2: long, ...
4917
- if (level - base_level_ >= 2) {
4918
- return Env::WLTH_EXTREME;
4919
- } else if (level < base_level_) {
4920
- // There is no restriction which prevents level passed in to be smaller
4921
- // than base_level.
4922
- return Env::WLTH_MEDIUM;
4943
+ switch (compaction_style_) {
4944
+ case kCompactionStyleLevel:
4945
+ if (level == 0) {
4946
+ return Env::WLTH_MEDIUM;
4947
+ }
4948
+
4949
+ // L1: medium, L2: long, ...
4950
+ if (level - base_level_ >= 2) {
4951
+ return Env::WLTH_EXTREME;
4952
+ } else if (level < base_level_) {
4953
+ // There is no restriction which prevents level passed in to be smaller
4954
+ // than base_level.
4955
+ return Env::WLTH_MEDIUM;
4956
+ }
4957
+ return static_cast<Env::WriteLifeTimeHint>(
4958
+ level - base_level_ + static_cast<int>(Env::WLTH_MEDIUM));
4959
+ case kCompactionStyleUniversal:
4960
+ if (level == 0) {
4961
+ return Env::WLTH_SHORT;
4962
+ }
4963
+ if (level == 1) {
4964
+ return Env::WLTH_MEDIUM;
4965
+ }
4966
+ return Env::WLTH_LONG;
4967
+ default:
4968
+ return Env::WLTH_NOT_SET;
4923
4969
  }
4924
- return static_cast<Env::WriteLifeTimeHint>(
4925
- level - base_level_ + static_cast<int>(Env::WLTH_MEDIUM));
4926
4970
  }
4927
4971
 
4928
4972
  void Version::AddLiveFiles(std::vector<uint64_t>* live_table_files,
@@ -5038,18 +5082,16 @@ struct VersionSet::ManifestWriter {
5038
5082
  bool done;
5039
5083
  InstrumentedCondVar cv;
5040
5084
  ColumnFamilyData* cfd;
5041
- const MutableCFOptions mutable_cf_options;
5042
5085
  const autovector<VersionEdit*>& edit_list;
5043
5086
  const std::function<void(const Status&)> manifest_write_callback;
5044
5087
 
5045
5088
  explicit ManifestWriter(
5046
5089
  InstrumentedMutex* mu, ColumnFamilyData* _cfd,
5047
- const MutableCFOptions& cf_options, const autovector<VersionEdit*>& e,
5090
+ const autovector<VersionEdit*>& e,
5048
5091
  const std::function<void(const Status&)>& manifest_wcb)
5049
5092
  : done(false),
5050
5093
  cv(mu),
5051
5094
  cfd(_cfd),
5052
- mutable_cf_options(cf_options),
5053
5095
  edit_list(e),
5054
5096
  manifest_write_callback(manifest_wcb) {}
5055
5097
  ~ManifestWriter() { status.PermitUncheckedError(); }
@@ -5118,7 +5160,7 @@ VersionSet::VersionSet(
5118
5160
  BlockCacheTracer* const block_cache_tracer,
5119
5161
  const std::shared_ptr<IOTracer>& io_tracer, const std::string& db_id,
5120
5162
  const std::string& db_session_id, const std::string& daily_offpeak_time_utc,
5121
- ErrorHandler* const error_handler, const bool read_only)
5163
+ ErrorHandler* error_handler, bool unchanging)
5122
5164
  : column_family_set_(new ColumnFamilySet(
5123
5165
  dbname, _db_options, storage_options, table_cache,
5124
5166
  write_buffer_manager, write_controller, block_cache_tracer, io_tracer,
@@ -5147,12 +5189,12 @@ VersionSet::VersionSet(
5147
5189
  db_session_id_(db_session_id),
5148
5190
  offpeak_time_option_(OffpeakTimeOption(daily_offpeak_time_utc)),
5149
5191
  error_handler_(error_handler),
5150
- read_only_(read_only),
5192
+ unchanging_(unchanging),
5151
5193
  closed_(false) {}
5152
5194
 
5153
5195
  Status VersionSet::Close(FSDirectory* db_dir, InstrumentedMutex* mu) {
5154
5196
  Status s;
5155
- if (closed_ || read_only_ || !manifest_file_number_ || !descriptor_log_) {
5197
+ if (closed_ || unchanging_ || !manifest_file_number_ || !descriptor_log_) {
5156
5198
  return s;
5157
5199
  }
5158
5200
 
@@ -5172,12 +5214,11 @@ Status VersionSet::Close(FSDirectory* db_dir, InstrumentedMutex* mu) {
5172
5214
  io_s = IOStatus::Corruption();
5173
5215
  }
5174
5216
  ColumnFamilyData* cfd = GetColumnFamilySet()->GetDefault();
5175
- const ImmutableOptions* ioptions = cfd->ioptions();
5176
5217
  IOErrorInfo io_error_info(io_s, FileOperationType::kVerify,
5177
5218
  manifest_file_name, /*length=*/size,
5178
5219
  /*offset=*/0);
5179
5220
 
5180
- for (auto& listener : ioptions->listeners) {
5221
+ for (auto& listener : cfd->ioptions().listeners) {
5181
5222
  listener->OnIOError(io_error_info);
5182
5223
  }
5183
5224
  io_s.PermitUncheckedError();
@@ -5191,9 +5232,7 @@ Status VersionSet::Close(FSDirectory* db_dir, InstrumentedMutex* mu) {
5191
5232
  io_s.ToString().c_str(), size);
5192
5233
  VersionEdit edit;
5193
5234
  assert(cfd);
5194
- const MutableCFOptions& cf_opts = *cfd->GetLatestMutableCFOptions();
5195
- s = LogAndApply(cfd, cf_opts, ReadOptions(), WriteOptions(), &edit, mu,
5196
- db_dir);
5235
+ s = LogAndApply(cfd, ReadOptions(), WriteOptions(), &edit, mu, db_dir);
5197
5236
  }
5198
5237
 
5199
5238
  closed_ = true;
@@ -5256,8 +5295,8 @@ void VersionSet::AppendVersion(ColumnFamilyData* column_family_data,
5256
5295
  Version* v) {
5257
5296
  // compute new compaction score
5258
5297
  v->storage_info()->ComputeCompactionScore(
5259
- *column_family_data->ioptions(),
5260
- *column_family_data->GetLatestMutableCFOptions());
5298
+ column_family_data->ioptions(),
5299
+ column_family_data->GetLatestMutableCFOptions());
5261
5300
 
5262
5301
  // Mark v finalized
5263
5302
  v->storage_info_.SetFinalized();
@@ -5301,7 +5340,6 @@ Status VersionSet::ProcessManifestWrites(
5301
5340
  // element removed, `batch_edits_ts_sz` should be updated too.
5302
5341
  autovector<std::optional<size_t>> batch_edits_ts_sz;
5303
5342
  autovector<Version*> versions;
5304
- autovector<const MutableCFOptions*> mutable_cf_options_ptrs;
5305
5343
  std::vector<std::unique_ptr<BaseReferencedVersionBuilder>> builder_guards;
5306
5344
  autovector<const autovector<uint64_t>*> files_to_quarantine_if_commit_fail;
5307
5345
  autovector<uint64_t> limbo_descriptor_log_file_number;
@@ -5313,6 +5351,9 @@ Status VersionSet::ProcessManifestWrites(
5313
5351
  // succeeds.
5314
5352
  SequenceNumber max_last_sequence = descriptor_last_sequence_;
5315
5353
 
5354
+ bool skip_manifest_write =
5355
+ first_writer.edit_list.front()->IsNoManifestWriteDummy();
5356
+
5316
5357
  if (first_writer.edit_list.front()->IsColumnFamilyManipulation()) {
5317
5358
  // No group commits for column family add or drop
5318
5359
  LogAndApplyCFHelper(first_writer.edit_list.front(), &max_last_sequence);
@@ -5321,12 +5362,9 @@ Status VersionSet::ProcessManifestWrites(
5321
5362
  } else {
5322
5363
  auto it = manifest_writers_.cbegin();
5323
5364
  size_t group_start = std::numeric_limits<size_t>::max();
5324
- while (it != manifest_writers_.cend()) {
5325
- if ((*it)->edit_list.front()->IsColumnFamilyManipulation()) {
5326
- // no group commits for column family add or drop
5327
- break;
5328
- }
5329
- last_writer = *(it++);
5365
+ for (;;) {
5366
+ assert(!(*it)->edit_list.front()->IsColumnFamilyManipulation());
5367
+ last_writer = *it;
5330
5368
  assert(last_writer != nullptr);
5331
5369
  assert(last_writer->cfd != nullptr);
5332
5370
  if (last_writer->cfd->IsDropped()) {
@@ -5361,65 +5399,83 @@ Status VersionSet::ProcessManifestWrites(
5361
5399
  }
5362
5400
  }
5363
5401
  }
5364
- continue;
5365
- }
5366
- // We do a linear search on versions because versions is small.
5367
- // TODO(yanqin) maybe consider unordered_map
5368
- Version* version = nullptr;
5369
- VersionBuilder* builder = nullptr;
5370
- for (int i = 0; i != static_cast<int>(versions.size()); ++i) {
5371
- uint32_t cf_id = last_writer->cfd->GetID();
5372
- if (versions[i]->cfd()->GetID() == cf_id) {
5373
- version = versions[i];
5374
- assert(!builder_guards.empty() &&
5375
- builder_guards.size() == versions.size());
5376
- builder = builder_guards[i]->version_builder();
5377
- TEST_SYNC_POINT_CALLBACK(
5378
- "VersionSet::ProcessManifestWrites:SameColumnFamily", &cf_id);
5379
- break;
5380
- }
5381
- }
5382
- if (version == nullptr) {
5383
- // WAL manipulations do not need to be applied to versions.
5384
- if (!last_writer->IsAllWalEdits()) {
5385
- version = new Version(last_writer->cfd, this, file_options_,
5386
- last_writer->mutable_cf_options, io_tracer_,
5387
- current_version_number_++);
5388
- versions.push_back(version);
5389
- mutable_cf_options_ptrs.push_back(&last_writer->mutable_cf_options);
5390
- builder_guards.emplace_back(
5391
- new BaseReferencedVersionBuilder(last_writer->cfd));
5392
- builder = builder_guards.back()->version_builder();
5402
+ } else {
5403
+ // We do a linear search on versions because versions is small.
5404
+ // TODO(yanqin) maybe consider unordered_map
5405
+ Version* version = nullptr;
5406
+ VersionBuilder* builder = nullptr;
5407
+ for (int i = 0; i != static_cast<int>(versions.size()); ++i) {
5408
+ uint32_t cf_id = last_writer->cfd->GetID();
5409
+ if (versions[i]->cfd()->GetID() == cf_id) {
5410
+ version = versions[i];
5411
+ assert(!builder_guards.empty() &&
5412
+ builder_guards.size() == versions.size());
5413
+ builder = builder_guards[i]->version_builder();
5414
+ TEST_SYNC_POINT_CALLBACK(
5415
+ "VersionSet::ProcessManifestWrites:SameColumnFamily", &cf_id);
5416
+ break;
5417
+ }
5393
5418
  }
5394
- assert(last_writer->IsAllWalEdits() || builder);
5395
- assert(last_writer->IsAllWalEdits() || version);
5396
- TEST_SYNC_POINT_CALLBACK("VersionSet::ProcessManifestWrites:NewVersion",
5397
- version);
5398
- }
5399
- const Comparator* ucmp = last_writer->cfd->user_comparator();
5400
- assert(ucmp);
5401
- std::optional<size_t> edit_ts_sz = ucmp->timestamp_size();
5402
- for (const auto& e : last_writer->edit_list) {
5403
- if (e->IsInAtomicGroup()) {
5404
- if (batch_edits.empty() || !batch_edits.back()->IsInAtomicGroup() ||
5405
- (batch_edits.back()->IsInAtomicGroup() &&
5406
- batch_edits.back()->GetRemainingEntries() == 0)) {
5407
- group_start = batch_edits.size();
5419
+ if (version == nullptr) {
5420
+ // WAL manipulations do not need to be applied to versions.
5421
+ if (!last_writer->IsAllWalEdits()) {
5422
+ version = new Version(
5423
+ last_writer->cfd, this, file_options_,
5424
+ last_writer->cfd ? last_writer->cfd->GetLatestMutableCFOptions()
5425
+ : MutableCFOptions(*new_cf_options),
5426
+ io_tracer_, current_version_number_++);
5427
+ versions.push_back(version);
5428
+ builder_guards.emplace_back(
5429
+ new BaseReferencedVersionBuilder(last_writer->cfd));
5430
+ builder = builder_guards.back()->version_builder();
5408
5431
  }
5409
- } else if (group_start != std::numeric_limits<size_t>::max()) {
5410
- group_start = std::numeric_limits<size_t>::max();
5432
+ assert(last_writer->IsAllWalEdits() || builder);
5433
+ assert(last_writer->IsAllWalEdits() || version);
5434
+ TEST_SYNC_POINT_CALLBACK(
5435
+ "VersionSet::ProcessManifestWrites:NewVersion", version);
5411
5436
  }
5412
- Status s = LogAndApplyHelper(last_writer->cfd, builder, e,
5413
- &max_last_sequence, mu);
5414
- if (!s.ok()) {
5415
- // free up the allocated memory
5416
- for (auto v : versions) {
5417
- delete v;
5437
+ const Comparator* ucmp = last_writer->cfd->user_comparator();
5438
+ assert(ucmp);
5439
+ std::optional<size_t> edit_ts_sz = ucmp->timestamp_size();
5440
+ for (const auto& e : last_writer->edit_list) {
5441
+ if (e->IsInAtomicGroup()) {
5442
+ if (batch_edits.empty() || !batch_edits.back()->IsInAtomicGroup() ||
5443
+ (batch_edits.back()->IsInAtomicGroup() &&
5444
+ batch_edits.back()->GetRemainingEntries() == 0)) {
5445
+ group_start = batch_edits.size();
5446
+ }
5447
+ } else if (group_start != std::numeric_limits<size_t>::max()) {
5448
+ group_start = std::numeric_limits<size_t>::max();
5418
5449
  }
5419
- return s;
5450
+ Status s = LogAndApplyHelper(last_writer->cfd, builder, e,
5451
+ &max_last_sequence, mu);
5452
+ if (!s.ok()) {
5453
+ // free up the allocated memory
5454
+ for (auto v : versions) {
5455
+ delete v;
5456
+ }
5457
+ // FIXME? manifest_writers_ still has requested updates
5458
+ return s;
5459
+ }
5460
+ batch_edits.push_back(e);
5461
+ batch_edits_ts_sz.push_back(edit_ts_sz);
5420
5462
  }
5421
- batch_edits.push_back(e);
5422
- batch_edits_ts_sz.push_back(edit_ts_sz);
5463
+ }
5464
+ // Loop increment/conditions
5465
+ ++it;
5466
+ if (it == manifest_writers_.cend()) {
5467
+ break;
5468
+ }
5469
+ if (skip_manifest_write) {
5470
+ // no grouping when skipping manifest write
5471
+ break;
5472
+ }
5473
+ const auto* next = (*it)->edit_list.front();
5474
+ if (next->IsColumnFamilyManipulation() ||
5475
+ next->IsNoManifestWriteDummy()) {
5476
+ // no group commits for column family add or drop
5477
+ // nor for dummy skipping manifest write
5478
+ break;
5423
5479
  }
5424
5480
  }
5425
5481
  for (int i = 0; i < static_cast<int>(versions.size()); ++i) {
@@ -5432,6 +5488,7 @@ Status VersionSet::ProcessManifestWrites(
5432
5488
  for (auto v : versions) {
5433
5489
  delete v;
5434
5490
  }
5491
+ // FIXME? manifest_writers_ still has requested updates
5435
5492
  return s;
5436
5493
  }
5437
5494
  }
@@ -5471,11 +5528,16 @@ Status VersionSet::ProcessManifestWrites(
5471
5528
  "VersionSet::ProcessManifestWrites:CheckOneAtomicGroup", &tmp);
5472
5529
  k = i;
5473
5530
  }
5531
+ if (skip_manifest_write) {
5532
+ // no grouping when skipping manifest write
5533
+ assert(last_writer == &first_writer);
5534
+ }
5474
5535
  #endif // NDEBUG
5475
5536
 
5476
5537
  assert(pending_manifest_file_number_ == 0);
5477
- if (!descriptor_log_ ||
5478
- manifest_file_size_ > db_options_->max_manifest_file_size) {
5538
+ if (!skip_manifest_write &&
5539
+ (!descriptor_log_ ||
5540
+ manifest_file_size_ > db_options_->max_manifest_file_size)) {
5479
5541
  TEST_SYNC_POINT("VersionSet::ProcessManifestWrites:BeforeNewManifest");
5480
5542
  new_descriptor_log = true;
5481
5543
  } else {
@@ -5513,8 +5575,18 @@ Status VersionSet::ProcessManifestWrites(
5513
5575
  Status s;
5514
5576
  IOStatus io_s;
5515
5577
  IOStatus manifest_io_status;
5578
+ manifest_io_status.PermitUncheckedError();
5516
5579
  std::unique_ptr<log::Writer> new_desc_log_ptr;
5517
- {
5580
+ if (skip_manifest_write) {
5581
+ if (s.ok()) {
5582
+ constexpr bool update_stats = true;
5583
+ for (int i = 0; i < static_cast<int>(versions.size()); ++i) {
5584
+ // NOTE: normally called with DB mutex released, but we don't
5585
+ // want to release the DB mutex in this mode of LogAndApply
5586
+ versions[i]->PrepareAppend(read_options, update_stats);
5587
+ }
5588
+ }
5589
+ } else {
5518
5590
  FileOptions opt_file_opts = fs_->OptimizeForManifestWrite(file_options_);
5519
5591
  // DB option (in file_options_) takes precedence when not kUnknown
5520
5592
  if (file_options_.temperature != Temperature::kUnknown) {
@@ -5527,14 +5599,13 @@ Status VersionSet::ProcessManifestWrites(
5527
5599
  for (int i = 0; i < static_cast<int>(versions.size()); ++i) {
5528
5600
  assert(!builder_guards.empty() &&
5529
5601
  builder_guards.size() == versions.size());
5530
- assert(!mutable_cf_options_ptrs.empty() &&
5531
- builder_guards.size() == versions.size());
5532
5602
  ColumnFamilyData* cfd = versions[i]->cfd_;
5533
5603
  s = builder_guards[i]->version_builder()->LoadTableHandlers(
5534
5604
  cfd->internal_stats(), 1 /* max_threads */,
5535
5605
  true /* prefetch_index_and_filter_in_cache */,
5536
- false /* is_initial_load */, *mutable_cf_options_ptrs[i],
5537
- MaxFileSizeForL0MetaPin(*mutable_cf_options_ptrs[i]), read_options);
5606
+ false /* is_initial_load */, versions[i]->GetMutableCFOptions(),
5607
+ MaxFileSizeForL0MetaPin(versions[i]->GetMutableCFOptions()),
5608
+ read_options);
5538
5609
  if (!s.ok()) {
5539
5610
  if (db_options_->paranoid_checks) {
5540
5611
  break;
@@ -5584,8 +5655,7 @@ Status VersionSet::ProcessManifestWrites(
5584
5655
  constexpr bool update_stats = true;
5585
5656
 
5586
5657
  for (int i = 0; i < static_cast<int>(versions.size()); ++i) {
5587
- versions[i]->PrepareAppend(*mutable_cf_options_ptrs[i], read_options,
5588
- update_stats);
5658
+ versions[i]->PrepareAppend(read_options, update_stats);
5589
5659
  }
5590
5660
  }
5591
5661
 
@@ -5717,7 +5787,8 @@ Status VersionSet::ProcessManifestWrites(
5717
5787
  assert(new_cf_options != nullptr);
5718
5788
  assert(max_last_sequence == descriptor_last_sequence_);
5719
5789
  CreateColumnFamily(*new_cf_options, read_options,
5720
- first_writer.edit_list.front());
5790
+ first_writer.edit_list.front(),
5791
+ /*read_only*/ false);
5721
5792
  } else if (first_writer.edit_list.front()->IsColumnFamilyDrop()) {
5722
5793
  assert(batch_edits.size() == 1);
5723
5794
  assert(max_last_sequence == descriptor_last_sequence_);
@@ -5759,11 +5830,13 @@ Status VersionSet::ProcessManifestWrites(
5759
5830
  AppendVersion(cfd, versions[i]);
5760
5831
  }
5761
5832
  }
5762
- assert(max_last_sequence >= descriptor_last_sequence_);
5763
- descriptor_last_sequence_ = max_last_sequence;
5764
- manifest_file_number_ = pending_manifest_file_number_;
5765
- manifest_file_size_ = new_manifest_file_size;
5766
- prev_log_number_ = first_writer.edit_list.front()->GetPrevLogNumber();
5833
+ if (!skip_manifest_write) {
5834
+ assert(max_last_sequence >= descriptor_last_sequence_);
5835
+ descriptor_last_sequence_ = max_last_sequence;
5836
+ manifest_file_number_ = pending_manifest_file_number_;
5837
+ manifest_file_size_ = new_manifest_file_size;
5838
+ prev_log_number_ = first_writer.edit_list.front()->GetPrevLogNumber();
5839
+ }
5767
5840
  } else {
5768
5841
  std::string version_edits;
5769
5842
  for (auto& e : batch_edits) {
@@ -5882,12 +5955,12 @@ void VersionSet::WakeUpWaitingManifestWriters() {
5882
5955
  // that this variable represents a collection of column_family_data.
5883
5956
  Status VersionSet::LogAndApply(
5884
5957
  const autovector<ColumnFamilyData*>& column_family_datas,
5885
- const autovector<const MutableCFOptions*>& mutable_cf_options_list,
5886
5958
  const ReadOptions& read_options, const WriteOptions& write_options,
5887
5959
  const autovector<autovector<VersionEdit*>>& edit_lists,
5888
5960
  InstrumentedMutex* mu, FSDirectory* dir_contains_current_file,
5889
5961
  bool new_descriptor_log, const ColumnFamilyOptions* new_cf_options,
5890
- const std::vector<std::function<void(const Status&)>>& manifest_wcbs) {
5962
+ const std::vector<std::function<void(const Status&)>>& manifest_wcbs,
5963
+ const std::function<Status()>& pre_cb) {
5891
5964
  mu->AssertHeld();
5892
5965
  int num_edits = 0;
5893
5966
  for (const auto& elist : edit_lists) {
@@ -5900,6 +5973,7 @@ Status VersionSet::LogAndApply(
5900
5973
  for (const auto& edit_list : edit_lists) {
5901
5974
  for (const auto& edit : edit_list) {
5902
5975
  assert(!edit->IsColumnFamilyManipulation());
5976
+ assert(!edit->IsNoManifestWriteDummy());
5903
5977
  }
5904
5978
  }
5905
5979
  #endif /* ! NDEBUG */
@@ -5913,14 +5987,12 @@ Status VersionSet::LogAndApply(
5913
5987
  }
5914
5988
  std::deque<ManifestWriter> writers;
5915
5989
  if (num_cfds > 0) {
5916
- assert(static_cast<size_t>(num_cfds) == mutable_cf_options_list.size());
5917
5990
  assert(static_cast<size_t>(num_cfds) == edit_lists.size());
5918
5991
  }
5919
5992
  for (int i = 0; i < num_cfds; ++i) {
5920
5993
  const auto wcb =
5921
5994
  manifest_wcbs.empty() ? [](const Status&) {} : manifest_wcbs[i];
5922
- writers.emplace_back(mu, column_family_datas[i],
5923
- *mutable_cf_options_list[i], edit_lists[i], wcb);
5995
+ writers.emplace_back(mu, column_family_datas[i], edit_lists[i], wcb);
5924
5996
  manifest_writers_.push_back(&writers[i]);
5925
5997
  }
5926
5998
  assert(!writers.empty());
@@ -5940,8 +6012,11 @@ Status VersionSet::LogAndApply(
5940
6012
  }
5941
6013
  TEST_SYNC_POINT_CALLBACK("VersionSet::LogAndApply:WakeUpAndDone", mu);
5942
6014
  #endif /* !NDEBUG */
6015
+ // FIXME: One MANIFEST write failure can cause all writes to SetBGError,
6016
+ // should only SetBGError once.
5943
6017
  return first_writer.status;
5944
6018
  }
6019
+ TEST_SYNC_POINT_CALLBACK("VersionSet::LogAndApply:WakeUpAndNotDone", mu);
5945
6020
 
5946
6021
  int num_undropped_cfds = 0;
5947
6022
  for (auto cfd : column_family_datas) {
@@ -5950,7 +6025,17 @@ Status VersionSet::LogAndApply(
5950
6025
  ++num_undropped_cfds;
5951
6026
  }
5952
6027
  }
6028
+ Status s;
5953
6029
  if (0 == num_undropped_cfds) {
6030
+ s = Status::ColumnFamilyDropped();
6031
+ }
6032
+ // Call pre_cb once we know we have work to do and are scheduled as the
6033
+ // exclusive manifest writer (and new Version appender)
6034
+ if (s.ok() && pre_cb) {
6035
+ s = pre_cb();
6036
+ }
6037
+ if (!s.ok()) {
6038
+ // Revert manifest_writers_
5954
6039
  for (int i = 0; i != num_cfds; ++i) {
5955
6040
  manifest_writers_.pop_front();
5956
6041
  }
@@ -5958,11 +6043,12 @@ Status VersionSet::LogAndApply(
5958
6043
  if (!manifest_writers_.empty()) {
5959
6044
  manifest_writers_.front()->cv.Signal();
5960
6045
  }
5961
- return Status::ColumnFamilyDropped();
6046
+ return s;
6047
+ } else {
6048
+ return ProcessManifestWrites(writers, mu, dir_contains_current_file,
6049
+ new_descriptor_log, new_cf_options,
6050
+ read_options, write_options);
5962
6051
  }
5963
- return ProcessManifestWrites(writers, mu, dir_contains_current_file,
5964
- new_descriptor_log, new_cf_options, read_options,
5965
- write_options);
5966
6052
  }
5967
6053
 
5968
6054
  void VersionSet::LogAndApplyCFHelper(VersionEdit* edit,
@@ -6408,13 +6494,12 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
6408
6494
  vstorage->num_levels_ = new_levels;
6409
6495
  vstorage->ResizeCompactCursors(new_levels);
6410
6496
 
6411
- MutableCFOptions mutable_cf_options(*options);
6412
6497
  VersionEdit ve;
6413
6498
  InstrumentedMutex dummy_mutex;
6414
6499
  InstrumentedMutexLock l(&dummy_mutex);
6415
6500
  return versions.LogAndApply(versions.GetColumnFamilySet()->GetDefault(),
6416
- mutable_cf_options, read_options, write_options,
6417
- &ve, &dummy_mutex, nullptr, true);
6501
+ read_options, write_options, &ve, &dummy_mutex,
6502
+ nullptr, true);
6418
6503
  }
6419
6504
 
6420
6505
  // Get the checksum information including the checksum and checksum function
@@ -6632,7 +6717,7 @@ Status VersionSet::WriteCurrentStateToManifest(
6632
6717
  edit.SetComparatorName(
6633
6718
  cfd->internal_comparator().user_comparator()->Name());
6634
6719
  edit.SetPersistUserDefinedTimestamps(
6635
- cfd->ioptions()->persist_user_defined_timestamps);
6720
+ cfd->ioptions().persist_user_defined_timestamps);
6636
6721
  std::string record;
6637
6722
  if (!edit.EncodeTo(&record)) {
6638
6723
  return Status::Corruption("Unable to Encode VersionEdit:" +
@@ -7084,13 +7169,13 @@ InternalIterator* VersionSet::MakeInputIterator(
7084
7169
  list[num++] = cfd->table_cache()->NewIterator(
7085
7170
  read_options, file_options_compactions,
7086
7171
  cfd->internal_comparator(), fmd, range_del_agg,
7087
- *c->mutable_cf_options(),
7172
+ c->mutable_cf_options(),
7088
7173
  /*table_reader_ptr=*/nullptr,
7089
7174
  /*file_read_hist=*/nullptr, TableReaderCaller::kCompaction,
7090
7175
  /*arena=*/nullptr,
7091
7176
  /*skip_filters=*/false,
7092
7177
  /*level=*/static_cast<int>(c->level(which)),
7093
- MaxFileSizeForL0MetaPin(*c->mutable_cf_options()),
7178
+ MaxFileSizeForL0MetaPin(c->mutable_cf_options()),
7094
7179
  /*smallest_compaction_key=*/nullptr,
7095
7180
  /*largest_compaction_key=*/nullptr,
7096
7181
  /*allow_unprepared_value=*/false,
@@ -7105,7 +7190,7 @@ InternalIterator* VersionSet::MakeInputIterator(
7105
7190
  nullptr;
7106
7191
  list[num++] = new LevelIterator(
7107
7192
  cfd->table_cache(), read_options, file_options_compactions,
7108
- cfd->internal_comparator(), flevel, *c->mutable_cf_options(),
7193
+ cfd->internal_comparator(), flevel, c->mutable_cf_options(),
7109
7194
  /*should_sample=*/false,
7110
7195
  /*no per level latency histogram=*/nullptr,
7111
7196
  TableReaderCaller::kCompaction, /*skip_filters=*/false,
@@ -7121,7 +7206,8 @@ InternalIterator* VersionSet::MakeInputIterator(
7121
7206
  assert(num <= space);
7122
7207
  InternalIterator* result = NewCompactionMergingIterator(
7123
7208
  &c->column_family_data()->internal_comparator(), list,
7124
- static_cast<int>(num), range_tombstones);
7209
+ static_cast<int>(num), range_tombstones, /*arena=*/nullptr,
7210
+ c->column_family_data()->internal_stats());
7125
7211
  delete[] list;
7126
7212
  return result;
7127
7213
  }
@@ -7174,11 +7260,11 @@ void VersionSet::GetLiveFilesMetaData(std::vector<LiveFileMetaData>* metadata) {
7174
7260
  LiveFileMetaData filemetadata;
7175
7261
  filemetadata.column_family_name = cfd->GetName();
7176
7262
  uint32_t path_id = file->fd.GetPathId();
7177
- if (path_id < cfd->ioptions()->cf_paths.size()) {
7178
- filemetadata.db_path = cfd->ioptions()->cf_paths[path_id].path;
7263
+ if (path_id < cfd->ioptions().cf_paths.size()) {
7264
+ filemetadata.db_path = cfd->ioptions().cf_paths[path_id].path;
7179
7265
  } else {
7180
- assert(!cfd->ioptions()->cf_paths.empty());
7181
- filemetadata.db_path = cfd->ioptions()->cf_paths.back().path;
7266
+ assert(!cfd->ioptions().cf_paths.empty());
7267
+ filemetadata.db_path = cfd->ioptions().cf_paths.back().path;
7182
7268
  }
7183
7269
  filemetadata.directory = filemetadata.db_path;
7184
7270
  const uint64_t file_number = file->fd.GetNumber();
@@ -7255,8 +7341,10 @@ uint64_t VersionSet::GetObsoleteSstFilesSize() const {
7255
7341
 
7256
7342
  ColumnFamilyData* VersionSet::CreateColumnFamily(
7257
7343
  const ColumnFamilyOptions& cf_options, const ReadOptions& read_options,
7258
- const VersionEdit* edit) {
7344
+ const VersionEdit* edit, bool read_only) {
7259
7345
  assert(edit->IsColumnFamilyAdd());
7346
+ // Unchanging LSM tree implies no writes to the CF
7347
+ assert(!unchanging_ || read_only);
7260
7348
 
7261
7349
  MutableCFOptions dummy_cf_options;
7262
7350
  Version* dummy_versions =
@@ -7266,22 +7354,20 @@ ColumnFamilyData* VersionSet::CreateColumnFamily(
7266
7354
  dummy_versions->Ref();
7267
7355
  auto new_cfd = column_family_set_->CreateColumnFamily(
7268
7356
  edit->GetColumnFamilyName(), edit->GetColumnFamily(), dummy_versions,
7269
- cf_options);
7357
+ cf_options, read_only);
7270
7358
 
7271
7359
  Version* v = new Version(new_cfd, this, file_options_,
7272
- *new_cfd->GetLatestMutableCFOptions(), io_tracer_,
7360
+ new_cfd->GetLatestMutableCFOptions(), io_tracer_,
7273
7361
  current_version_number_++);
7274
7362
 
7275
7363
  constexpr bool update_stats = false;
7276
7364
 
7277
- v->PrepareAppend(*new_cfd->GetLatestMutableCFOptions(), read_options,
7278
- update_stats);
7365
+ v->PrepareAppend(read_options, update_stats);
7279
7366
 
7280
7367
  AppendVersion(new_cfd, v);
7281
7368
  // GetLatestMutableCFOptions() is safe here without mutex since the
7282
7369
  // cfd is not available to client
7283
- new_cfd->CreateNewMemtable(*new_cfd->GetLatestMutableCFOptions(),
7284
- LastSequence());
7370
+ new_cfd->CreateNewMemtable(LastSequence());
7285
7371
  new_cfd->SetLogNumber(edit->GetLogNumber());
7286
7372
  return new_cfd;
7287
7373
  }
@@ -7356,9 +7442,8 @@ Status VersionSet::VerifyFileMetadata(const ReadOptions& read_options,
7356
7442
  TableCache* table_cache = cfd->table_cache();
7357
7443
  assert(table_cache);
7358
7444
 
7359
- const MutableCFOptions* const cf_opts = cfd->GetLatestMutableCFOptions();
7360
- assert(cf_opts);
7361
- size_t max_sz_for_l0_meta_pin = MaxFileSizeForL0MetaPin(*cf_opts);
7445
+ const auto& cf_opts = cfd->GetLatestMutableCFOptions();
7446
+ size_t max_sz_for_l0_meta_pin = MaxFileSizeForL0MetaPin(cf_opts);
7362
7447
 
7363
7448
  const FileOptions& file_opts = file_options();
7364
7449
 
@@ -7373,7 +7458,7 @@ Status VersionSet::VerifyFileMetadata(const ReadOptions& read_options,
7373
7458
  TableCache::TypedHandle* handle = nullptr;
7374
7459
  FileMetaData meta_copy = meta;
7375
7460
  status = table_cache->FindTable(
7376
- read_options, file_opts, *icmp, meta_copy, &handle, *cf_opts,
7461
+ read_options, file_opts, *icmp, meta_copy, &handle, cf_opts,
7377
7462
  /*no_io=*/false, internal_stats->GetFileReadHist(level), false, level,
7378
7463
  /*prefetch_index_and_filter_in_cache*/ false, max_sz_for_l0_meta_pin,
7379
7464
  meta_copy.temperature);
@@ -7393,7 +7478,7 @@ ReactiveVersionSet::ReactiveVersionSet(
7393
7478
  write_buffer_manager, write_controller,
7394
7479
  /*block_cache_tracer=*/nullptr, io_tracer, /*db_id*/ "",
7395
7480
  /*db_session_id*/ "", /*daily_offpeak_time_utc*/ "",
7396
- /*error_handler=*/nullptr, /*read_only=*/true) {}
7481
+ /*error_handler=*/nullptr, /*unchanging=*/false) {}
7397
7482
 
7398
7483
  ReactiveVersionSet::~ReactiveVersionSet() = default;
7399
7484