@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
@@ -0,0 +1,400 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #pragma once
7
+ #include "db/memtable.h"
8
+ #include "rocksdb/utilities/write_batch_with_index.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+ // An implementation of the ReadOnlyMemTable interface based on the content
12
+ // of the given write batch with index (WBWI) object. This can be used to ingest
13
+ // a transaction (which is based on WBWI) into the DB as an immutable memtable.
14
+ //
15
+ // REQUIRE overwrite_key to be true for the WBWI
16
+ // Since the keys in WBWI do not have sequence number, the memtable needs to be
17
+ // assigned a range of sequence numbers through AssignSequenceNumbers(seqno)
18
+ // before being available for reads.
19
+ // With overwrite_key = true, WBWI keeps track of the most recent update for
20
+ // each key, and each such key will be assigned seqno.upper_bound during reads.
21
+ // One exception is during flush, consider the following scenario:
22
+ // - WBWI has SD(k) then PUT(k, v1)
23
+ // - DB has PUT(k, v2) in L1
24
+ // - flush WBWI adds PUT(k, v1) into L0
25
+ // - live memtable contains SD(k)
26
+ // - flush live memtable and compact it with L0 will drop SD(k) and PUT(k, v1)
27
+ // - the PUT(k, v2) in L1 incorrectly becomes visible
28
+ // So during flush, iterator from this memtable will need emit overwritten
29
+ // single deletion. These single deletion entries will be
30
+ // assigned seqno.upper_bound - 1.
31
+ class WBWIMemTable final : public ReadOnlyMemTable {
32
+ public:
33
+ struct SeqnoRange {
34
+ SequenceNumber lower_bound = kMaxSequenceNumber;
35
+ SequenceNumber upper_bound = kMaxSequenceNumber;
36
+ };
37
+ WBWIMemTable(const std::shared_ptr<WriteBatchWithIndex>& wbwi,
38
+ const Comparator* cmp, uint32_t cf_id,
39
+ const ImmutableOptions* immutable_options,
40
+ const MutableCFOptions* cf_options,
41
+ const WriteBatchWithIndex::CFStat& stat)
42
+ : wbwi_(wbwi),
43
+ comparator_(cmp),
44
+ ikey_comparator_(comparator_),
45
+ moptions_(*immutable_options, *cf_options),
46
+ clock_(immutable_options->clock),
47
+ // We need to include overwritten_sd_count in num_entries_ since flush
48
+ // verifies number of entries processed and that iterator for this
49
+ // memtable will emit overwritten SingleDelete entries during flush, See
50
+ // comment above WBWIMemTableIterator for more detail.
51
+ num_entries_(stat.entry_count + stat.overwritten_sd_count),
52
+ cf_id_(cf_id) {
53
+ assert(wbwi->GetOverwriteKey());
54
+ }
55
+
56
+ // No copying allowed
57
+ WBWIMemTable(const WBWIMemTable&) = delete;
58
+ WBWIMemTable& operator=(const WBWIMemTable&) = delete;
59
+
60
+ ~WBWIMemTable() override { assert(refs_ == 0); }
61
+
62
+ const char* Name() const override { return "WBWIMemTable"; }
63
+
64
+ size_t ApproximateMemoryUsage() override {
65
+ // FIXME: we can calculate for each CF or just divide evenly among CFs
66
+ // Used in ReportFlushInputSize(), MemPurgeDecider, flush job event logging,
67
+ // and InternalStats::HandleCurSizeAllMemTables
68
+ return 0;
69
+ }
70
+
71
+ size_t MemoryAllocatedBytes() const override {
72
+ // FIXME: similar to ApproximateMemoryUsage().
73
+ // Used in MemTableList to trim memtable history.
74
+ return 0;
75
+ }
76
+
77
+ void UniqueRandomSample(
78
+ const uint64_t& /* target_sample_size */,
79
+ std::unordered_set<const char*>* /* entries */) override {
80
+ // TODO: support mempurge
81
+ assert(false);
82
+ }
83
+
84
+ InternalIterator* NewIterator(const ReadOptions&,
85
+ UnownedPtr<const SeqnoToTimeMapping>,
86
+ Arena* arena,
87
+ const SliceTransform* /* prefix_extractor */,
88
+ bool for_flush) override;
89
+
90
+ // Returns an iterator that wraps a MemTableIterator and logically strips the
91
+ // user-defined timestamp of each key. This API is only used by flush when
92
+ // user-defined timestamps in MemTable only feature is enabled.
93
+ InternalIterator* NewTimestampStrippingIterator(
94
+ const ReadOptions&, UnownedPtr<const SeqnoToTimeMapping>, Arena* arena,
95
+ const SliceTransform*, size_t) override {
96
+ // TODO: support UDT
97
+ assert(false);
98
+ return NewErrorInternalIterator(
99
+ Status::NotSupported(
100
+ "WBWIMemTable does not support NewTimestampStrippingIterator."),
101
+ arena);
102
+ }
103
+
104
+ FragmentedRangeTombstoneIterator* NewRangeTombstoneIterator(
105
+ const ReadOptions&, SequenceNumber, bool) override {
106
+ // TODO: support DeleteRange
107
+ assert(!wbwi_->GetWriteBatch()->HasDeleteRange());
108
+ return nullptr;
109
+ }
110
+
111
+ FragmentedRangeTombstoneIterator* NewTimestampStrippingRangeTombstoneIterator(
112
+ const ReadOptions&, SequenceNumber, size_t) override {
113
+ // TODO: support UDT
114
+ assert(false);
115
+ return nullptr;
116
+ }
117
+
118
+ // FIXME: not a good practice to use default parameter with virtual function
119
+ using ReadOnlyMemTable::Get;
120
+ bool Get(const LookupKey& key, std::string* value,
121
+ PinnableWideColumns* columns, std::string* timestamp, Status* s,
122
+ MergeContext* merge_context,
123
+ SequenceNumber* max_covering_tombstone_seq, SequenceNumber* seq,
124
+ const ReadOptions& read_opts, bool immutable_memtable,
125
+ ReadCallback* callback = nullptr, bool* is_blob_index = nullptr,
126
+ bool do_merge = true) override;
127
+
128
+ void MultiGet(const ReadOptions& read_options, MultiGetRange* range,
129
+ ReadCallback* callback, bool immutable_memtable) override;
130
+
131
+ uint64_t NumEntries() const override { return num_entries_; }
132
+
133
+ uint64_t NumDeletion() const override {
134
+ // FIXME: this is used for stats and event logging
135
+ return 0;
136
+ }
137
+
138
+ uint64_t NumRangeDeletion() const override {
139
+ // FIXME
140
+ assert(!wbwi_->GetWriteBatch()->HasDeleteRange());
141
+ return 0;
142
+ }
143
+
144
+ uint64_t GetDataSize() const override {
145
+ // FIXME: used in event logging in flush_job
146
+ return 0;
147
+ }
148
+
149
+ SequenceNumber GetEarliestSequenceNumber() override {
150
+ return assigned_seqno_.lower_bound;
151
+ }
152
+
153
+ bool IsEmpty() const override {
154
+ // Ideally also check that wbwi contains updates from this CF. For now, we
155
+ // only create WBWIMemTable for CFs with updates in wbwi.
156
+ return wbwi_->GetWriteBatch()->Count() == 0;
157
+ }
158
+
159
+ SequenceNumber GetFirstSequenceNumber() override {
160
+ return assigned_seqno_.lower_bound;
161
+ }
162
+
163
+ uint64_t GetMinLogContainingPrepSection() override {
164
+ // FIXME: used to retain WAL with pending Prepare
165
+ return min_prep_log_referenced_;
166
+ }
167
+
168
+ void MarkImmutable() override {}
169
+
170
+ void MarkFlushed() override {}
171
+
172
+ MemTableStats ApproximateStats(const Slice&, const Slice&) override {
173
+ // FIXME: used for query planning
174
+ return {};
175
+ }
176
+
177
+ const InternalKeyComparator& GetInternalKeyComparator() const override {
178
+ return ikey_comparator_;
179
+ }
180
+
181
+ uint64_t ApproximateOldestKeyTime() const override {
182
+ // FIXME: can use the time when this is added to the DB.
183
+ return kUnknownOldestAncesterTime;
184
+ }
185
+
186
+ bool IsFragmentedRangeTombstonesConstructed() const override {
187
+ assert(!wbwi_->GetWriteBatch()->HasDeleteRange());
188
+ return true;
189
+ }
190
+
191
+ const Slice& GetNewestUDT() const override {
192
+ // FIXME: support UDT
193
+ assert(false);
194
+ return newest_udt_;
195
+ }
196
+
197
+ // Assign a sequence number to the entries in this memtable.
198
+ void AssignSequenceNumbers(const SeqnoRange& seqno_range) {
199
+ // Not expecting to assign seqno multiple times.
200
+ assert(assigned_seqno_.lower_bound == kMaxSequenceNumber);
201
+ assert(assigned_seqno_.upper_bound == kMaxSequenceNumber);
202
+
203
+ assigned_seqno_ = seqno_range;
204
+
205
+ assert(assigned_seqno_.lower_bound <= assigned_seqno_.upper_bound);
206
+ assert(assigned_seqno_.upper_bound != kMaxSequenceNumber);
207
+ }
208
+
209
+ void SetMinPrepLog(uint64_t min_prep_log) {
210
+ min_prep_log_referenced_ = min_prep_log;
211
+ }
212
+
213
+ private:
214
+ inline InternalIterator* NewIterator() const;
215
+
216
+ Slice newest_udt_;
217
+ std::shared_ptr<WriteBatchWithIndex> wbwi_;
218
+ const Comparator* comparator_;
219
+ InternalKeyComparator ikey_comparator_;
220
+ SeqnoRange assigned_seqno_;
221
+ const ImmutableMemTableOptions moptions_;
222
+ SystemClock* clock_;
223
+ uint64_t min_prep_log_referenced_{0};
224
+ uint64_t num_entries_;
225
+ // WBWI can contains updates to multiple CFs. `cf_id_` determines which CF
226
+ // this memtable is for.
227
+ uint32_t cf_id_;
228
+ };
229
+
230
+ class WBWIMemTableIterator final : public InternalIterator {
231
+ public:
232
+ WBWIMemTableIterator(std::unique_ptr<WBWIIterator>&& it,
233
+ const WBWIMemTable::SeqnoRange& assigned_seqno,
234
+ const Comparator* comparator, bool for_flush)
235
+ : it_(std::move(it)),
236
+ assigned_seqno_(assigned_seqno),
237
+ comparator_(comparator),
238
+ emit_overwritten_single_del_(for_flush) {
239
+ assert(assigned_seqno_.lower_bound <= assigned_seqno_.upper_bound);
240
+ assert(assigned_seqno_.upper_bound < kMaxSequenceNumber);
241
+ s_.PermitUncheckedError();
242
+ }
243
+
244
+ // No copying allowed
245
+ WBWIMemTableIterator(const WBWIMemTableIterator&) = delete;
246
+ WBWIMemTableIterator& operator=(const WBWIMemTableIterator&) = delete;
247
+
248
+ bool Valid() const override { return valid_; }
249
+
250
+ void SeekToFirst() override {
251
+ it_->SeekToFirst();
252
+ UpdateKey();
253
+ }
254
+
255
+ void SeekToLast() override {
256
+ it_->SeekToLast();
257
+ UpdateKey();
258
+ }
259
+
260
+ void Seek(const Slice& target) override {
261
+ Slice target_user_key = ExtractUserKey(target);
262
+ it_->Seek(target_user_key);
263
+ if (it_->Valid()) {
264
+ // compare seqno
265
+ SequenceNumber seqno = GetInternalKeySeqno(target);
266
+ assert(!emit_overwritten_single_del_);
267
+ // For now all keys are assigned seqno_ub_, this may change after merge
268
+ // is supported.
269
+ assert(seqno <= assigned_seqno_.lower_bound ||
270
+ seqno >= assigned_seqno_.upper_bound);
271
+ if (seqno < assigned_seqno_.upper_bound &&
272
+ comparator_->Compare(it_->Entry().key, target_user_key) == 0) {
273
+ it_->Next();
274
+ // TODO: cannot assume distinct keys once Merge is supported
275
+ if (it_->Valid()) {
276
+ assert(comparator_->Compare(it_->Entry().key, target_user_key) > 0);
277
+ }
278
+ }
279
+ }
280
+ UpdateKey();
281
+ }
282
+
283
+ void SeekForPrev(const Slice& target) override {
284
+ Slice target_user_key = ExtractUserKey(target);
285
+ it_->SeekForPrev(target_user_key);
286
+ if (it_->Valid()) {
287
+ SequenceNumber seqno = GetInternalKeySeqno(target);
288
+ assert(seqno <= assigned_seqno_.lower_bound ||
289
+ seqno >= assigned_seqno_.upper_bound);
290
+ if (seqno > assigned_seqno_.upper_bound &&
291
+ comparator_->Compare(it_->Entry().key, target_user_key) == 0) {
292
+ it_->Prev();
293
+ if (it_->Valid()) {
294
+ // TODO: cannot assume distinct keys once Merge is supported
295
+ assert(comparator_->Compare(it_->Entry().key, target_user_key) < 0);
296
+ }
297
+ }
298
+ }
299
+ UpdateKey();
300
+ }
301
+
302
+ void Next() override {
303
+ // Only need to emit single deletion during flush. Since Flush does
304
+ // sequential forward scan, we only need to emit single deletion in Next(),
305
+ // and do not need to consider iterator direction change.
306
+ assert(Valid());
307
+ if (emit_overwritten_single_del_) {
308
+ if (it_->HasOverWrittenSingleDel() && !at_overwritten_single_del_) {
309
+ UpdateSingleDeleteKey();
310
+ return;
311
+ }
312
+ at_overwritten_single_del_ = false;
313
+ }
314
+
315
+ it_->Next();
316
+ UpdateKey();
317
+ }
318
+
319
+ bool NextAndGetResult(IterateResult* result) override {
320
+ assert(Valid());
321
+ Next();
322
+ bool is_valid = Valid();
323
+ if (is_valid) {
324
+ result->key = key();
325
+ result->bound_check_result = IterBoundCheck::kUnknown;
326
+ result->value_prepared = true;
327
+ }
328
+ return is_valid;
329
+ }
330
+
331
+ void Prev() override {
332
+ assert(Valid());
333
+ it_->Prev();
334
+ UpdateKey();
335
+ }
336
+
337
+ Slice key() const override {
338
+ assert(Valid());
339
+ return key_;
340
+ }
341
+
342
+ Slice value() const override {
343
+ assert(Valid());
344
+ // TODO: it_->Entry() is not trivial, cache it
345
+ return it_->Entry().value;
346
+ }
347
+
348
+ Status status() const override {
349
+ assert(it_->status().ok());
350
+ return s_;
351
+ }
352
+
353
+ bool IsValuePinned() const override { return true; }
354
+
355
+ private:
356
+ static const std::unordered_map<WriteType, ValueType> WriteTypeToValueTypeMap;
357
+
358
+ void UpdateKey() {
359
+ valid_ = it_->Valid();
360
+ if (!Valid()) {
361
+ key_.clear();
362
+ return;
363
+ }
364
+ auto t = WriteTypeToValueTypeMap.find(it_->Entry().type);
365
+ assert(t != WriteTypeToValueTypeMap.end());
366
+ if (t == WriteTypeToValueTypeMap.end()) {
367
+ key_.clear();
368
+ valid_ = false;
369
+ s_ = Status::Corruption("Unexpected write_batch_with_index entry type " +
370
+ std::to_string(t->second));
371
+ return;
372
+ }
373
+ key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.upper_bound,
374
+ t->second);
375
+ key_ = key_buf_.GetInternalKey();
376
+ }
377
+
378
+ void UpdateSingleDeleteKey() {
379
+ assert(it_->Valid());
380
+ assert(Valid());
381
+ assert(assigned_seqno_.lower_bound < assigned_seqno_.upper_bound);
382
+ key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.upper_bound - 1,
383
+ kTypeSingleDeletion);
384
+ key_ = key_buf_.GetInternalKey();
385
+ at_overwritten_single_del_ = true;
386
+ }
387
+
388
+ std::unique_ptr<WBWIIterator> it_;
389
+ const WBWIMemTable::SeqnoRange assigned_seqno_;
390
+ const Comparator* comparator_;
391
+ IterKey key_buf_;
392
+ // The current internal key.
393
+ Slice key_;
394
+ Status s_;
395
+ bool valid_ = false;
396
+ bool at_overwritten_single_del_ = false;
397
+ bool emit_overwritten_single_del_ = false;
398
+ };
399
+
400
+ } // namespace ROCKSDB_NAMESPACE
@@ -50,6 +50,8 @@ Env::IOActivity ThreadStatusUtil::TEST_GetExpectedIOActivity(
50
50
  return Env::IOActivity::kGetEntity;
51
51
  case ThreadStatus::OperationType::OP_MULTIGETENTITY:
52
52
  return Env::IOActivity::kMultiGetEntity;
53
+ case ThreadStatus::OperationType::OP_READ_MANIFEST:
54
+ return Env::IOActivity::kReadManifest;
53
55
  default:
54
56
  return Env::IOActivity::kUnknown;
55
57
  }
@@ -7,6 +7,7 @@
7
7
 
8
8
  #include <cassert>
9
9
  #include <cinttypes>
10
+ #include <iostream>
10
11
  #include <limits>
11
12
  #include <string>
12
13
 
@@ -132,6 +133,92 @@ static Status ParseCompressionOptions(const std::string& value,
132
133
  return Status::OK();
133
134
  }
134
135
 
136
+ static Status TableFactoryParseFn(const ConfigOptions& opts,
137
+ const std::string& name,
138
+ const std::string& value, void* addr) {
139
+ assert(addr);
140
+ auto table_factory = static_cast<std::shared_ptr<TableFactory>*>(addr);
141
+
142
+ // The general approach to mutating a table factory is to clone it, then
143
+ // mutate and save the clone. This avoids race conditions between SetOptions
144
+ // and consumers of table_factory/table options by leveraging
145
+ // MutableCFOptions infrastructure to track the table_factory pointer.
146
+
147
+ // However, in the atypical case of setting an option that is safely mutable
148
+ // under something pointed to by the table factory, we should avoid cloning.
149
+ // The simple way to detect that case is to try with "mutable_options_only"
150
+ // and see if it works. If it does, we are finished. If not, we proceed to
151
+ // cloning etc.
152
+ //
153
+ // The canonical example of what is handled here is
154
+ // table_factory.filter_policy.bloom_before_level for RibbonFilterPolicy.
155
+ if (table_factory->get() != nullptr && !EndsWith(name, "table_factory")) {
156
+ ConfigOptions opts_mutable_only{opts};
157
+ opts_mutable_only.mutable_options_only = true;
158
+ Status s =
159
+ table_factory->get()->ConfigureOption(opts_mutable_only, name, value);
160
+ if (s.ok()) {
161
+ return s;
162
+ }
163
+ s.PermitUncheckedError();
164
+ }
165
+
166
+ std::shared_ptr<TableFactory> new_factory;
167
+ Status s;
168
+ if (name == "block_based_table_factory") {
169
+ if (table_factory->get() != nullptr) {
170
+ std::string factory_name = table_factory->get()->Name();
171
+ if (factory_name == TableFactory::kBlockBasedTableName()) {
172
+ new_factory = table_factory->get()->Clone();
173
+ } else {
174
+ s = Status::InvalidArgument("Cannot modify " + factory_name + " as " +
175
+ name);
176
+ return s;
177
+ }
178
+ } else {
179
+ new_factory.reset(NewBlockBasedTableFactory());
180
+ }
181
+ // Passing an object string to configure/instantiate a table factory
182
+ s = new_factory->ConfigureFromString(opts, value);
183
+ } else if (name == "plain_table_factory") {
184
+ if (table_factory->get() != nullptr) {
185
+ std::string factory_name = table_factory->get()->Name();
186
+ if (factory_name == TableFactory::kPlainTableName()) {
187
+ new_factory = table_factory->get()->Clone();
188
+ } else {
189
+ s = Status::InvalidArgument("Cannot modify " + factory_name + " as " +
190
+ name);
191
+ return s;
192
+ }
193
+ } else {
194
+ new_factory.reset(NewPlainTableFactory());
195
+ }
196
+ // Passing an object string to configure/instantiate a table factory
197
+ s = new_factory->ConfigureFromString(opts, value);
198
+ } else if (name == "table_factory" || name == OptionTypeInfo::kIdPropName()) {
199
+ // Related to OptionTypeInfo::AsCustomSharedPtr
200
+ if (value.empty()) {
201
+ new_factory = nullptr;
202
+ } else {
203
+ s = TableFactory::CreateFromString(opts, value, &new_factory);
204
+ }
205
+ } else if (table_factory->get() != nullptr) {
206
+ new_factory = table_factory->get()->Clone();
207
+ // Presumably passing a value for a specific field of the table factory
208
+ s = new_factory->ConfigureOption(opts, name, value);
209
+ } else {
210
+ s = Status::NotFound("Unable to instantiate a table factory from option: ",
211
+ name);
212
+ return s;
213
+ }
214
+
215
+ // Only keep the modified clone if everything went OK
216
+ if (s.ok()) {
217
+ *table_factory = std::move(new_factory);
218
+ }
219
+ return s;
220
+ }
221
+
135
222
  const std::string kOptNameBMCompOpts = "bottommost_compression_opts";
136
223
  const std::string kOptNameCompOpts = "compression_opts";
137
224
 
@@ -266,6 +353,25 @@ static std::unordered_map<std::string, OptionTypeInfo>
266
353
  {offsetof(struct MutableCFOptions, disable_auto_compactions),
267
354
  OptionType::kBoolean, OptionVerificationType::kNormal,
268
355
  OptionTypeFlags::kMutable}},
356
+ {"table_factory",
357
+ {offsetof(struct MutableCFOptions, table_factory),
358
+ OptionType::kCustomizable, OptionVerificationType::kByName,
359
+ OptionTypeFlags::kShared | OptionTypeFlags::kCompareLoose |
360
+ OptionTypeFlags::kStringNameOnly | OptionTypeFlags::kDontPrepare |
361
+ OptionTypeFlags::kMutable,
362
+ TableFactoryParseFn}},
363
+ {"block_based_table_factory",
364
+ {offsetof(struct MutableCFOptions, table_factory),
365
+ OptionType::kCustomizable, OptionVerificationType::kAlias,
366
+ OptionTypeFlags::kShared | OptionTypeFlags::kCompareLoose |
367
+ OptionTypeFlags::kMutable,
368
+ TableFactoryParseFn}},
369
+ {"plain_table_factory",
370
+ {offsetof(struct MutableCFOptions, table_factory),
371
+ OptionType::kCustomizable, OptionVerificationType::kAlias,
372
+ OptionTypeFlags::kShared | OptionTypeFlags::kCompareLoose |
373
+ OptionTypeFlags::kMutable,
374
+ TableFactoryParseFn}},
269
375
  {"filter_deletes",
270
376
  {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
271
377
  OptionTypeFlags::kMutable}},
@@ -446,6 +552,14 @@ static std::unordered_map<std::string, OptionTypeInfo>
446
552
  {offsetof(struct MutableCFOptions, periodic_compaction_seconds),
447
553
  OptionType::kUInt64T, OptionVerificationType::kNormal,
448
554
  OptionTypeFlags::kMutable}},
555
+ {"preclude_last_level_data_seconds",
556
+ {offsetof(struct MutableCFOptions, preclude_last_level_data_seconds),
557
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
558
+ OptionTypeFlags::kNone}},
559
+ {"preserve_internal_time_seconds",
560
+ {offsetof(struct MutableCFOptions, preserve_internal_time_seconds),
561
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
562
+ OptionTypeFlags::kNone}},
449
563
  {"bottommost_temperature",
450
564
  {0, OptionType::kTemperature, OptionVerificationType::kDeprecated,
451
565
  OptionTypeFlags::kMutable}},
@@ -626,14 +740,6 @@ static std::unordered_map<std::string, OptionTypeInfo>
626
740
  {offsetof(struct ImmutableCFOptions, default_temperature),
627
741
  OptionType::kTemperature, OptionVerificationType::kNormal,
628
742
  OptionTypeFlags::kCompareNever}},
629
- {"preclude_last_level_data_seconds",
630
- {offsetof(struct ImmutableCFOptions, preclude_last_level_data_seconds),
631
- OptionType::kUInt64T, OptionVerificationType::kNormal,
632
- OptionTypeFlags::kNone}},
633
- {"preserve_internal_time_seconds",
634
- {offsetof(struct ImmutableCFOptions, preserve_internal_time_seconds),
635
- OptionType::kUInt64T, OptionVerificationType::kNormal,
636
- OptionTypeFlags::kNone}},
637
743
  // Need to keep this around to be able to read old OPTIONS files.
638
744
  {"max_mem_compaction_level",
639
745
  {0, OptionType::kInt, OptionVerificationType::kDeprecated,
@@ -713,76 +819,6 @@ static std::unordered_map<std::string, OptionTypeInfo>
713
819
  MemTableRepFactory::CreateFromString(opts, value, shared);
714
820
  return s;
715
821
  }}},
716
- {"table_factory",
717
- OptionTypeInfo::AsCustomSharedPtr<TableFactory>(
718
- offsetof(struct ImmutableCFOptions, table_factory),
719
- OptionVerificationType::kByName,
720
- (OptionTypeFlags::kCompareLoose |
721
- OptionTypeFlags::kStringNameOnly |
722
- OptionTypeFlags::kDontPrepare))},
723
- {"block_based_table_factory",
724
- {offsetof(struct ImmutableCFOptions, table_factory),
725
- OptionType::kCustomizable, OptionVerificationType::kAlias,
726
- OptionTypeFlags::kShared | OptionTypeFlags::kCompareLoose,
727
- // Parses the input value and creates a BlockBasedTableFactory
728
- [](const ConfigOptions& opts, const std::string& name,
729
- const std::string& value, void* addr) {
730
- BlockBasedTableOptions* old_opts = nullptr;
731
- auto table_factory =
732
- static_cast<std::shared_ptr<TableFactory>*>(addr);
733
- if (table_factory->get() != nullptr) {
734
- old_opts =
735
- table_factory->get()->GetOptions<BlockBasedTableOptions>();
736
- }
737
- if (name == "block_based_table_factory") {
738
- std::unique_ptr<TableFactory> new_factory;
739
- if (old_opts != nullptr) {
740
- new_factory.reset(NewBlockBasedTableFactory(*old_opts));
741
- } else {
742
- new_factory.reset(NewBlockBasedTableFactory());
743
- }
744
- Status s = new_factory->ConfigureFromString(opts, value);
745
- if (s.ok()) {
746
- table_factory->reset(new_factory.release());
747
- }
748
- return s;
749
- } else if (old_opts != nullptr) {
750
- return table_factory->get()->ConfigureOption(opts, name, value);
751
- } else {
752
- return Status::NotFound("Mismatched table option: ", name);
753
- }
754
- }}},
755
- {"plain_table_factory",
756
- {offsetof(struct ImmutableCFOptions, table_factory),
757
- OptionType::kCustomizable, OptionVerificationType::kAlias,
758
- OptionTypeFlags::kShared | OptionTypeFlags::kCompareLoose,
759
- // Parses the input value and creates a PlainTableFactory
760
- [](const ConfigOptions& opts, const std::string& name,
761
- const std::string& value, void* addr) {
762
- PlainTableOptions* old_opts = nullptr;
763
- auto table_factory =
764
- static_cast<std::shared_ptr<TableFactory>*>(addr);
765
- if (table_factory->get() != nullptr) {
766
- old_opts = table_factory->get()->GetOptions<PlainTableOptions>();
767
- }
768
- if (name == "plain_table_factory") {
769
- std::unique_ptr<TableFactory> new_factory;
770
- if (old_opts != nullptr) {
771
- new_factory.reset(NewPlainTableFactory(*old_opts));
772
- } else {
773
- new_factory.reset(NewPlainTableFactory());
774
- }
775
- Status s = new_factory->ConfigureFromString(opts, value);
776
- if (s.ok()) {
777
- table_factory->reset(new_factory.release());
778
- }
779
- return s;
780
- } else if (old_opts != nullptr) {
781
- return table_factory->get()->ConfigureOption(opts, name, value);
782
- } else {
783
- return Status::NotFound("Mismatched table option: ", name);
784
- }
785
- }}},
786
822
  {"table_properties_collectors",
787
823
  OptionTypeInfo::Vector<
788
824
  std::shared_ptr<TablePropertiesCollectorFactory>>(
@@ -954,7 +990,6 @@ ImmutableCFOptions::ImmutableCFOptions(const ColumnFamilyOptions& cf_options)
954
990
  inplace_update_support(cf_options.inplace_update_support),
955
991
  inplace_callback(cf_options.inplace_callback),
956
992
  memtable_factory(cf_options.memtable_factory),
957
- table_factory(cf_options.table_factory),
958
993
  table_properties_collector_factories(
959
994
  cf_options.table_properties_collector_factories),
960
995
  bloom_locality(cf_options.bloom_locality),
@@ -964,9 +999,6 @@ ImmutableCFOptions::ImmutableCFOptions(const ColumnFamilyOptions& cf_options)
964
999
  optimize_filters_for_hits(cf_options.optimize_filters_for_hits),
965
1000
  force_consistency_checks(cf_options.force_consistency_checks),
966
1001
  default_temperature(cf_options.default_temperature),
967
- preclude_last_level_data_seconds(
968
- cf_options.preclude_last_level_data_seconds),
969
- preserve_internal_time_seconds(cf_options.preserve_internal_time_seconds),
970
1002
  memtable_insert_with_hint_prefix_extractor(
971
1003
  cf_options.memtable_insert_with_hint_prefix_extractor),
972
1004
  cf_paths(cf_options.cf_paths),
@@ -1108,6 +1140,11 @@ void MutableCFOptions::Dump(Logger* log) const {
1108
1140
  ttl);
1109
1141
  ROCKS_LOG_INFO(log, " periodic_compaction_seconds: %" PRIu64,
1110
1142
  periodic_compaction_seconds);
1143
+ ROCKS_LOG_INFO(log,
1144
+ " preclude_last_level_data_seconds: %" PRIu64,
1145
+ preclude_last_level_data_seconds);
1146
+ ROCKS_LOG_INFO(log, " preserve_internal_time_seconds: %" PRIu64,
1147
+ preserve_internal_time_seconds);
1111
1148
  ROCKS_LOG_INFO(log, " paranoid_memory_checks: %d",
1112
1149
  paranoid_memory_checks);
1113
1150
  std::string result;
@@ -1221,4 +1258,22 @@ Status GetStringFromMutableCFOptions(const ConfigOptions& config_options,
1221
1258
  return OptionTypeInfo::SerializeType(
1222
1259
  config_options, cf_mutable_options_type_info, &mutable_opts, opt_string);
1223
1260
  }
1261
+
1262
+ #ifndef NDEBUG
1263
+ std::vector<std::string> TEST_GetImmutableInMutableCFOptions() {
1264
+ std::vector<std::string> result;
1265
+ for (const auto& opt : cf_mutable_options_type_info) {
1266
+ if (!opt.second.IsMutable()) {
1267
+ result.emplace_back(opt.first);
1268
+ }
1269
+ }
1270
+ if (result.size() > 0) {
1271
+ std::cerr << "Warning: " << result.size() << " immutable options in "
1272
+ << "MutableCFOptions" << std::endl;
1273
+ }
1274
+ return result;
1275
+ }
1276
+
1277
+ bool TEST_allowSetOptionsImmutableInMutable = false;
1278
+ #endif // !NDEBUG
1224
1279
  } // namespace ROCKSDB_NAMESPACE