@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.
- package/binding.cc +43 -16
- package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
- package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
- package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
- package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
- package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
- package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
- package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
- package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
- package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
- package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
- package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
- package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
- package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
- package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
- package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
- package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
- package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
- package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
- package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
- package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
- package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
- package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
- package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
- package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
- package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
- package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
- package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
- package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
- package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
- package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
- package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
- package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
- package/deps/rocksdb/rocksdb/port/port.h +5 -9
- package/deps/rocksdb/rocksdb/src.mk +8 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/format.cc +3 -3
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
- package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
- package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
- package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
- package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- 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
|