@nxtedition/rocksdb 13.1.4 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/binding.cc +43 -16
  2. package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  7. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
  8. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
  9. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
  11. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  12. package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
  13. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
  14. package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
  15. package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
  16. package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
  39. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
  54. package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
  55. package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
  56. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
  57. package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
  58. package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
  59. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
  60. package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
  61. package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
  62. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
  65. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
  67. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
  68. package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
  69. package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
  70. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
  71. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
  72. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
  75. package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
  76. package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
  77. package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
  78. package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
  79. package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
  80. package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
  81. package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
  82. package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
  83. package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
  84. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
  85. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
  86. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
  87. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
  88. package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
  89. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
  90. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
  91. package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
  92. package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
  93. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
  94. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
  96. package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
  98. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
  99. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
  100. package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
  101. package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
  102. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
  103. package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
  104. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
  105. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
  106. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
  107. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
  108. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
  110. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
  113. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
  115. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
  120. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
  121. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
  122. package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
  123. package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
  124. package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
  125. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  126. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
  127. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
  128. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
  129. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
  130. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  131. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  132. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
  134. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
  135. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
  137. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
  140. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
  142. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
  144. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
  147. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
  148. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
  150. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
  152. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  153. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
  154. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
  155. package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
  156. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
  157. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
  158. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
  159. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
  160. package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
  161. package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
  162. package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
  163. package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
  164. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
  165. package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
  166. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
  167. package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
  168. package/deps/rocksdb/rocksdb/port/port.h +5 -9
  169. package/deps/rocksdb/rocksdb/src.mk +8 -0
  170. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
  171. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
  174. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
  175. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
  177. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
  178. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
  181. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  182. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  183. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
  184. package/deps/rocksdb/rocksdb/table/format.cc +3 -3
  185. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
  186. package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
  187. package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
  188. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
  189. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  190. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
  191. package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
  192. package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
  193. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
  194. package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
  196. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
  197. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
  198. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  199. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
  200. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
  201. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
  202. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
  203. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
  204. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
  205. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
  206. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
  207. package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
  208. package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
  209. package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
  210. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
  211. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
  212. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
  213. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
  214. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
  215. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
  216. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
  217. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
  218. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
  219. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
  220. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
  221. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
  222. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
  223. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
  224. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
  225. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
  226. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
  227. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
  228. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
  229. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
  230. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
  231. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
  232. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
  233. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
  234. package/deps/rocksdb/rocksdb.gyp +2 -0
  235. package/package.json +1 -1
  236. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  237. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -61,6 +61,9 @@ class UnregisteredTableFactory : public TableFactory {
61
61
  WritableFileWriter*) const override {
62
62
  return nullptr;
63
63
  }
64
+ std::unique_ptr<TableFactory> Clone() const override {
65
+ return std::make_unique<UnregisteredTableFactory>();
66
+ }
64
67
  };
65
68
 
66
69
  TEST_F(OptionsTest, GetOptionsFromMapTest) {
@@ -829,6 +832,21 @@ TEST_F(OptionsTest, CompressionOptionsFromString) {
829
832
  ASSERT_OK(GetColumnFamilyOptionsFromString(ignore, ColumnFamilyOptions(),
830
833
  "compression_opts.unknown=bad",
831
834
  &base_cf_opt));
835
+
836
+ // Test with some additional values added
837
+ config_options.ignore_unknown_options = false;
838
+ ASSERT_NOK(
839
+ GetColumnFamilyOptionsFromString(config_options, ColumnFamilyOptions(),
840
+ "new_unknown_field=whatever; "
841
+ "bottommost_compression_opts=4:5:6:7",
842
+ &base_cf_opt));
843
+ // Test Ignoring Unknown Options
844
+ config_options.ignore_unknown_options = true;
845
+ ASSERT_OK(
846
+ GetColumnFamilyOptionsFromString(config_options, ColumnFamilyOptions(),
847
+ "new_unknown_field=whatever; "
848
+ "bottommost_compression_opts=4:5:6:7",
849
+ &base_cf_opt));
832
850
  }
833
851
 
834
852
  TEST_F(OptionsTest, OldInterfaceTest) {
@@ -1662,29 +1680,38 @@ TEST_F(OptionsTest, MutableTableOptions) {
1662
1680
  bbtf.reset(NewBlockBasedTableFactory());
1663
1681
  auto bbto = bbtf->GetOptions<BlockBasedTableOptions>();
1664
1682
  ASSERT_NE(bbto, nullptr);
1665
- ASSERT_OK(bbtf->ConfigureOption(config_options, "block_align", "true"));
1683
+ ASSERT_OK(bbtf->ConfigureOption(config_options, "no_block_cache", "true"));
1666
1684
  ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1667
- ASSERT_EQ(bbto->block_align, true);
1685
+ ASSERT_EQ(bbto->no_block_cache, true);
1668
1686
  ASSERT_EQ(bbto->block_size, 1024);
1669
1687
  ASSERT_OK(bbtf->PrepareOptions(config_options));
1670
1688
  config_options.mutable_options_only = true;
1671
- ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "1024"));
1672
- ASSERT_EQ(bbto->block_align, true);
1673
- ASSERT_NOK(bbtf->ConfigureOption(config_options, "block_align", "false"));
1674
- ASSERT_OK(bbtf->ConfigureOption(config_options, "block_size", "2048"));
1675
- ASSERT_EQ(bbto->block_align, true);
1676
- ASSERT_EQ(bbto->block_size, 2048);
1689
+ // Options on BlockBasedTableOptions/Factory are no longer directly mutable
1690
+ // but have to be mutated on a live DB with SetOptions replacing the
1691
+ // table_factory with a copy using the new options.
1692
+ ASSERT_NOK(bbtf->ConfigureOption(config_options, "no_block_cache", "false"));
1693
+ ASSERT_NOK(bbtf->ConfigureOption(config_options, "block_size", "2048"));
1694
+ ASSERT_EQ(bbto->no_block_cache, true);
1695
+ ASSERT_EQ(bbto->block_size, 1024);
1677
1696
 
1678
1697
  ColumnFamilyOptions cf_opts;
1679
1698
  cf_opts.table_factory = bbtf;
1699
+ // FIXME: find a way to make this fail again
1700
+ /*
1680
1701
  ASSERT_NOK(GetColumnFamilyOptionsFromString(
1681
- config_options, cf_opts, "block_based_table_factory.block_align=false",
1702
+ config_options, cf_opts, "block_based_table_factory.no_block_cache=false",
1682
1703
  &cf_opts));
1704
+ */
1683
1705
  ASSERT_OK(GetColumnFamilyOptionsFromString(
1684
1706
  config_options, cf_opts, "block_based_table_factory.block_size=8192",
1685
1707
  &cf_opts));
1686
- ASSERT_EQ(bbto->block_align, true);
1687
- ASSERT_EQ(bbto->block_size, 8192);
1708
+ const auto new_bbto =
1709
+ cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1710
+ ASSERT_NE(new_bbto, nullptr);
1711
+ ASSERT_NE(new_bbto, bbto);
1712
+ ASSERT_EQ(new_bbto->no_block_cache, true);
1713
+ ASSERT_EQ(new_bbto->block_size, 8192);
1714
+ ASSERT_EQ(bbto->block_size, 1024);
1688
1715
  }
1689
1716
 
1690
1717
  TEST_F(OptionsTest, MutableCFOptions) {
@@ -1698,7 +1725,7 @@ TEST_F(OptionsTest, MutableCFOptions) {
1698
1725
  &cf_opts));
1699
1726
  ASSERT_TRUE(cf_opts.paranoid_file_checks);
1700
1727
  ASSERT_NE(cf_opts.table_factory.get(), nullptr);
1701
- const auto bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1728
+ auto* bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1702
1729
  ASSERT_NE(bbto, nullptr);
1703
1730
  ASSERT_EQ(bbto->block_size, 8192);
1704
1731
  ASSERT_EQ(bbto->block_align, false);
@@ -1707,10 +1734,11 @@ TEST_F(OptionsTest, MutableCFOptions) {
1707
1734
  config_options, cf_opts, {{"paranoid_file_checks", "false"}}, &cf_opts));
1708
1735
  ASSERT_EQ(cf_opts.paranoid_file_checks, false);
1709
1736
 
1737
+ // Should replace the factory with the new setting
1710
1738
  ASSERT_OK(GetColumnFamilyOptionsFromMap(
1711
1739
  config_options, cf_opts,
1712
1740
  {{"block_based_table_factory.block_size", "16384"}}, &cf_opts));
1713
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1741
+ bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1714
1742
  ASSERT_EQ(bbto->block_size, 16384);
1715
1743
 
1716
1744
  config_options.mutable_options_only = true;
@@ -1719,45 +1747,103 @@ TEST_F(OptionsTest, MutableCFOptions) {
1719
1747
  config_options, cf_opts, {{"force_consistency_checks", "true"}},
1720
1748
  &cf_opts));
1721
1749
 
1722
- // Attempt to change the table. It is not mutable, so this should fail and
1723
- // leave the original intact
1724
- ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1750
+ // Attempt to change the table factory kind. This was previously disallowed
1751
+ // and is a dubious operation but is tricky to disallow without breaking
1752
+ // other things (FIXME?)
1753
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1725
1754
  config_options, cf_opts, {{"table_factory", "PlainTable"}}, &cf_opts));
1726
- ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1755
+ ASSERT_STREQ(cf_opts.table_factory->Name(), TableFactory::kPlainTableName());
1756
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1757
+ config_options, cf_opts, {{"table_factory", "BlockBasedTable"}},
1758
+ &cf_opts));
1759
+ ASSERT_STREQ(cf_opts.table_factory->Name(),
1760
+ TableFactory::kBlockBasedTableName());
1761
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1727
1762
  config_options, cf_opts, {{"table_factory.id", "PlainTable"}}, &cf_opts));
1728
- ASSERT_NE(cf_opts.table_factory.get(), nullptr);
1729
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1763
+ ASSERT_STREQ(cf_opts.table_factory->Name(), TableFactory::kPlainTableName());
1764
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1765
+ config_options, cf_opts, {{"table_factory.id", "BlockBasedTable"}},
1766
+ &cf_opts));
1767
+ ASSERT_STREQ(cf_opts.table_factory->Name(),
1768
+ TableFactory::kBlockBasedTableName());
1769
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1770
+ config_options, cf_opts,
1771
+ {{"table_factory", "{id=PlainTable;bloom_bits_per_key=42}"}}, &cf_opts));
1772
+ ASSERT_STREQ(cf_opts.table_factory->Name(), TableFactory::kPlainTableName());
1773
+
1774
+ // Should at least be allowed to instantiate in place of nullptr, for
1775
+ // initialization purposes.
1776
+ cf_opts.table_factory = nullptr;
1777
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1778
+ config_options, cf_opts,
1779
+ {{"table_factory", "{id=BlockBasedTable;block_size=12345}"}}, &cf_opts));
1780
+ ASSERT_STREQ(cf_opts.table_factory->Name(),
1781
+ TableFactory::kBlockBasedTableName());
1782
+ bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1783
+ ASSERT_EQ(bbto->block_size, 12345);
1784
+
1785
+ // Accessing through the wrong factory alias fails gracefully
1786
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1787
+ config_options, cf_opts,
1788
+ {{"plain_table_factory", "{bloom_bits_per_key=42}"}}, &cf_opts));
1789
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1790
+ config_options, cf_opts,
1791
+ {{"plain_table_factory.bloom_bits_per_key", "42"}}, &cf_opts));
1792
+ ASSERT_STREQ(cf_opts.table_factory->Name(),
1793
+ TableFactory::kBlockBasedTableName());
1730
1794
 
1731
- // Change the block size. Should update the value in the current table
1795
+ // Change the block size.
1732
1796
  ASSERT_OK(GetColumnFamilyOptionsFromMap(
1733
1797
  config_options, cf_opts,
1734
1798
  {{"block_based_table_factory.block_size", "8192"}}, &cf_opts));
1735
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1799
+ bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1736
1800
  ASSERT_EQ(bbto->block_size, 8192);
1737
1801
 
1738
1802
  // Attempt to turn off block cache fails, as this option is not mutable
1803
+ // FIXME: find a way to make this fail again
1804
+ /*
1739
1805
  ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1740
1806
  config_options, cf_opts,
1741
1807
  {{"block_based_table_factory.no_block_cache", "true"}}, &cf_opts));
1742
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1808
+ */
1743
1809
 
1744
- // Attempt to change the block size via a config string/map. Should update
1745
- // the current value
1810
+ // Attempt to change the block size via a config string/map.
1746
1811
  ASSERT_OK(GetColumnFamilyOptionsFromMap(
1747
1812
  config_options, cf_opts,
1748
1813
  {{"block_based_table_factory", "{block_size=32768}"}}, &cf_opts));
1749
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1814
+ bbto = cf_opts.table_factory->GetOptions<BlockBasedTableOptions>();
1750
1815
  ASSERT_EQ(bbto->block_size, 32768);
1751
1816
 
1752
1817
  // Attempt to change the block size and no cache through the map. Should
1753
1818
  // fail, leaving the old values intact
1819
+ // FIXME: find a way to make this fail again
1820
+ /*
1754
1821
  ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1755
1822
  config_options, cf_opts,
1756
1823
  {{"block_based_table_factory",
1757
1824
  "{block_size=16384; no_block_cache=true}"}},
1758
1825
  &cf_opts));
1759
- ASSERT_EQ(bbto, cf_opts.table_factory->GetOptions<BlockBasedTableOptions>());
1826
+ */
1760
1827
  ASSERT_EQ(bbto->block_size, 32768);
1828
+
1829
+ // Switch to plain table for some tests
1830
+ cf_opts.table_factory = nullptr;
1831
+ ASSERT_OK(GetColumnFamilyOptionsFromMap(
1832
+ config_options, cf_opts,
1833
+ {{"table_factory", "{id=PlainTable;bloom_bits_per_key=42}"}}, &cf_opts));
1834
+ ASSERT_STREQ(cf_opts.table_factory->Name(), TableFactory::kPlainTableName());
1835
+ auto* pto = cf_opts.table_factory->GetOptions<PlainTableOptions>();
1836
+ ASSERT_EQ(pto->bloom_bits_per_key, 42);
1837
+
1838
+ // Accessing through the wrong factory alias fails gracefully
1839
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1840
+ config_options, cf_opts,
1841
+ {{"block_based_table_factory.block_size", "8192"}}, &cf_opts));
1842
+ ASSERT_NOK(GetColumnFamilyOptionsFromMap(
1843
+ config_options, cf_opts,
1844
+ {{"block_based_table_factory", "{block_size=32768}"}}, &cf_opts));
1845
+ ASSERT_STREQ(cf_opts.table_factory->Name(), TableFactory::kPlainTableName());
1846
+ ASSERT_EQ(pto, cf_opts.table_factory->GetOptions<PlainTableOptions>());
1761
1847
  }
1762
1848
 
1763
1849
 
@@ -24,14 +24,10 @@
24
24
  // A temporary hook into long-running RocksDB threads to support modifying their
25
25
  // priority etc. This should become a public API hook once the requirements
26
26
  // are better understood.
27
- extern "C" void RocksDbThreadYield() __attribute__((__weak__));
28
- #define ROCKSDB_THREAD_YIELD_HOOK() \
29
- { \
30
- if (RocksDbThreadYield) { \
31
- RocksDbThreadYield(); \
32
- } \
33
- }
27
+ // Returns true if query is aborted.
28
+ extern "C" bool RocksDbThreadYieldAndCheckAbort() __attribute__((__weak__));
29
+ #define ROCKSDB_THREAD_YIELD_CHECK_ABORT() \
30
+ (RocksDbThreadYieldAndCheckAbort ? RocksDbThreadYieldAndCheckAbort() : false)
34
31
  #else
35
- #define ROCKSDB_THREAD_YIELD_HOOK() \
36
- {}
32
+ #define ROCKSDB_THREAD_YIELD_CHECK_ABORT() (false)
37
33
  #endif
@@ -75,6 +75,7 @@ LIB_SOURCES = \
75
75
  db/log_reader.cc \
76
76
  db/log_writer.cc \
77
77
  db/malloc_stats.cc \
78
+ db/manifest_ops.cc \
78
79
  db/memtable.cc \
79
80
  db/memtable_list.cc \
80
81
  db/merge_helper.cc \
@@ -141,6 +142,7 @@ LIB_SOURCES = \
141
142
  memtable/hash_skiplist_rep.cc \
142
143
  memtable/skiplistrep.cc \
143
144
  memtable/vectorrep.cc \
145
+ memtable/wbwi_memtable.cc \
144
146
  memtable/write_buffer_manager.cc \
145
147
  monitoring/histogram.cc \
146
148
  monitoring/histogram_windowing.cc \
@@ -339,6 +341,9 @@ LIB_SOURCES_ASM =
339
341
  LIB_SOURCES_C =
340
342
  endif
341
343
 
344
+ WITH_FAISS_LIB_SOURCES = \
345
+ utilities/secondary_index/faiss_ivf_index.cc \
346
+
342
347
  RANGE_TREE_SOURCES =\
343
348
  utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc \
344
349
  utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc \
@@ -649,6 +654,9 @@ TEST_MAIN_SOURCES = \
649
654
  TEST_MAIN_SOURCES_C = \
650
655
  db/c_test.c \
651
656
 
657
+ WITH_FAISS_TEST_MAIN_SOURCES = \
658
+ utilities/secondary_index/faiss_ivf_index_test.cc \
659
+
652
660
  MICROBENCH_SOURCES = \
653
661
  microbench/ribbon_bench.cc \
654
662
  microbench/db_basic_bench.cc \
@@ -46,6 +46,10 @@ class AdaptiveTableFactory : public TableFactory {
46
46
 
47
47
  std::string GetPrintableOptions() const override;
48
48
 
49
+ std::unique_ptr<TableFactory> Clone() const override {
50
+ return std::make_unique<AdaptiveTableFactory>(*this);
51
+ }
52
+
49
53
  private:
50
54
  std::shared_ptr<TableFactory> table_factory_to_write_;
51
55
  std::shared_ptr<TableFactory> block_based_table_factory_;
@@ -575,13 +575,7 @@ class BlockIter : public InternalIteratorBase<TValue> {
575
575
 
576
576
  void UpdateRawKeyAndMaybePadMinTimestamp(const Slice& key) {
577
577
  if (pad_min_timestamp_) {
578
- std::string buf;
579
- if (raw_key_.IsUserKey()) {
580
- AppendKeyWithMinTimestamp(&buf, key, ts_sz_);
581
- } else {
582
- PadInternalKeyWithMinTimestamp(&buf, key, ts_sz_);
583
- }
584
- raw_key_.SetKey(buf, true /* copy */);
578
+ raw_key_.SetKeyWithPaddedMinTimestamp(key, ts_sz_);
585
579
  } else {
586
580
  raw_key_.SetKey(key, false /* copy */);
587
581
  }
@@ -619,11 +619,13 @@ struct BlockBasedTableBuilder::Rep {
619
619
  props.column_family_id = tbo.column_family_id;
620
620
  props.column_family_name = tbo.column_family_name;
621
621
  props.oldest_key_time = tbo.oldest_key_time;
622
+ props.newest_key_time = tbo.newest_key_time;
622
623
  props.file_creation_time = tbo.file_creation_time;
623
624
  props.orig_file_number = tbo.cur_file_num;
624
625
  props.db_id = tbo.db_id;
625
626
  props.db_session_id = tbo.db_session_id;
626
627
  props.db_host_id = ioptions.db_host_id;
628
+ props.format_version = table_options.format_version;
627
629
  if (!ReifyDbHostIdProperty(ioptions.env, &props.db_host_id).ok()) {
628
630
  ROCKS_LOG_INFO(ioptions.logger, "db_host_id property will not be set");
629
631
  }
@@ -224,10 +224,20 @@ static std::unordered_map<std::string,
224
224
  {"kFlushOnly",
225
225
  BlockBasedTableOptions::PrepopulateBlockCache::kFlushOnly}};
226
226
 
227
- static std::unordered_map<std::string, OptionTypeInfo>
228
- block_based_table_type_info = {
229
- /* currently not supported
230
- std::shared_ptr<Cache> block_cache = nullptr;
227
+ static struct BlockBasedTableTypeInfo {
228
+ std::unordered_map<std::string, OptionTypeInfo> info;
229
+
230
+ BlockBasedTableTypeInfo() {
231
+ info = {
232
+ // NOTE: Below the list, most of these options are marked as mutable.
233
+ // In theory, there should be no danger in mutability, as table
234
+ // builders and readers work from copies of BlockBasedTableOptions.
235
+ // However, there is currently an unresolved read-write race that
236
+ // affecting SetOptions on BBTO fields. This should be generally
237
+ // acceptable for non-pointer options of 64 bits or less, but a fix
238
+ // is needed to make it mutability general here. See
239
+ // https://github.com/facebook/rocksdb/issues/10079
240
+ /* currently not supported:
231
241
  CacheUsageOptions cache_usage_options;
232
242
  */
233
243
  {"flush_block_policy_factory",
@@ -238,24 +248,20 @@ static std::unordered_map<std::string, OptionTypeInfo>
238
248
  {"cache_index_and_filter_blocks",
239
249
  {offsetof(struct BlockBasedTableOptions,
240
250
  cache_index_and_filter_blocks),
241
- OptionType::kBoolean, OptionVerificationType::kNormal,
242
- OptionTypeFlags::kNone}},
251
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
243
252
  {"cache_index_and_filter_blocks_with_high_priority",
244
253
  {offsetof(struct BlockBasedTableOptions,
245
254
  cache_index_and_filter_blocks_with_high_priority),
246
- OptionType::kBoolean, OptionVerificationType::kNormal,
247
- OptionTypeFlags::kNone}},
255
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
248
256
  {"pin_l0_filter_and_index_blocks_in_cache",
249
257
  {offsetof(struct BlockBasedTableOptions,
250
258
  pin_l0_filter_and_index_blocks_in_cache),
251
- OptionType::kBoolean, OptionVerificationType::kNormal,
252
- OptionTypeFlags::kNone}},
259
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
253
260
  {"index_type", OptionTypeInfo::Enum<BlockBasedTableOptions::IndexType>(
254
261
  offsetof(struct BlockBasedTableOptions, index_type),
255
262
  &block_base_table_index_type_string_map)},
256
263
  {"hash_index_allow_collision",
257
- {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
258
- OptionTypeFlags::kNone}},
264
+ {0, OptionType::kBoolean, OptionVerificationType::kDeprecated}},
259
265
  {"data_block_index_type",
260
266
  OptionTypeInfo::Enum<BlockBasedTableOptions::DataBlockIndexType>(
261
267
  offsetof(struct BlockBasedTableOptions, data_block_index_type),
@@ -267,86 +273,65 @@ static std::unordered_map<std::string, OptionTypeInfo>
267
273
  {"data_block_hash_table_util_ratio",
268
274
  {offsetof(struct BlockBasedTableOptions,
269
275
  data_block_hash_table_util_ratio),
270
- OptionType::kDouble, OptionVerificationType::kNormal,
271
- OptionTypeFlags::kNone}},
276
+ OptionType::kDouble, OptionVerificationType::kNormal}},
272
277
  {"checksum",
273
278
  {offsetof(struct BlockBasedTableOptions, checksum),
274
- OptionType::kChecksumType, OptionVerificationType::kNormal,
275
- OptionTypeFlags::kNone}},
279
+ OptionType::kChecksumType, OptionVerificationType::kNormal}},
276
280
  {"no_block_cache",
277
281
  {offsetof(struct BlockBasedTableOptions, no_block_cache),
278
- OptionType::kBoolean, OptionVerificationType::kNormal,
279
- OptionTypeFlags::kNone}},
282
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
280
283
  {"block_size",
281
284
  {offsetof(struct BlockBasedTableOptions, block_size),
282
- OptionType::kSizeT, OptionVerificationType::kNormal,
283
- OptionTypeFlags::kMutable}},
285
+ OptionType::kSizeT, OptionVerificationType::kNormal}},
284
286
  {"block_size_deviation",
285
287
  {offsetof(struct BlockBasedTableOptions, block_size_deviation),
286
- OptionType::kInt, OptionVerificationType::kNormal,
287
- OptionTypeFlags::kNone}},
288
+ OptionType::kInt, OptionVerificationType::kNormal}},
288
289
  {"block_restart_interval",
289
290
  {offsetof(struct BlockBasedTableOptions, block_restart_interval),
290
- OptionType::kInt, OptionVerificationType::kNormal,
291
- OptionTypeFlags::kMutable}},
291
+ OptionType::kInt, OptionVerificationType::kNormal}},
292
292
  {"index_block_restart_interval",
293
293
  {offsetof(struct BlockBasedTableOptions, index_block_restart_interval),
294
- OptionType::kInt, OptionVerificationType::kNormal,
295
- OptionTypeFlags::kNone}},
294
+ OptionType::kInt, OptionVerificationType::kNormal}},
296
295
  {"index_per_partition",
297
- {0, OptionType::kUInt64T, OptionVerificationType::kDeprecated,
298
- OptionTypeFlags::kNone}},
296
+ {0, OptionType::kUInt64T, OptionVerificationType::kDeprecated}},
299
297
  {"metadata_block_size",
300
298
  {offsetof(struct BlockBasedTableOptions, metadata_block_size),
301
- OptionType::kUInt64T, OptionVerificationType::kNormal,
302
- OptionTypeFlags::kNone}},
299
+ OptionType::kUInt64T, OptionVerificationType::kNormal}},
303
300
  {"partition_filters",
304
301
  {offsetof(struct BlockBasedTableOptions, partition_filters),
305
- OptionType::kBoolean, OptionVerificationType::kNormal,
306
- OptionTypeFlags::kNone}},
302
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
307
303
  {"decouple_partitioned_filters",
308
304
  {offsetof(struct BlockBasedTableOptions, decouple_partitioned_filters),
309
- OptionType::kBoolean, OptionVerificationType::kNormal,
310
- OptionTypeFlags::kNone}},
305
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
311
306
  {"optimize_filters_for_memory",
312
307
  {offsetof(struct BlockBasedTableOptions, optimize_filters_for_memory),
313
- OptionType::kBoolean, OptionVerificationType::kNormal,
314
- OptionTypeFlags::kNone}},
308
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
315
309
  {"use_delta_encoding",
316
310
  {offsetof(struct BlockBasedTableOptions, use_delta_encoding),
317
- OptionType::kBoolean, OptionVerificationType::kNormal,
318
- OptionTypeFlags::kNone}},
311
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
319
312
  {"filter_policy",
320
313
  OptionTypeInfo::AsCustomSharedPtr<const FilterPolicy>(
321
314
  offsetof(struct BlockBasedTableOptions, filter_policy),
322
- OptionVerificationType::kByNameAllowFromNull,
323
- OptionTypeFlags::kNone)},
315
+ OptionVerificationType::kByNameAllowFromNull)},
324
316
  {"whole_key_filtering",
325
317
  {offsetof(struct BlockBasedTableOptions, whole_key_filtering),
326
- OptionType::kBoolean, OptionVerificationType::kNormal,
327
- OptionTypeFlags::kNone}},
318
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
328
319
  {"detect_filter_construct_corruption",
329
320
  {offsetof(struct BlockBasedTableOptions,
330
321
  detect_filter_construct_corruption),
331
- OptionType::kBoolean, OptionVerificationType::kNormal,
332
- OptionTypeFlags::kMutable}},
322
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
333
323
  {"reserve_table_builder_memory",
334
- {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
335
- OptionTypeFlags::kNone}},
324
+ {0, OptionType::kBoolean, OptionVerificationType::kDeprecated}},
336
325
  {"reserve_table_reader_memory",
337
- {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
338
- OptionTypeFlags::kNone}},
326
+ {0, OptionType::kBoolean, OptionVerificationType::kDeprecated}},
339
327
  {"skip_table_builder_flush",
340
- {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
341
- OptionTypeFlags::kNone}},
328
+ {0, OptionType::kBoolean, OptionVerificationType::kDeprecated}},
342
329
  {"format_version",
343
330
  {offsetof(struct BlockBasedTableOptions, format_version),
344
- OptionType::kUInt32T, OptionVerificationType::kNormal,
345
- OptionTypeFlags::kNone}},
331
+ OptionType::kUInt32T, OptionVerificationType::kNormal}},
346
332
  {"verify_compression",
347
333
  {offsetof(struct BlockBasedTableOptions, verify_compression),
348
- OptionType::kBoolean, OptionVerificationType::kNormal,
349
- OptionTypeFlags::kNone}},
334
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
350
335
  {"read_amp_bytes_per_bit",
351
336
  {offsetof(struct BlockBasedTableOptions, read_amp_bytes_per_bit),
352
337
  OptionType::kUInt32T, OptionVerificationType::kNormal,
@@ -369,17 +354,14 @@ static std::unordered_map<std::string, OptionTypeInfo>
369
354
  }}},
370
355
  {"enable_index_compression",
371
356
  {offsetof(struct BlockBasedTableOptions, enable_index_compression),
372
- OptionType::kBoolean, OptionVerificationType::kNormal,
373
- OptionTypeFlags::kNone}},
357
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
374
358
  {"block_align",
375
359
  {offsetof(struct BlockBasedTableOptions, block_align),
376
- OptionType::kBoolean, OptionVerificationType::kNormal,
377
- OptionTypeFlags::kNone}},
360
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
378
361
  {"pin_top_level_index_and_filter",
379
362
  {offsetof(struct BlockBasedTableOptions,
380
363
  pin_top_level_index_and_filter),
381
- OptionType::kBoolean, OptionVerificationType::kNormal,
382
- OptionTypeFlags::kNone}},
364
+ OptionType::kBoolean, OptionVerificationType::kNormal}},
383
365
  {kOptNameMetadataCacheOpts,
384
366
  OptionTypeInfo::Struct(
385
367
  kOptNameMetadataCacheOpts, &metadata_cache_options_type_info,
@@ -396,36 +378,33 @@ static std::unordered_map<std::string, OptionTypeInfo>
396
378
  return Cache::CreateFromString(opts, value, cache);
397
379
  }}},
398
380
  {"block_cache_compressed",
399
- {0, OptionType::kUnknown, OptionVerificationType::kDeprecated,
400
- OptionTypeFlags::kNone}},
381
+ {0, OptionType::kUnknown, OptionVerificationType::kDeprecated}},
401
382
  {"max_auto_readahead_size",
402
383
  {offsetof(struct BlockBasedTableOptions, max_auto_readahead_size),
403
- OptionType::kSizeT, OptionVerificationType::kNormal,
404
- OptionTypeFlags::kMutable}},
384
+ OptionType::kSizeT, OptionVerificationType::kNormal}},
405
385
  {"prepopulate_block_cache",
406
386
  OptionTypeInfo::Enum<BlockBasedTableOptions::PrepopulateBlockCache>(
407
387
  offsetof(struct BlockBasedTableOptions, prepopulate_block_cache),
408
- &block_base_table_prepopulate_block_cache_string_map,
409
- OptionTypeFlags::kMutable)},
388
+ &block_base_table_prepopulate_block_cache_string_map)},
410
389
  {"initial_auto_readahead_size",
411
390
  {offsetof(struct BlockBasedTableOptions, initial_auto_readahead_size),
412
- OptionType::kSizeT, OptionVerificationType::kNormal,
413
- OptionTypeFlags::kMutable}},
391
+ OptionType::kSizeT, OptionVerificationType::kNormal}},
414
392
  {"num_file_reads_for_auto_readahead",
415
393
  {offsetof(struct BlockBasedTableOptions,
416
394
  num_file_reads_for_auto_readahead),
417
- OptionType::kUInt64T, OptionVerificationType::kNormal,
418
- OptionTypeFlags::kMutable}},
419
-
420
- };
395
+ OptionType::kUInt64T, OptionVerificationType::kNormal}},
396
+ };
397
+ }
398
+ } block_based_table_type_info;
421
399
 
422
400
  // TODO(myabandeh): We should return an error instead of silently changing the
423
401
  // options
424
402
  BlockBasedTableFactory::BlockBasedTableFactory(
425
403
  const BlockBasedTableOptions& _table_options)
426
- : table_options_(_table_options) {
404
+ : table_options_(_table_options),
405
+ shared_state_(std::make_shared<SharedState>()) {
427
406
  InitializeOptions();
428
- RegisterOptions(&table_options_, &block_based_table_type_info);
407
+ RegisterOptions(&table_options_, &block_based_table_type_info.info);
429
408
 
430
409
  const auto table_reader_charged =
431
410
  table_options_.cache_usage_options.options_overrides
@@ -433,10 +412,11 @@ BlockBasedTableFactory::BlockBasedTableFactory(
433
412
  .charged;
434
413
  if (table_options_.block_cache &&
435
414
  table_reader_charged == CacheEntryRoleOptions::Decision::kEnabled) {
436
- table_reader_cache_res_mgr_.reset(new ConcurrentCacheReservationManager(
437
- std::make_shared<CacheReservationManagerImpl<
438
- CacheEntryRole::kBlockBasedTableReader>>(
439
- table_options_.block_cache)));
415
+ shared_state_->table_reader_cache_res_mgr =
416
+ std::make_shared<ConcurrentCacheReservationManager>(
417
+ std::make_shared<CacheReservationManagerImpl<
418
+ CacheEntryRole::kBlockBasedTableReader>>(
419
+ table_options_.block_cache));
440
420
  }
441
421
  }
442
422
 
@@ -574,11 +554,13 @@ Status BlockBasedTableFactory::NewTableReader(
574
554
  ro, table_reader_options.ioptions, table_reader_options.env_options,
575
555
  table_options_, table_reader_options.internal_comparator, std::move(file),
576
556
  file_size, table_reader_options.block_protection_bytes_per_key,
577
- table_reader, table_reader_options.tail_size, table_reader_cache_res_mgr_,
557
+ table_reader, table_reader_options.tail_size,
558
+ shared_state_->table_reader_cache_res_mgr,
578
559
  table_reader_options.prefix_extractor, prefetch_index_and_filter_in_cache,
579
560
  table_reader_options.skip_filters, table_reader_options.level,
580
561
  table_reader_options.immortal, table_reader_options.largest_seqno,
581
- table_reader_options.force_direct_prefetch, &tail_prefetch_stats_,
562
+ table_reader_options.force_direct_prefetch,
563
+ &shared_state_->tail_prefetch_stats,
582
564
  table_reader_options.block_cache_tracer,
583
565
  table_reader_options.max_file_size_for_l0_meta_pin,
584
566
  table_reader_options.cur_db_session_id, table_reader_options.cur_file_num,
@@ -79,7 +79,13 @@ class BlockBasedTableFactory : public TableFactory {
79
79
 
80
80
  bool IsDeleteRangeSupported() const override { return true; }
81
81
 
82
- TailPrefetchStats* tail_prefetch_stats() { return &tail_prefetch_stats_; }
82
+ std::unique_ptr<TableFactory> Clone() const override {
83
+ return std::make_unique<BlockBasedTableFactory>(*this);
84
+ }
85
+
86
+ TailPrefetchStats* tail_prefetch_stats() {
87
+ return &shared_state_->tail_prefetch_stats;
88
+ }
83
89
 
84
90
  protected:
85
91
  const void* GetOptionsPtr(const std::string& name) const override;
@@ -91,8 +97,12 @@ class BlockBasedTableFactory : public TableFactory {
91
97
 
92
98
  private:
93
99
  BlockBasedTableOptions table_options_;
94
- std::shared_ptr<CacheReservationManager> table_reader_cache_res_mgr_;
95
- mutable TailPrefetchStats tail_prefetch_stats_;
100
+ // Share some state among cloned instances
101
+ struct SharedState {
102
+ std::shared_ptr<CacheReservationManager> table_reader_cache_res_mgr;
103
+ TailPrefetchStats tail_prefetch_stats;
104
+ };
105
+ std::shared_ptr<SharedState> shared_state_;
96
106
  };
97
107
 
98
108
  extern const std::string kHashIndexPrefixesBlock;