@nxtedition/rocksdb 13.5.13 → 14.0.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 +33 -2
- package/binding.gyp +2 -2
- package/chained-batch.js +9 -16
- package/deps/rocksdb/rocksdb/BUCK +18 -1
- package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
- package/deps/rocksdb/rocksdb/Makefile +20 -9
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +90 -13
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -75
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +44 -36
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +184 -148
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +5 -11
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +116 -47
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +3 -6
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -1
- package/deps/rocksdb/rocksdb/db/builder.cc +4 -2
- package/deps/rocksdb/rocksdb/db/c.cc +207 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +72 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +3 -2
- package/deps/rocksdb/rocksdb/db/column_family.h +5 -0
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +51 -38
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +29 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +5 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +566 -366
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +131 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +13 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +12 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +97 -76
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +11 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +16 -3
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +448 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +22 -20
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +4 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +7 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +104 -0
- package/deps/rocksdb/rocksdb/db/db_iter.h +4 -11
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +331 -58
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -0
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +40 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +25 -15
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -24
- package/deps/rocksdb/rocksdb/db/db_test_util.h +29 -14
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +69 -36
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +5 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +8 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +275 -79
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +23 -5
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +591 -175
- package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -4
- package/deps/rocksdb/rocksdb/db/log_reader.cc +5 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +84 -35
- package/deps/rocksdb/rocksdb/db/memtable.h +39 -34
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -0
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/multi_scan.cc +11 -5
- package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +34 -14
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +28 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +159 -14
- package/deps/rocksdb/rocksdb/db/version_set.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +60 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +16 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +75 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.cc +28 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +50 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +57 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +266 -35
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +18 -2
- package/deps/rocksdb/rocksdb/env/env.cc +12 -0
- package/deps/rocksdb/rocksdb/env/env_test.cc +18 -0
- package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +2 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +9 -5
- package/deps/rocksdb/rocksdb/env/io_posix.cc +4 -2
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +19 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +33 -31
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +42 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +93 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +43 -49
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +4 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +487 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +11 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +135 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +12 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +12 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +19 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +219 -24
- package/deps/rocksdb/rocksdb/include/rocksdb/point_lock_bench_tool.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +16 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +45 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +3 -3
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +77 -51
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +10 -13
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +16 -7
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +9 -4
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -1
- package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
- package/deps/rocksdb/rocksdb/options/options.cc +2 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +9 -8
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -5
- package/deps/rocksdb/rocksdb/port/mmap.cc +1 -1
- package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -0
- package/deps/rocksdb/rocksdb/port/win/xpress_win.h +4 -0
- package/deps/rocksdb/rocksdb/src.mk +8 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1125 -765
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +35 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +29 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +732 -256
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +225 -16
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -26
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -75
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +433 -141
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +17 -10
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy_impl.h +20 -0
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +112 -85
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +191 -36
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +108 -31
- package/deps/rocksdb/rocksdb/table/external_table.cc +7 -3
- package/deps/rocksdb/rocksdb/table/format.cc +6 -12
- package/deps/rocksdb/rocksdb/table/format.h +10 -0
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -1
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +5 -0
- package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +118 -46
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +9 -8
- package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
- package/deps/rocksdb/rocksdb/table/table_properties.cc +16 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +1540 -155
- package/deps/rocksdb/rocksdb/test_util/testutil.h +21 -5
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -5
- package/deps/rocksdb/rocksdb/tools/ldb.cc +1 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +2 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -3
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +133 -165
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +173 -64
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +69 -0
- package/deps/rocksdb/rocksdb/util/atomic.h +6 -0
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +29 -20
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +10 -6
- package/deps/rocksdb/rocksdb/util/bit_fields.h +338 -0
- package/deps/rocksdb/rocksdb/util/coding.h +3 -3
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.cc +777 -82
- package/deps/rocksdb/rocksdb/util/compression.h +5 -0
- package/deps/rocksdb/rocksdb/util/compression_test.cc +5 -3
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +2 -2
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +15 -14
- package/deps/rocksdb/rocksdb/util/interval_test.cc +102 -0
- package/deps/rocksdb/rocksdb/util/semaphore.h +164 -0
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +10 -6
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -2
- package/deps/rocksdb/rocksdb/util/slice_test.cc +136 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +2 -16
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +35 -14
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +5 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/any_lock_manager_test.h +244 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench.cc +18 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench_tool.cc +159 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +1244 -161
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +66 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_stress_test.cc +103 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +1275 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +40 -262
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test_common.h +78 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_validation_test_runner.h +469 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +9 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +18 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +72 -44
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +92 -15
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +6 -20
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +143 -112
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +23 -16
- package/index.js +3 -3
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/util.h +38 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.cc +0 -17
|
@@ -80,6 +80,8 @@ class BlockBuilder {
|
|
|
80
80
|
// Return true iff no entries have been added since the last Reset()
|
|
81
81
|
bool empty() const { return buffer_.empty(); }
|
|
82
82
|
|
|
83
|
+
std::string& MutableBuffer() { return buffer_; }
|
|
84
|
+
|
|
83
85
|
private:
|
|
84
86
|
inline void AddWithLastKeyImpl(const Slice& key, const Slice& value,
|
|
85
87
|
const Slice& last_key,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
namespace ROCKSDB_NAMESPACE {
|
|
20
20
|
|
|
21
21
|
// Flush block by size
|
|
22
|
-
class FlushBlockBySizePolicy : public
|
|
22
|
+
class FlushBlockBySizePolicy : public RetargetableFlushBlockPolicy {
|
|
23
23
|
public:
|
|
24
24
|
// @params block_size: Approximate size of user data packed per
|
|
25
25
|
// block.
|
|
@@ -28,19 +28,19 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
|
|
|
28
28
|
FlushBlockBySizePolicy(const uint64_t block_size,
|
|
29
29
|
const uint64_t block_size_deviation, const bool align,
|
|
30
30
|
const BlockBuilder& data_block_builder)
|
|
31
|
-
:
|
|
31
|
+
: RetargetableFlushBlockPolicy(data_block_builder),
|
|
32
|
+
block_size_(block_size),
|
|
32
33
|
block_size_deviation_limit_(
|
|
33
34
|
((block_size * (100 - block_size_deviation)) + 99) / 100),
|
|
34
|
-
align_(align)
|
|
35
|
-
data_block_builder_(data_block_builder) {}
|
|
35
|
+
align_(align) {}
|
|
36
36
|
|
|
37
37
|
bool Update(const Slice& key, const Slice& value) override {
|
|
38
38
|
// it makes no sense to flush when the data block is empty
|
|
39
|
-
if (data_block_builder_
|
|
39
|
+
if (data_block_builder_->empty()) {
|
|
40
40
|
return false;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
auto curr_size = data_block_builder_
|
|
43
|
+
auto curr_size = data_block_builder_->CurrentSizeEstimate();
|
|
44
44
|
|
|
45
45
|
// Do flush if one of the below two conditions is true:
|
|
46
46
|
// 1) if the current estimated size already exceeds the block size,
|
|
@@ -56,9 +56,9 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
|
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
const auto curr_size = data_block_builder_
|
|
59
|
+
const auto curr_size = data_block_builder_->CurrentSizeEstimate();
|
|
60
60
|
auto estimated_size_after =
|
|
61
|
-
data_block_builder_
|
|
61
|
+
data_block_builder_->EstimateSizeAfterKV(key, value);
|
|
62
62
|
|
|
63
63
|
if (align_) {
|
|
64
64
|
estimated_size_after += BlockBasedTable::kBlockTrailerSize;
|
|
@@ -72,7 +72,6 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
|
|
|
72
72
|
const uint64_t block_size_;
|
|
73
73
|
const uint64_t block_size_deviation_limit_;
|
|
74
74
|
const bool align_;
|
|
75
|
-
const BlockBuilder& data_block_builder_;
|
|
76
75
|
};
|
|
77
76
|
|
|
78
77
|
FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
|
|
@@ -83,10 +82,18 @@ FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
|
|
|
83
82
|
table_options.block_align, data_block_builder);
|
|
84
83
|
}
|
|
85
84
|
|
|
85
|
+
std::unique_ptr<RetargetableFlushBlockPolicy> NewFlushBlockBySizePolicy(
|
|
86
|
+
const uint64_t size, const int deviation,
|
|
87
|
+
const BlockBuilder& data_block_builder) {
|
|
88
|
+
return std::make_unique<FlushBlockBySizePolicy>(size, deviation, false,
|
|
89
|
+
data_block_builder);
|
|
90
|
+
}
|
|
91
|
+
|
|
86
92
|
FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
|
|
87
93
|
const uint64_t size, const int deviation,
|
|
88
94
|
const BlockBuilder& data_block_builder) {
|
|
89
|
-
return
|
|
95
|
+
return NewFlushBlockBySizePolicy(size, deviation, data_block_builder)
|
|
96
|
+
.release();
|
|
90
97
|
}
|
|
91
98
|
|
|
92
99
|
static int RegisterFlushBlockPolicyFactories(ObjectLibrary& library,
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
|
|
6
|
+
#pragma once
|
|
6
7
|
#include "rocksdb/flush_block_policy.h"
|
|
7
8
|
|
|
8
9
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -37,4 +38,23 @@ class FlushBlockEveryKeyPolicyFactory : public FlushBlockPolicyFactory {
|
|
|
37
38
|
}
|
|
38
39
|
};
|
|
39
40
|
|
|
41
|
+
// For internal use, policy that is stateless after creation, meaning it can
|
|
42
|
+
// be safely re-targeted to another block builder.
|
|
43
|
+
class RetargetableFlushBlockPolicy : public FlushBlockPolicy {
|
|
44
|
+
public:
|
|
45
|
+
explicit RetargetableFlushBlockPolicy(const BlockBuilder& data_block_builder)
|
|
46
|
+
: data_block_builder_(&data_block_builder) {}
|
|
47
|
+
|
|
48
|
+
void Retarget(const BlockBuilder& data_block_builder) {
|
|
49
|
+
data_block_builder_ = &data_block_builder;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected:
|
|
53
|
+
const BlockBuilder* data_block_builder_;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
std::unique_ptr<RetargetableFlushBlockPolicy> NewFlushBlockBySizePolicy(
|
|
57
|
+
const uint64_t size, const int deviation,
|
|
58
|
+
const BlockBuilder& data_block_builder);
|
|
59
|
+
|
|
40
60
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -152,32 +152,43 @@ PartitionedIndexBuilder::PartitionedIndexBuilder(
|
|
|
152
152
|
// sub_index_builder. Otherwise, it could be set to true even one of the
|
|
153
153
|
// sub_index_builders could not safely exclude seq from the keys, then it
|
|
154
154
|
// wil be enforced on all sub_index_builders on ::Finish.
|
|
155
|
-
|
|
156
|
-
use_value_delta_encoding_(use_value_delta_encoding) {
|
|
155
|
+
must_use_separator_with_seq_(false),
|
|
156
|
+
use_value_delta_encoding_(use_value_delta_encoding) {
|
|
157
|
+
MakeNewSubIndexBuilder();
|
|
158
|
+
}
|
|
157
159
|
|
|
158
160
|
void PartitionedIndexBuilder::MakeNewSubIndexBuilder() {
|
|
159
|
-
|
|
160
|
-
sub_index_builder_ = std::make_unique<ShortenedIndexBuilder>(
|
|
161
|
+
auto new_builder = std::make_unique<ShortenedIndexBuilder>(
|
|
161
162
|
comparator_, table_opt_.index_block_restart_interval,
|
|
162
163
|
table_opt_.format_version, use_value_delta_encoding_,
|
|
163
164
|
table_opt_.index_shortening, /* include_first_key */ false, ts_sz_,
|
|
164
165
|
persist_user_defined_timestamps_);
|
|
166
|
+
sub_index_builder_ = new_builder.get();
|
|
167
|
+
// Start next partition entry, where we will modify the key
|
|
168
|
+
entries_.push_back({{}, std::move(new_builder)});
|
|
165
169
|
|
|
166
|
-
|
|
167
|
-
//
|
|
170
|
+
BlockBuilder* builder_to_monitor;
|
|
171
|
+
// Set sub_index_builder_->must_use_separator_with_seq_ to true if
|
|
172
|
+
// must_use_separator_with_seq_ is true (internal-key mode) (set to false by
|
|
168
173
|
// default on Creation) so that flush policy can point to
|
|
169
174
|
// sub_index_builder_->index_block_builder_
|
|
170
|
-
if (
|
|
171
|
-
sub_index_builder_->
|
|
175
|
+
if (must_use_separator_with_seq_) {
|
|
176
|
+
sub_index_builder_->must_use_separator_with_seq_ = true;
|
|
177
|
+
builder_to_monitor = &sub_index_builder_->index_block_builder_;
|
|
178
|
+
} else {
|
|
179
|
+
builder_to_monitor = &sub_index_builder_->index_block_builder_without_seq_;
|
|
172
180
|
}
|
|
173
181
|
|
|
174
|
-
flush_policy_
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
182
|
+
if (flush_policy_ == nullptr) {
|
|
183
|
+
// Note: some partitions could be sub-optimal since sub_index_builder_
|
|
184
|
+
// could later reset must_use_separator_with_seq_ but the probability and
|
|
185
|
+
// impact of that are low.
|
|
186
|
+
flush_policy_ = NewFlushBlockBySizePolicy(table_opt_.metadata_block_size,
|
|
187
|
+
table_opt_.block_size_deviation,
|
|
188
|
+
*builder_to_monitor);
|
|
189
|
+
} else {
|
|
190
|
+
flush_policy_->Retarget(*builder_to_monitor);
|
|
191
|
+
}
|
|
181
192
|
partition_cut_requested_ = false;
|
|
182
193
|
}
|
|
183
194
|
|
|
@@ -185,101 +196,117 @@ void PartitionedIndexBuilder::RequestPartitionCut() {
|
|
|
185
196
|
partition_cut_requested_ = true;
|
|
186
197
|
}
|
|
187
198
|
|
|
199
|
+
std::unique_ptr<IndexBuilder::PreparedIndexEntry>
|
|
200
|
+
PartitionedIndexBuilder::CreatePreparedIndexEntry() {
|
|
201
|
+
// Fortunately, for ShortenedIndexBuilder, we can prepare an entry from one
|
|
202
|
+
// similarly configured builder and finish it at another.
|
|
203
|
+
return entries_.front().value->CreatePreparedIndexEntry();
|
|
204
|
+
}
|
|
205
|
+
void PartitionedIndexBuilder::PrepareIndexEntry(
|
|
206
|
+
const Slice& last_key_in_current_block,
|
|
207
|
+
const Slice* first_key_in_next_block, PreparedIndexEntry* out) {
|
|
208
|
+
// Fortunately, for ShortenedIndexBuilder, we can prepare an entry from one
|
|
209
|
+
// similarly configured builder and finish it at another. We just have to
|
|
210
|
+
// keep in mind that this first sub builder keeps track of the original
|
|
211
|
+
// must_use_separator_with_seq_ in the pipeline that is then propagated.
|
|
212
|
+
return entries_.front().value->PrepareIndexEntry(
|
|
213
|
+
last_key_in_current_block, first_key_in_next_block, out);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
void PartitionedIndexBuilder::MaybeFlush(const Slice& index_key,
|
|
217
|
+
const BlockHandle& index_value) {
|
|
218
|
+
bool do_flush = !sub_index_builder_->index_block_builder_.empty() &&
|
|
219
|
+
(partition_cut_requested_ ||
|
|
220
|
+
flush_policy_->Update(
|
|
221
|
+
index_key, EncodedBlockHandle(index_value).AsSlice()));
|
|
222
|
+
if (do_flush) {
|
|
223
|
+
assert(entries_.back().value.get() == sub_index_builder_);
|
|
224
|
+
cut_filter_block = true;
|
|
225
|
+
MakeNewSubIndexBuilder();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
void PartitionedIndexBuilder::FinishIndexEntry(const BlockHandle& block_handle,
|
|
230
|
+
PreparedIndexEntry* base_entry) {
|
|
231
|
+
using SPIE = ShortenedIndexBuilder::ShortenedPreparedIndexEntry;
|
|
232
|
+
SPIE* entry = static_cast<SPIE*>(base_entry);
|
|
233
|
+
|
|
234
|
+
MaybeFlush(entry->separator_with_seq, block_handle);
|
|
235
|
+
|
|
236
|
+
sub_index_builder_->FinishIndexEntry(block_handle, base_entry);
|
|
237
|
+
std::swap(entries_.back().key, entry->separator_with_seq);
|
|
238
|
+
|
|
239
|
+
if (!must_use_separator_with_seq_ && entry->must_use_separator_with_seq) {
|
|
240
|
+
// We need to apply !must_use_separator_with_seq to all sub-index builders
|
|
241
|
+
must_use_separator_with_seq_ = true;
|
|
242
|
+
flush_policy_->Retarget(sub_index_builder_->index_block_builder_);
|
|
243
|
+
}
|
|
244
|
+
// NOTE: not compatible with coupled partitioned filters so don't need to
|
|
245
|
+
// cut_filter_block
|
|
246
|
+
}
|
|
247
|
+
|
|
188
248
|
Slice PartitionedIndexBuilder::AddIndexEntry(
|
|
189
249
|
const Slice& last_key_in_current_block,
|
|
190
250
|
const Slice* first_key_in_next_block, const BlockHandle& block_handle,
|
|
191
251
|
std::string* separator_scratch) {
|
|
192
|
-
//
|
|
193
|
-
//
|
|
194
|
-
if (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
entries_.back().key.assign(sep.data(), sep.size());
|
|
213
|
-
assert(entries_.back().value == nullptr);
|
|
214
|
-
std::swap(entries_.back().value, sub_index_builder_);
|
|
252
|
+
// At least when running without parallel compression, maintain behavior of
|
|
253
|
+
// avoiding a last index partition with just one entry
|
|
254
|
+
if (first_key_in_next_block) {
|
|
255
|
+
MaybeFlush(last_key_in_current_block, block_handle);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
auto sep = sub_index_builder_->AddIndexEntry(last_key_in_current_block,
|
|
259
|
+
first_key_in_next_block,
|
|
260
|
+
block_handle, separator_scratch);
|
|
261
|
+
entries_.back().key.assign(sep.data(), sep.size());
|
|
262
|
+
|
|
263
|
+
if (!must_use_separator_with_seq_ &&
|
|
264
|
+
sub_index_builder_->must_use_separator_with_seq_) {
|
|
265
|
+
// We need to apply !must_use_separator_with_seq to all sub-index builders
|
|
266
|
+
must_use_separator_with_seq_ = true;
|
|
267
|
+
flush_policy_->Retarget(sub_index_builder_->index_block_builder_);
|
|
268
|
+
}
|
|
269
|
+
if (UNLIKELY(first_key_in_next_block == nullptr)) {
|
|
270
|
+
// no more keys
|
|
215
271
|
cut_filter_block = true;
|
|
216
|
-
return sep;
|
|
217
|
-
} else {
|
|
218
|
-
// apply flush policy only to non-empty sub_index_builder_
|
|
219
|
-
if (sub_index_builder_ != nullptr) {
|
|
220
|
-
std::string handle_encoding;
|
|
221
|
-
block_handle.EncodeTo(&handle_encoding);
|
|
222
|
-
bool do_flush =
|
|
223
|
-
partition_cut_requested_ ||
|
|
224
|
-
flush_policy_->Update(last_key_in_current_block, handle_encoding);
|
|
225
|
-
if (do_flush) {
|
|
226
|
-
assert(entries_.back().value == nullptr);
|
|
227
|
-
std::swap(entries_.back().value, sub_index_builder_);
|
|
228
|
-
cut_filter_block = true;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (sub_index_builder_ == nullptr) {
|
|
232
|
-
MakeNewSubIndexBuilder();
|
|
233
|
-
// Reserve next partition entry, where we will modify the key and
|
|
234
|
-
// eventually set the value
|
|
235
|
-
entries_.push_back({{}, {}});
|
|
236
|
-
}
|
|
237
|
-
auto sep = sub_index_builder_->AddIndexEntry(
|
|
238
|
-
last_key_in_current_block, first_key_in_next_block, block_handle,
|
|
239
|
-
separator_scratch);
|
|
240
|
-
entries_.back().key.assign(sep.data(), sep.size());
|
|
241
|
-
if (!seperator_is_key_plus_seq_ &&
|
|
242
|
-
sub_index_builder_->seperator_is_key_plus_seq_) {
|
|
243
|
-
// We need to apply !seperator_is_key_plus_seq to all sub-index builders
|
|
244
|
-
seperator_is_key_plus_seq_ = true;
|
|
245
|
-
// And use a flush_policy with the appropriate builder
|
|
246
|
-
flush_policy_.reset(FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
|
|
247
|
-
table_opt_.metadata_block_size, table_opt_.block_size_deviation,
|
|
248
|
-
sub_index_builder_->index_block_builder_));
|
|
249
|
-
}
|
|
250
|
-
return sep;
|
|
251
272
|
}
|
|
273
|
+
return sep;
|
|
252
274
|
}
|
|
253
275
|
|
|
254
276
|
Status PartitionedIndexBuilder::Finish(
|
|
255
277
|
IndexBlocks* index_blocks, const BlockHandle& last_partition_block_handle) {
|
|
256
278
|
if (partition_cnt_ == 0) {
|
|
257
|
-
|
|
279
|
+
sub_index_builder_ = nullptr;
|
|
280
|
+
if (!entries_.empty()) {
|
|
281
|
+
// Remove the last entry if it is empty
|
|
282
|
+
if (entries_.back().value->index_block_builder_.empty()) {
|
|
283
|
+
assert(entries_.back().key.empty());
|
|
284
|
+
entries_.pop_back();
|
|
285
|
+
}
|
|
286
|
+
partition_cnt_ = entries_.size();
|
|
287
|
+
}
|
|
258
288
|
}
|
|
259
|
-
|
|
260
|
-
assert(sub_index_builder_ == nullptr);
|
|
261
|
-
if (finishing_indexes == true) {
|
|
289
|
+
if (finishing_indexes_ == true) {
|
|
262
290
|
Entry& last_entry = entries_.front();
|
|
263
|
-
|
|
264
|
-
last_partition_block_handle.EncodeTo(&handle_encoding);
|
|
291
|
+
EncodedBlockHandle handle_encoding(last_partition_block_handle);
|
|
265
292
|
std::string handle_delta_encoding;
|
|
266
293
|
PutVarsignedint64(
|
|
267
294
|
&handle_delta_encoding,
|
|
268
295
|
last_partition_block_handle.size() - last_encoded_handle_.size());
|
|
269
296
|
last_encoded_handle_ = last_partition_block_handle;
|
|
270
297
|
const Slice handle_delta_encoding_slice(handle_delta_encoding);
|
|
271
|
-
index_block_builder_.Add(last_entry.key, handle_encoding,
|
|
298
|
+
index_block_builder_.Add(last_entry.key, handle_encoding.AsSlice(),
|
|
272
299
|
&handle_delta_encoding_slice);
|
|
273
|
-
if (!
|
|
300
|
+
if (!must_use_separator_with_seq_) {
|
|
274
301
|
index_block_builder_without_seq_.Add(ExtractUserKey(last_entry.key),
|
|
275
|
-
handle_encoding,
|
|
302
|
+
handle_encoding.AsSlice(),
|
|
276
303
|
&handle_delta_encoding_slice);
|
|
277
304
|
}
|
|
278
305
|
entries_.pop_front();
|
|
279
306
|
}
|
|
280
307
|
// If there is no sub_index left, then return the 2nd level index.
|
|
281
308
|
if (UNLIKELY(entries_.empty())) {
|
|
282
|
-
if (
|
|
309
|
+
if (must_use_separator_with_seq_) {
|
|
283
310
|
index_blocks->index_block_contents = index_block_builder_.Finish();
|
|
284
311
|
} else {
|
|
285
312
|
index_blocks->index_block_contents =
|
|
@@ -293,10 +320,10 @@ Status PartitionedIndexBuilder::Finish(
|
|
|
293
320
|
// expect more calls to Finish
|
|
294
321
|
Entry& entry = entries_.front();
|
|
295
322
|
// Apply the policy to all sub-indexes
|
|
296
|
-
entry.value->
|
|
323
|
+
entry.value->must_use_separator_with_seq_ = must_use_separator_with_seq_;
|
|
297
324
|
auto s = entry.value->Finish(index_blocks);
|
|
298
325
|
index_size_ += index_blocks->index_block_contents.size();
|
|
299
|
-
|
|
326
|
+
finishing_indexes_ = true;
|
|
300
327
|
return s.ok() ? Status::Incomplete() : s;
|
|
301
328
|
}
|
|
302
329
|
}
|