@nxtedition/rocksdb 8.1.4 → 8.1.6
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/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
- package/deps/rocksdb/rocksdb/Makefile +15 -3
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
- package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +15 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
- package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
- package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
- package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +6 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
- package/package.json +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
|
@@ -49,6 +49,9 @@
|
|
|
49
49
|
#include "util/string_util.h"
|
|
50
50
|
#include "utilities/merge_operators.h"
|
|
51
51
|
|
|
52
|
+
// In case defined by Windows headers
|
|
53
|
+
#undef small
|
|
54
|
+
|
|
52
55
|
namespace ROCKSDB_NAMESPACE {
|
|
53
56
|
class MockEnv;
|
|
54
57
|
|
|
@@ -870,17 +873,34 @@ class FlushCounterListener : public EventListener {
|
|
|
870
873
|
#endif
|
|
871
874
|
|
|
872
875
|
// A test merge operator mimics put but also fails if one of merge operands is
|
|
873
|
-
// "corrupted".
|
|
876
|
+
// "corrupted", "corrupted_try_merge", or "corrupted_must_merge".
|
|
874
877
|
class TestPutOperator : public MergeOperator {
|
|
875
878
|
public:
|
|
876
879
|
virtual bool FullMergeV2(const MergeOperationInput& merge_in,
|
|
877
880
|
MergeOperationOutput* merge_out) const override {
|
|
881
|
+
static const std::map<std::string, MergeOperator::OpFailureScope>
|
|
882
|
+
bad_operand_to_op_failure_scope = {
|
|
883
|
+
{"corrupted", MergeOperator::OpFailureScope::kDefault},
|
|
884
|
+
{"corrupted_try_merge", MergeOperator::OpFailureScope::kTryMerge},
|
|
885
|
+
{"corrupted_must_merge",
|
|
886
|
+
MergeOperator::OpFailureScope::kMustMerge}};
|
|
887
|
+
auto check_operand =
|
|
888
|
+
[](Slice operand_val,
|
|
889
|
+
MergeOperator::OpFailureScope* op_failure_scope) -> bool {
|
|
890
|
+
auto iter = bad_operand_to_op_failure_scope.find(operand_val.ToString());
|
|
891
|
+
if (iter != bad_operand_to_op_failure_scope.end()) {
|
|
892
|
+
*op_failure_scope = iter->second;
|
|
893
|
+
return false;
|
|
894
|
+
}
|
|
895
|
+
return true;
|
|
896
|
+
};
|
|
878
897
|
if (merge_in.existing_value != nullptr &&
|
|
879
|
-
*
|
|
898
|
+
!check_operand(*merge_in.existing_value,
|
|
899
|
+
&merge_out->op_failure_scope)) {
|
|
880
900
|
return false;
|
|
881
901
|
}
|
|
882
902
|
for (auto value : merge_in.operand_list) {
|
|
883
|
-
if (value
|
|
903
|
+
if (!check_operand(value, &merge_out->op_failure_scope)) {
|
|
884
904
|
return false;
|
|
885
905
|
}
|
|
886
906
|
}
|
|
@@ -900,17 +920,18 @@ class CacheWrapper : public Cache {
|
|
|
900
920
|
|
|
901
921
|
const char* Name() const override { return target_->Name(); }
|
|
902
922
|
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
void (*deleter)(const Slice& key, void* value),
|
|
923
|
+
Status Insert(const Slice& key, ObjectPtr value,
|
|
924
|
+
const CacheItemHelper* helper, size_t charge,
|
|
906
925
|
Handle** handle = nullptr,
|
|
907
926
|
Priority priority = Priority::LOW) override {
|
|
908
|
-
return target_->Insert(key, value,
|
|
927
|
+
return target_->Insert(key, value, helper, charge, handle, priority);
|
|
909
928
|
}
|
|
910
929
|
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
930
|
+
Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
|
|
931
|
+
CreateContext* create_context,
|
|
932
|
+
Priority priority = Priority::LOW, bool wait = true,
|
|
933
|
+
Statistics* stats = nullptr) override {
|
|
934
|
+
return target_->Lookup(key, helper, create_context, priority, wait, stats);
|
|
914
935
|
}
|
|
915
936
|
|
|
916
937
|
bool Ref(Handle* handle) override { return target_->Ref(handle); }
|
|
@@ -920,7 +941,7 @@ class CacheWrapper : public Cache {
|
|
|
920
941
|
return target_->Release(handle, erase_if_last_ref);
|
|
921
942
|
}
|
|
922
943
|
|
|
923
|
-
|
|
944
|
+
ObjectPtr Value(Handle* handle) override { return target_->Value(handle); }
|
|
924
945
|
|
|
925
946
|
void Erase(const Slice& key) override { target_->Erase(key); }
|
|
926
947
|
uint64_t NewId() override { return target_->NewId(); }
|
|
@@ -949,18 +970,13 @@ class CacheWrapper : public Cache {
|
|
|
949
970
|
return target_->GetCharge(handle);
|
|
950
971
|
}
|
|
951
972
|
|
|
952
|
-
|
|
953
|
-
return target_->
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
|
|
957
|
-
bool thread_safe) override {
|
|
958
|
-
target_->ApplyToAllCacheEntries(callback, thread_safe);
|
|
973
|
+
const CacheItemHelper* GetCacheItemHelper(Handle* handle) const override {
|
|
974
|
+
return target_->GetCacheItemHelper(handle);
|
|
959
975
|
}
|
|
960
976
|
|
|
961
977
|
void ApplyToAllEntries(
|
|
962
|
-
const std::function<void(const Slice& key,
|
|
963
|
-
|
|
978
|
+
const std::function<void(const Slice& key, ObjectPtr value, size_t charge,
|
|
979
|
+
const CacheItemHelper* helper)>& callback,
|
|
964
980
|
const ApplyToAllEntriesOptions& opts) override {
|
|
965
981
|
target_->ApplyToAllEntries(callback, opts);
|
|
966
982
|
}
|
|
@@ -988,9 +1004,8 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
|
|
|
988
1004
|
public:
|
|
989
1005
|
explicit TargetCacheChargeTrackingCache(std::shared_ptr<Cache> target);
|
|
990
1006
|
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
void (*deleter)(const Slice& key, void* value),
|
|
1007
|
+
Status Insert(const Slice& key, ObjectPtr value,
|
|
1008
|
+
const CacheItemHelper* helper, size_t charge,
|
|
994
1009
|
Handle** handle = nullptr,
|
|
995
1010
|
Priority priority = Priority::LOW) override;
|
|
996
1011
|
|
|
@@ -1006,7 +1021,7 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
|
|
|
1006
1021
|
}
|
|
1007
1022
|
|
|
1008
1023
|
private:
|
|
1009
|
-
static const Cache::
|
|
1024
|
+
static const Cache::CacheItemHelper* kCrmHelper;
|
|
1010
1025
|
|
|
1011
1026
|
std::size_t cur_cache_charge_;
|
|
1012
1027
|
std::size_t cache_charge_peak_;
|
|
@@ -610,6 +610,52 @@ TEST_F(DBWALTest, WALWithChecksumHandoff) {
|
|
|
610
610
|
#endif // ROCKSDB_ASSERT_STATUS_CHECKED
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
+
#ifndef ROCKSDB_LITE
|
|
614
|
+
TEST_F(DBWALTest, LockWal) {
|
|
615
|
+
do {
|
|
616
|
+
Options options = CurrentOptions();
|
|
617
|
+
options.create_if_missing = true;
|
|
618
|
+
DestroyAndReopen(options);
|
|
619
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
620
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
621
|
+
{{"DBWALTest::LockWal:AfterGetSortedWal",
|
|
622
|
+
"DBWALTest::LockWal:BeforeFlush:1"}});
|
|
623
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
624
|
+
|
|
625
|
+
ASSERT_OK(Put("foo", "v"));
|
|
626
|
+
ASSERT_OK(Put("bar", "v"));
|
|
627
|
+
port::Thread worker([&]() {
|
|
628
|
+
TEST_SYNC_POINT("DBWALTest::LockWal:BeforeFlush:1");
|
|
629
|
+
Status tmp_s = db_->Flush(FlushOptions());
|
|
630
|
+
ASSERT_OK(tmp_s);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
ASSERT_OK(db_->LockWAL());
|
|
634
|
+
// Verify writes are stopped
|
|
635
|
+
WriteOptions wopts;
|
|
636
|
+
wopts.no_slowdown = true;
|
|
637
|
+
Status s = db_->Put(wopts, "foo", "dontcare");
|
|
638
|
+
ASSERT_TRUE(s.IsIncomplete());
|
|
639
|
+
{
|
|
640
|
+
VectorLogPtr wals;
|
|
641
|
+
ASSERT_OK(db_->GetSortedWalFiles(wals));
|
|
642
|
+
ASSERT_FALSE(wals.empty());
|
|
643
|
+
}
|
|
644
|
+
TEST_SYNC_POINT("DBWALTest::LockWal:AfterGetSortedWal");
|
|
645
|
+
FlushOptions flush_opts;
|
|
646
|
+
flush_opts.wait = false;
|
|
647
|
+
s = db_->Flush(flush_opts);
|
|
648
|
+
ASSERT_TRUE(s.IsTryAgain());
|
|
649
|
+
ASSERT_OK(db_->UnlockWAL());
|
|
650
|
+
ASSERT_OK(db_->Put(WriteOptions(), "foo", "dontcare"));
|
|
651
|
+
|
|
652
|
+
worker.join();
|
|
653
|
+
|
|
654
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
655
|
+
} while (ChangeWalOptions());
|
|
656
|
+
}
|
|
657
|
+
#endif //! ROCKSDB_LITE
|
|
658
|
+
|
|
613
659
|
class DBRecoveryTestBlobError
|
|
614
660
|
: public DBWALTest,
|
|
615
661
|
public testing::WithParamInterface<std::string> {
|
|
@@ -1599,6 +1645,89 @@ TEST_F(DBWALTest, RaceInstallFlushResultsWithWalObsoletion) {
|
|
|
1599
1645
|
delete db1;
|
|
1600
1646
|
}
|
|
1601
1647
|
|
|
1648
|
+
TEST_F(DBWALTest, FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL) {
|
|
1649
|
+
Options options = CurrentOptions();
|
|
1650
|
+
options.track_and_verify_wals_in_manifest = true;
|
|
1651
|
+
DestroyAndReopen(options);
|
|
1652
|
+
|
|
1653
|
+
// Accumulate memtable m1 and create the 1st wal (i.e, 4.log)
|
|
1654
|
+
ASSERT_OK(Put(Key(1), ""));
|
|
1655
|
+
ASSERT_OK(Put(Key(2), ""));
|
|
1656
|
+
ASSERT_OK(Put(Key(3), ""));
|
|
1657
|
+
|
|
1658
|
+
const std::string wal_file_path = db_->GetName() + "/000004.log";
|
|
1659
|
+
|
|
1660
|
+
// Coerce the following sequence of events:
|
|
1661
|
+
// (1) Flush() marks 4.log to be obsoleted, 8.log to be the latest (i.e,
|
|
1662
|
+
// active) log and release the lock
|
|
1663
|
+
// (2) SyncWAL() proceeds with the lock. It
|
|
1664
|
+
// creates a new manifest and syncs all the inactive wals before the latest
|
|
1665
|
+
// (i.e, active log), which is 4.log. Note that SyncWAL() is not aware of the
|
|
1666
|
+
// fact that 4.log has marked as to be obseleted. Prior to the fix, such wal
|
|
1667
|
+
// sync will then add a WAL addition record of 4.log to the new manifest
|
|
1668
|
+
// without any special treatment.
|
|
1669
|
+
// (3) BackgroundFlush() will eventually purge 4.log.
|
|
1670
|
+
bool wal_synced = false;
|
|
1671
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1672
|
+
"FindObsoleteFiles::PostMutexUnlock", [&](void*) {
|
|
1673
|
+
ASSERT_OK(env_->FileExists(wal_file_path));
|
|
1674
|
+
|
|
1675
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1676
|
+
"VersionSet::ProcessManifestWrites:"
|
|
1677
|
+
"PostDecidingCreateNewManifestOrNot",
|
|
1678
|
+
[&](void* arg) {
|
|
1679
|
+
bool* new_descriptor_log = (bool*)arg;
|
|
1680
|
+
*new_descriptor_log = true;
|
|
1681
|
+
});
|
|
1682
|
+
|
|
1683
|
+
ASSERT_OK(db_->SyncWAL());
|
|
1684
|
+
wal_synced = true;
|
|
1685
|
+
});
|
|
1686
|
+
|
|
1687
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1688
|
+
"DBImpl::DeleteObsoleteFileImpl:AfterDeletion2", [&](void* arg) {
|
|
1689
|
+
std::string* file_name = (std::string*)arg;
|
|
1690
|
+
if (*file_name == wal_file_path) {
|
|
1691
|
+
TEST_SYNC_POINT(
|
|
1692
|
+
"DBWALTest::"
|
|
1693
|
+
"FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL::"
|
|
1694
|
+
"PostDeleteWAL");
|
|
1695
|
+
}
|
|
1696
|
+
});
|
|
1697
|
+
|
|
1698
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
1699
|
+
{{"DBImpl::BackgroundCallFlush:FilesFound",
|
|
1700
|
+
"PreConfrimObsoletedWALSynced"},
|
|
1701
|
+
{"DBWALTest::FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL::"
|
|
1702
|
+
"PostDeleteWAL",
|
|
1703
|
+
"PreConfrimWALDeleted"}});
|
|
1704
|
+
|
|
1705
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1706
|
+
|
|
1707
|
+
ASSERT_OK(Flush());
|
|
1708
|
+
|
|
1709
|
+
TEST_SYNC_POINT("PreConfrimObsoletedWALSynced");
|
|
1710
|
+
ASSERT_TRUE(wal_synced);
|
|
1711
|
+
|
|
1712
|
+
TEST_SYNC_POINT("PreConfrimWALDeleted");
|
|
1713
|
+
// BackgroundFlush() purged 4.log
|
|
1714
|
+
// because the memtable associated with the WAL was flushed and new WAL was
|
|
1715
|
+
// created (i.e, 8.log)
|
|
1716
|
+
ASSERT_TRUE(env_->FileExists(wal_file_path).IsNotFound());
|
|
1717
|
+
|
|
1718
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
1719
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1720
|
+
|
|
1721
|
+
// To verify the corruption of "Missing WAL with log number: 4" under
|
|
1722
|
+
// `options.track_and_verify_wals_in_manifest = true` is fixed.
|
|
1723
|
+
//
|
|
1724
|
+
// Before the fix, `db_->SyncWAL()` will sync and record WAL addtion of the
|
|
1725
|
+
// obseleted WAL 4.log in a new manifest without any special treament.
|
|
1726
|
+
// This will result in missing-wal corruption in DB::Reopen().
|
|
1727
|
+
Status s = TryReopen(options);
|
|
1728
|
+
EXPECT_OK(s);
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1602
1731
|
// Test scope:
|
|
1603
1732
|
// - We expect to open data store under all circumstances
|
|
1604
1733
|
// - We expect only data upto the point where the first error was encountered
|
|
@@ -3870,6 +3870,34 @@ TEST_F(DBBasicTestWithTimestamp, MergeAfterDeletion) {
|
|
|
3870
3870
|
|
|
3871
3871
|
Close();
|
|
3872
3872
|
}
|
|
3873
|
+
|
|
3874
|
+
TEST_F(DBBasicTestWithTimestamp, RangeTombstoneApproximateSize) {
|
|
3875
|
+
// Test code path for calculating range tombstone compensated size
|
|
3876
|
+
// during flush and compaction.
|
|
3877
|
+
Options options = CurrentOptions();
|
|
3878
|
+
const size_t kTimestampSize = Timestamp(0, 0).size();
|
|
3879
|
+
TestComparator test_cmp(kTimestampSize);
|
|
3880
|
+
options.comparator = &test_cmp;
|
|
3881
|
+
DestroyAndReopen(options);
|
|
3882
|
+
// So that the compaction below is non-bottommost and will calcualte
|
|
3883
|
+
// compensated range tombstone size.
|
|
3884
|
+
ASSERT_OK(db_->Put(WriteOptions(), Key(1), Timestamp(1, 0), "val"));
|
|
3885
|
+
ASSERT_OK(Flush());
|
|
3886
|
+
MoveFilesToLevel(5);
|
|
3887
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
|
|
3888
|
+
Key(1), Timestamp(1, 0)));
|
|
3889
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(1),
|
|
3890
|
+
Key(2), Timestamp(2, 0)));
|
|
3891
|
+
ASSERT_OK(Flush());
|
|
3892
|
+
ASSERT_OK(dbfull()->RunManualCompaction(
|
|
3893
|
+
static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
|
|
3894
|
+
->cfd(),
|
|
3895
|
+
0 /* input_level */, 1 /* output_level */, CompactRangeOptions(),
|
|
3896
|
+
nullptr /* begin */, nullptr /* end */, true /* exclusive */,
|
|
3897
|
+
true /* disallow_trivial_move */,
|
|
3898
|
+
std::numeric_limits<uint64_t>::max() /* max_file_num_to_ignore */,
|
|
3899
|
+
"" /*trim_ts*/));
|
|
3900
|
+
}
|
|
3873
3901
|
} // namespace ROCKSDB_NAMESPACE
|
|
3874
3902
|
|
|
3875
3903
|
int main(int argc, char** argv) {
|
|
@@ -323,6 +323,27 @@ TEST_F(TimestampCompatibleCompactionTest, CompactFilesRangeCheckL1) {
|
|
|
323
323
|
static_cast<int>(compaction_job_info.input_files.size()));
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
|
+
|
|
327
|
+
TEST_F(TimestampCompatibleCompactionTest, EmptyCompactionOutput) {
|
|
328
|
+
Options options = CurrentOptions();
|
|
329
|
+
options.env = env_;
|
|
330
|
+
options.comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
331
|
+
DestroyAndReopen(options);
|
|
332
|
+
|
|
333
|
+
std::string ts_str = Timestamp(1);
|
|
334
|
+
WriteOptions wopts;
|
|
335
|
+
ASSERT_OK(
|
|
336
|
+
db_->DeleteRange(wopts, db_->DefaultColumnFamily(), "k1", "k3", ts_str));
|
|
337
|
+
ASSERT_OK(Flush());
|
|
338
|
+
|
|
339
|
+
ts_str = Timestamp(3);
|
|
340
|
+
Slice ts = ts_str;
|
|
341
|
+
CompactRangeOptions cro;
|
|
342
|
+
// range tombstone will be dropped during compaction
|
|
343
|
+
cro.full_history_ts_low = &ts;
|
|
344
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
345
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
346
|
+
}
|
|
326
347
|
#endif // !ROCKSDB_LITE
|
|
327
348
|
|
|
328
349
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -150,6 +150,31 @@ int InternalKeyComparator::Compare(const ParsedInternalKey& a,
|
|
|
150
150
|
return r;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
int InternalKeyComparator::Compare(const Slice& a,
|
|
154
|
+
const ParsedInternalKey& b) const {
|
|
155
|
+
// Order by:
|
|
156
|
+
// increasing user key (according to user-supplied comparator)
|
|
157
|
+
// decreasing sequence number
|
|
158
|
+
// decreasing type (though sequence# should be enough to disambiguate)
|
|
159
|
+
int r = user_comparator_.Compare(ExtractUserKey(a), b.user_key);
|
|
160
|
+
if (r == 0) {
|
|
161
|
+
const uint64_t anum =
|
|
162
|
+
DecodeFixed64(a.data() + a.size() - kNumInternalBytes);
|
|
163
|
+
const uint64_t bnum = (b.sequence << 8) | b.type;
|
|
164
|
+
if (anum > bnum) {
|
|
165
|
+
r = -1;
|
|
166
|
+
} else if (anum < bnum) {
|
|
167
|
+
r = +1;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return r;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
int InternalKeyComparator::Compare(const ParsedInternalKey& a,
|
|
174
|
+
const Slice& b) const {
|
|
175
|
+
return -Compare(b, a);
|
|
176
|
+
}
|
|
177
|
+
|
|
153
178
|
LookupKey::LookupKey(const Slice& _user_key, SequenceNumber s,
|
|
154
179
|
const Slice* ts) {
|
|
155
180
|
size_t usize = _user_key.size();
|
|
@@ -283,6 +283,8 @@ class InternalKeyComparator
|
|
|
283
283
|
|
|
284
284
|
int Compare(const InternalKey& a, const InternalKey& b) const;
|
|
285
285
|
int Compare(const ParsedInternalKey& a, const ParsedInternalKey& b) const;
|
|
286
|
+
int Compare(const Slice& a, const ParsedInternalKey& b) const;
|
|
287
|
+
int Compare(const ParsedInternalKey& a, const Slice& b) const;
|
|
286
288
|
// In this `Compare()` overload, the sequence numbers provided in
|
|
287
289
|
// `a_global_seqno` and `b_global_seqno` override the sequence numbers in `a`
|
|
288
290
|
// and `b`, respectively. To disable sequence number override(s), provide the
|
|
@@ -112,8 +112,9 @@ Status UpdateManifestForFilesState(
|
|
|
112
112
|
lf->smallest, lf->largest, lf->fd.smallest_seqno,
|
|
113
113
|
lf->fd.largest_seqno, lf->marked_for_compaction, temp,
|
|
114
114
|
lf->oldest_blob_file_number, lf->oldest_ancester_time,
|
|
115
|
-
lf->file_creation_time, lf->file_checksum,
|
|
116
|
-
lf->file_checksum_func_name, lf->unique_id
|
|
115
|
+
lf->file_creation_time, lf->epoch_number, lf->file_checksum,
|
|
116
|
+
lf->file_checksum_func_name, lf->unique_id,
|
|
117
|
+
lf->compensated_range_deletion_size);
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
120
|
} else {
|
|
@@ -694,6 +694,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithGlobalSeqnoPickedSeqno) {
|
|
|
694
694
|
bool verify_checksums_before_ingest = std::get<1>(GetParam());
|
|
695
695
|
do {
|
|
696
696
|
Options options = CurrentOptions();
|
|
697
|
+
options.disable_auto_compactions = true;
|
|
697
698
|
DestroyAndReopen(options);
|
|
698
699
|
std::map<std::string, std::string> true_data;
|
|
699
700
|
|
|
@@ -800,6 +801,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithMultipleValueType) {
|
|
|
800
801
|
bool verify_checksums_before_ingest = std::get<1>(GetParam());
|
|
801
802
|
do {
|
|
802
803
|
Options options = CurrentOptions();
|
|
804
|
+
options.disable_auto_compactions = true;
|
|
803
805
|
options.merge_operator.reset(new TestPutOperator());
|
|
804
806
|
DestroyAndReopen(options);
|
|
805
807
|
std::map<std::string, std::string> true_data;
|
|
@@ -927,6 +929,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithMixedValueType) {
|
|
|
927
929
|
bool verify_checksums_before_ingest = std::get<1>(GetParam());
|
|
928
930
|
do {
|
|
929
931
|
Options options = CurrentOptions();
|
|
932
|
+
options.disable_auto_compactions = true;
|
|
930
933
|
options.merge_operator.reset(new TestPutOperator());
|
|
931
934
|
DestroyAndReopen(options);
|
|
932
935
|
std::map<std::string, std::string> true_data;
|
|
@@ -469,14 +469,90 @@ Status ExternalSstFileIngestionJob::Run() {
|
|
|
469
469
|
f.fd.GetNumber(), f.fd.GetPathId(), f.fd.GetFileSize(),
|
|
470
470
|
f.smallest_internal_key, f.largest_internal_key, f.assigned_seqno,
|
|
471
471
|
f.assigned_seqno, false, f.file_temperature, kInvalidBlobFileNumber,
|
|
472
|
-
oldest_ancester_time, current_time,
|
|
473
|
-
|
|
472
|
+
oldest_ancester_time, current_time,
|
|
473
|
+
ingestion_options_.ingest_behind
|
|
474
|
+
? kReservedEpochNumberForFileIngestedBehind
|
|
475
|
+
: cfd_->NewEpochNumber(),
|
|
476
|
+
f.file_checksum, f.file_checksum_func_name, f.unique_id, 0);
|
|
474
477
|
f_metadata.temperature = f.file_temperature;
|
|
475
478
|
edit_.AddFile(f.picked_level, f_metadata);
|
|
476
479
|
}
|
|
480
|
+
|
|
481
|
+
CreateEquivalentFileIngestingCompactions();
|
|
477
482
|
return status;
|
|
478
483
|
}
|
|
479
484
|
|
|
485
|
+
void ExternalSstFileIngestionJob::CreateEquivalentFileIngestingCompactions() {
|
|
486
|
+
// A map from output level to input of compactions equivalent to this
|
|
487
|
+
// ingestion job.
|
|
488
|
+
// TODO: simplify below logic to creating compaction per ingested file
|
|
489
|
+
// instead of per output level, once we figure out how to treat ingested files
|
|
490
|
+
// with adjacent range deletion tombstones to same output level in the same
|
|
491
|
+
// job as non-overlapping compactions.
|
|
492
|
+
std::map<int, CompactionInputFiles>
|
|
493
|
+
output_level_to_file_ingesting_compaction_input;
|
|
494
|
+
|
|
495
|
+
for (const auto& pair : edit_.GetNewFiles()) {
|
|
496
|
+
int output_level = pair.first;
|
|
497
|
+
const FileMetaData& f_metadata = pair.second;
|
|
498
|
+
|
|
499
|
+
CompactionInputFiles& input =
|
|
500
|
+
output_level_to_file_ingesting_compaction_input[output_level];
|
|
501
|
+
if (input.files.empty()) {
|
|
502
|
+
// Treat the source level of ingested files to be level 0
|
|
503
|
+
input.level = 0;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
compaction_input_metdatas_.push_back(new FileMetaData(f_metadata));
|
|
507
|
+
input.files.push_back(compaction_input_metdatas_.back());
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
for (const auto& pair : output_level_to_file_ingesting_compaction_input) {
|
|
511
|
+
int output_level = pair.first;
|
|
512
|
+
const CompactionInputFiles& input = pair.second;
|
|
513
|
+
|
|
514
|
+
const auto& mutable_cf_options = *(cfd_->GetLatestMutableCFOptions());
|
|
515
|
+
file_ingesting_compactions_.push_back(new Compaction(
|
|
516
|
+
cfd_->current()->storage_info(), *cfd_->ioptions(), mutable_cf_options,
|
|
517
|
+
mutable_db_options_, {input}, output_level,
|
|
518
|
+
MaxFileSizeForLevel(
|
|
519
|
+
mutable_cf_options, output_level,
|
|
520
|
+
cfd_->ioptions()->compaction_style) /* output file size
|
|
521
|
+
limit,
|
|
522
|
+
* not applicable
|
|
523
|
+
*/
|
|
524
|
+
,
|
|
525
|
+
LLONG_MAX /* max compaction bytes, not applicable */,
|
|
526
|
+
0 /* output path ID, not applicable */, mutable_cf_options.compression,
|
|
527
|
+
mutable_cf_options.compression_opts, Temperature::kUnknown,
|
|
528
|
+
0 /* max_subcompaction, not applicable */,
|
|
529
|
+
{} /* grandparents, not applicable */, false /* is manual */,
|
|
530
|
+
"" /* trim_ts */, -1 /* score, not applicable */,
|
|
531
|
+
false /* is deletion compaction, not applicable */,
|
|
532
|
+
files_overlap_ /* l0_files_might_overlap, not applicable */,
|
|
533
|
+
CompactionReason::kExternalSstIngestion));
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
void ExternalSstFileIngestionJob::RegisterRange() {
|
|
538
|
+
for (const auto& c : file_ingesting_compactions_) {
|
|
539
|
+
cfd_->compaction_picker()->RegisterCompaction(c);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
void ExternalSstFileIngestionJob::UnregisterRange() {
|
|
544
|
+
for (const auto& c : file_ingesting_compactions_) {
|
|
545
|
+
cfd_->compaction_picker()->UnregisterCompaction(c);
|
|
546
|
+
delete c;
|
|
547
|
+
}
|
|
548
|
+
file_ingesting_compactions_.clear();
|
|
549
|
+
|
|
550
|
+
for (const auto& f : compaction_input_metdatas_) {
|
|
551
|
+
delete f;
|
|
552
|
+
}
|
|
553
|
+
compaction_input_metdatas_.clear();
|
|
554
|
+
}
|
|
555
|
+
|
|
480
556
|
void ExternalSstFileIngestionJob::UpdateStats() {
|
|
481
557
|
// Update internal stats for new ingested files
|
|
482
558
|
uint64_t total_keys = 0;
|
|
@@ -795,8 +871,16 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
|
|
|
795
871
|
if (lvl > 0 && lvl < vstorage->base_level()) {
|
|
796
872
|
continue;
|
|
797
873
|
}
|
|
798
|
-
|
|
799
|
-
|
|
874
|
+
if (cfd_->RangeOverlapWithCompaction(
|
|
875
|
+
file_to_ingest->smallest_internal_key.user_key(),
|
|
876
|
+
file_to_ingest->largest_internal_key.user_key(), lvl)) {
|
|
877
|
+
// We must use L0 or any level higher than `lvl` to be able to overwrite
|
|
878
|
+
// the compaction output keys that we overlap with in this level, We also
|
|
879
|
+
// need to assign this file a seqno to overwrite the compaction output
|
|
880
|
+
// keys in level `lvl`
|
|
881
|
+
overlap_with_db = true;
|
|
882
|
+
break;
|
|
883
|
+
} else if (vstorage->NumLevelFiles(lvl) > 0) {
|
|
800
884
|
bool overlap_with_level = false;
|
|
801
885
|
status = sv->current->OverlapWithLevelIterator(
|
|
802
886
|
ro, env_options_, file_to_ingest->smallest_internal_key.user_key(),
|
|
@@ -853,6 +937,7 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
|
|
|
853
937
|
target_level < cfd_->NumberLevels() - 1) {
|
|
854
938
|
status = Status::TryAgain(
|
|
855
939
|
"Files cannot be ingested to Lmax. Please make sure key range of Lmax "
|
|
940
|
+
"and ongoing compaction's output to Lmax"
|
|
856
941
|
"does not overlap with files to ingest.");
|
|
857
942
|
return status;
|
|
858
943
|
}
|
|
@@ -870,7 +955,7 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
|
|
|
870
955
|
Status ExternalSstFileIngestionJob::CheckLevelForIngestedBehindFile(
|
|
871
956
|
IngestedFileInfo* file_to_ingest) {
|
|
872
957
|
auto* vstorage = cfd_->current()->storage_info();
|
|
873
|
-
//
|
|
958
|
+
// First, check if new files fit in the bottommost level
|
|
874
959
|
int bottom_lvl = cfd_->NumberLevels() - 1;
|
|
875
960
|
if (!IngestedFileFitInLevel(file_to_ingest, bottom_lvl)) {
|
|
876
961
|
return Status::InvalidArgument(
|
|
@@ -878,7 +963,7 @@ Status ExternalSstFileIngestionJob::CheckLevelForIngestedBehindFile(
|
|
|
878
963
|
"at the bottommost level!");
|
|
879
964
|
}
|
|
880
965
|
|
|
881
|
-
//
|
|
966
|
+
// Second, check if despite allow_ingest_behind=true we still have 0 seqnums
|
|
882
967
|
// at some upper level
|
|
883
968
|
for (int lvl = 0; lvl < cfd_->NumberLevels() - 1; lvl++) {
|
|
884
969
|
for (auto file : vstorage->LevelFiles(lvl)) {
|
|
@@ -994,14 +1079,8 @@ bool ExternalSstFileIngestionJob::IngestedFileFitInLevel(
|
|
|
994
1079
|
// add it to this level
|
|
995
1080
|
return false;
|
|
996
1081
|
}
|
|
997
|
-
if (cfd_->RangeOverlapWithCompaction(file_smallest_user_key,
|
|
998
|
-
file_largest_user_key, level)) {
|
|
999
|
-
// File overlap with a running compaction output that will be stored
|
|
1000
|
-
// in this level, we cannot add this file to this level
|
|
1001
|
-
return false;
|
|
1002
|
-
}
|
|
1003
1082
|
|
|
1004
|
-
// File did not overlap with level files,
|
|
1083
|
+
// File did not overlap with level files, nor compaction output
|
|
1005
1084
|
return true;
|
|
1006
1085
|
}
|
|
1007
1086
|
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
#include "db/column_family.h"
|
|
12
12
|
#include "db/internal_stats.h"
|
|
13
13
|
#include "db/snapshot_impl.h"
|
|
14
|
+
#include "db/version_edit.h"
|
|
14
15
|
#include "env/file_system_tracer.h"
|
|
15
16
|
#include "logging/event_logger.h"
|
|
16
17
|
#include "options/db_options.h"
|
|
@@ -78,7 +79,8 @@ class ExternalSstFileIngestionJob {
|
|
|
78
79
|
public:
|
|
79
80
|
ExternalSstFileIngestionJob(
|
|
80
81
|
VersionSet* versions, ColumnFamilyData* cfd,
|
|
81
|
-
const ImmutableDBOptions& db_options,
|
|
82
|
+
const ImmutableDBOptions& db_options,
|
|
83
|
+
const MutableDBOptions& mutable_db_options, const EnvOptions& env_options,
|
|
82
84
|
SnapshotList* db_snapshots,
|
|
83
85
|
const IngestExternalFileOptions& ingestion_options,
|
|
84
86
|
Directories* directories, EventLogger* event_logger,
|
|
@@ -88,6 +90,7 @@ class ExternalSstFileIngestionJob {
|
|
|
88
90
|
versions_(versions),
|
|
89
91
|
cfd_(cfd),
|
|
90
92
|
db_options_(db_options),
|
|
93
|
+
mutable_db_options_(mutable_db_options),
|
|
91
94
|
env_options_(env_options),
|
|
92
95
|
db_snapshots_(db_snapshots),
|
|
93
96
|
ingestion_options_(ingestion_options),
|
|
@@ -99,6 +102,17 @@ class ExternalSstFileIngestionJob {
|
|
|
99
102
|
assert(directories != nullptr);
|
|
100
103
|
}
|
|
101
104
|
|
|
105
|
+
~ExternalSstFileIngestionJob() {
|
|
106
|
+
for (const auto& c : file_ingesting_compactions_) {
|
|
107
|
+
cfd_->compaction_picker()->UnregisterCompaction(c);
|
|
108
|
+
delete c;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (const auto& f : compaction_input_metdatas_) {
|
|
112
|
+
delete f;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
102
116
|
// Prepare the job by copying external files into the DB.
|
|
103
117
|
Status Prepare(const std::vector<std::string>& external_files_paths,
|
|
104
118
|
const std::vector<std::string>& files_checksums,
|
|
@@ -120,6 +134,15 @@ class ExternalSstFileIngestionJob {
|
|
|
120
134
|
// REQUIRES: Mutex held
|
|
121
135
|
Status Run();
|
|
122
136
|
|
|
137
|
+
// Register key range involved in this ingestion job
|
|
138
|
+
// to prevent key range conflict with other ongoing compaction/file ingestion
|
|
139
|
+
// REQUIRES: Mutex held
|
|
140
|
+
void RegisterRange();
|
|
141
|
+
|
|
142
|
+
// Unregister key range registered for this ingestion job
|
|
143
|
+
// REQUIRES: Mutex held
|
|
144
|
+
void UnregisterRange();
|
|
145
|
+
|
|
123
146
|
// Update column family stats.
|
|
124
147
|
// REQUIRES: Mutex held
|
|
125
148
|
void UpdateStats();
|
|
@@ -175,11 +198,17 @@ class ExternalSstFileIngestionJob {
|
|
|
175
198
|
template <typename TWritableFile>
|
|
176
199
|
Status SyncIngestedFile(TWritableFile* file);
|
|
177
200
|
|
|
201
|
+
// Create equivalent `Compaction` objects to this file ingestion job
|
|
202
|
+
// , which will be used to check range conflict with other ongoing
|
|
203
|
+
// compactions.
|
|
204
|
+
void CreateEquivalentFileIngestingCompactions();
|
|
205
|
+
|
|
178
206
|
SystemClock* clock_;
|
|
179
207
|
FileSystemPtr fs_;
|
|
180
208
|
VersionSet* versions_;
|
|
181
209
|
ColumnFamilyData* cfd_;
|
|
182
210
|
const ImmutableDBOptions& db_options_;
|
|
211
|
+
const MutableDBOptions& mutable_db_options_;
|
|
183
212
|
const EnvOptions& env_options_;
|
|
184
213
|
SnapshotList* db_snapshots_;
|
|
185
214
|
autovector<IngestedFileInfo> files_to_ingest_;
|
|
@@ -196,6 +225,14 @@ class ExternalSstFileIngestionJob {
|
|
|
196
225
|
// file_checksum_gen_factory is set, DB will generate checksum each file.
|
|
197
226
|
bool need_generate_file_checksum_{true};
|
|
198
227
|
std::shared_ptr<IOTracer> io_tracer_;
|
|
228
|
+
|
|
229
|
+
// Below are variables used in (un)registering range for this ingestion job
|
|
230
|
+
//
|
|
231
|
+
// FileMetaData used in inputs of compactions equivalent to this ingestion
|
|
232
|
+
// job
|
|
233
|
+
std::vector<FileMetaData*> compaction_input_metdatas_;
|
|
234
|
+
// Compactions equivalent to this ingestion job
|
|
235
|
+
std::vector<Compaction*> file_ingesting_compactions_;
|
|
199
236
|
};
|
|
200
237
|
|
|
201
238
|
} // namespace ROCKSDB_NAMESPACE
|