@nxtedition/rocksdb 8.1.3 → 8.1.5
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 +13 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/TARGETS +4 -2
- 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_counting_iterator.h +0 -11
- 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 +17 -12
- package/deps/rocksdb/rocksdb/db/column_family.cc +0 -1
- package/deps/rocksdb/rocksdb/db/column_family.h +0 -6
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +0 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +0 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +28 -27
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +254 -139
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -5
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +0 -5
- 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_compaction_test.cc +125 -0
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +27 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -49
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +34 -24
- 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 +117 -210
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +36 -24
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +6 -6
- 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/history_trimming_iterator.h +0 -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 +30 -5
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -33
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- 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/version_builder.cc +12 -9
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -0
- package/deps/rocksdb/rocksdb/db/version_set.cc +20 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +358 -214
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- 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 +2 -1
- 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 +156 -223
- 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 +46 -18
- 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_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/format.h +1 -1
- 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 +92 -7
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +0 -80
- 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/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- 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/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 +52 -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/deps/rocksdb/rocksdb.gyp +0 -3
- package/index.js +2 -2
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +0 -142
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +0 -241
|
@@ -873,17 +873,34 @@ class FlushCounterListener : public EventListener {
|
|
|
873
873
|
#endif
|
|
874
874
|
|
|
875
875
|
// A test merge operator mimics put but also fails if one of merge operands is
|
|
876
|
-
// "corrupted".
|
|
876
|
+
// "corrupted", "corrupted_try_merge", or "corrupted_must_merge".
|
|
877
877
|
class TestPutOperator : public MergeOperator {
|
|
878
878
|
public:
|
|
879
879
|
virtual bool FullMergeV2(const MergeOperationInput& merge_in,
|
|
880
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
|
+
};
|
|
881
897
|
if (merge_in.existing_value != nullptr &&
|
|
882
|
-
*
|
|
898
|
+
!check_operand(*merge_in.existing_value,
|
|
899
|
+
&merge_out->op_failure_scope)) {
|
|
883
900
|
return false;
|
|
884
901
|
}
|
|
885
902
|
for (auto value : merge_in.operand_list) {
|
|
886
|
-
if (value
|
|
903
|
+
if (!check_operand(value, &merge_out->op_failure_scope)) {
|
|
887
904
|
return false;
|
|
888
905
|
}
|
|
889
906
|
}
|
|
@@ -903,17 +920,18 @@ class CacheWrapper : public Cache {
|
|
|
903
920
|
|
|
904
921
|
const char* Name() const override { return target_->Name(); }
|
|
905
922
|
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
void (*deleter)(const Slice& key, void* value),
|
|
923
|
+
Status Insert(const Slice& key, ObjectPtr value,
|
|
924
|
+
const CacheItemHelper* helper, size_t charge,
|
|
909
925
|
Handle** handle = nullptr,
|
|
910
926
|
Priority priority = Priority::LOW) override {
|
|
911
|
-
return target_->Insert(key, value,
|
|
927
|
+
return target_->Insert(key, value, helper, charge, handle, priority);
|
|
912
928
|
}
|
|
913
929
|
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
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);
|
|
917
935
|
}
|
|
918
936
|
|
|
919
937
|
bool Ref(Handle* handle) override { return target_->Ref(handle); }
|
|
@@ -923,7 +941,7 @@ class CacheWrapper : public Cache {
|
|
|
923
941
|
return target_->Release(handle, erase_if_last_ref);
|
|
924
942
|
}
|
|
925
943
|
|
|
926
|
-
|
|
944
|
+
ObjectPtr Value(Handle* handle) override { return target_->Value(handle); }
|
|
927
945
|
|
|
928
946
|
void Erase(const Slice& key) override { target_->Erase(key); }
|
|
929
947
|
uint64_t NewId() override { return target_->NewId(); }
|
|
@@ -952,18 +970,13 @@ class CacheWrapper : public Cache {
|
|
|
952
970
|
return target_->GetCharge(handle);
|
|
953
971
|
}
|
|
954
972
|
|
|
955
|
-
|
|
956
|
-
return target_->
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
|
|
960
|
-
bool thread_safe) override {
|
|
961
|
-
target_->ApplyToAllCacheEntries(callback, thread_safe);
|
|
973
|
+
const CacheItemHelper* GetCacheItemHelper(Handle* handle) const override {
|
|
974
|
+
return target_->GetCacheItemHelper(handle);
|
|
962
975
|
}
|
|
963
976
|
|
|
964
977
|
void ApplyToAllEntries(
|
|
965
|
-
const std::function<void(const Slice& key,
|
|
966
|
-
|
|
978
|
+
const std::function<void(const Slice& key, ObjectPtr value, size_t charge,
|
|
979
|
+
const CacheItemHelper* helper)>& callback,
|
|
967
980
|
const ApplyToAllEntriesOptions& opts) override {
|
|
968
981
|
target_->ApplyToAllEntries(callback, opts);
|
|
969
982
|
}
|
|
@@ -991,9 +1004,8 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
|
|
|
991
1004
|
public:
|
|
992
1005
|
explicit TargetCacheChargeTrackingCache(std::shared_ptr<Cache> target);
|
|
993
1006
|
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
void (*deleter)(const Slice& key, void* value),
|
|
1007
|
+
Status Insert(const Slice& key, ObjectPtr value,
|
|
1008
|
+
const CacheItemHelper* helper, size_t charge,
|
|
997
1009
|
Handle** handle = nullptr,
|
|
998
1010
|
Priority priority = Priority::LOW) override;
|
|
999
1011
|
|
|
@@ -1009,7 +1021,7 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
|
|
|
1009
1021
|
}
|
|
1010
1022
|
|
|
1011
1023
|
private:
|
|
1012
|
-
static const Cache::
|
|
1024
|
+
static const Cache::CacheItemHelper* kCrmHelper;
|
|
1013
1025
|
|
|
1014
1026
|
std::size_t cur_cache_charge_;
|
|
1015
1027
|
std::size_t cache_charge_peak_;
|
|
@@ -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) {
|
|
@@ -91,7 +91,7 @@ FlushJob::FlushJob(
|
|
|
91
91
|
std::vector<SequenceNumber> existing_snapshots,
|
|
92
92
|
SequenceNumber earliest_write_conflict_snapshot,
|
|
93
93
|
SnapshotChecker* snapshot_checker, JobContext* job_context,
|
|
94
|
-
LogBuffer* log_buffer, FSDirectory* db_directory,
|
|
94
|
+
FlushReason flush_reason, LogBuffer* log_buffer, FSDirectory* db_directory,
|
|
95
95
|
FSDirectory* output_file_directory, CompressionType output_compression,
|
|
96
96
|
Statistics* stats, EventLogger* event_logger, bool measure_io_stats,
|
|
97
97
|
const bool sync_output_directory, const bool write_manifest,
|
|
@@ -114,6 +114,7 @@ FlushJob::FlushJob(
|
|
|
114
114
|
earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
|
|
115
115
|
snapshot_checker_(snapshot_checker),
|
|
116
116
|
job_context_(job_context),
|
|
117
|
+
flush_reason_(flush_reason),
|
|
117
118
|
log_buffer_(log_buffer),
|
|
118
119
|
db_directory_(db_directory),
|
|
119
120
|
output_file_directory_(output_file_directory),
|
|
@@ -245,9 +246,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, FileMetaData* file_meta,
|
|
|
245
246
|
}
|
|
246
247
|
Status mempurge_s = Status::NotFound("No MemPurge.");
|
|
247
248
|
if ((mempurge_threshold > 0.0) &&
|
|
248
|
-
(
|
|
249
|
-
(
|
|
250
|
-
!(db_options_.atomic_flush)) {
|
|
249
|
+
(flush_reason_ == FlushReason::kWriteBufferFull) && (!mems_.empty()) &&
|
|
250
|
+
MemPurgeDecider(mempurge_threshold) && !(db_options_.atomic_flush)) {
|
|
251
251
|
cfd_->SetMempurgeUsed();
|
|
252
252
|
mempurge_s = MemPurge();
|
|
253
253
|
if (!mempurge_s.ok()) {
|
|
@@ -878,7 +878,7 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
878
878
|
<< total_num_deletes << "total_data_size"
|
|
879
879
|
<< total_data_size << "memory_usage"
|
|
880
880
|
<< total_memory_usage << "flush_reason"
|
|
881
|
-
<< GetFlushReasonString(
|
|
881
|
+
<< GetFlushReasonString(flush_reason_);
|
|
882
882
|
|
|
883
883
|
{
|
|
884
884
|
ScopedArenaIterator iter(
|
|
@@ -1076,7 +1076,7 @@ std::unique_ptr<FlushJobInfo> FlushJob::GetFlushJobInfo() const {
|
|
|
1076
1076
|
info->smallest_seqno = meta_.fd.smallest_seqno;
|
|
1077
1077
|
info->largest_seqno = meta_.fd.largest_seqno;
|
|
1078
1078
|
info->table_properties = table_properties_;
|
|
1079
|
-
info->flush_reason =
|
|
1079
|
+
info->flush_reason = flush_reason_;
|
|
1080
1080
|
info->blob_compression_type = mutable_cf_options_.blob_compression_type;
|
|
1081
1081
|
|
|
1082
1082
|
// Update BlobFilesInfo.
|
|
@@ -67,8 +67,8 @@ class FlushJob {
|
|
|
67
67
|
std::vector<SequenceNumber> existing_snapshots,
|
|
68
68
|
SequenceNumber earliest_write_conflict_snapshot,
|
|
69
69
|
SnapshotChecker* snapshot_checker, JobContext* job_context,
|
|
70
|
-
|
|
71
|
-
FSDirectory* output_file_directory,
|
|
70
|
+
FlushReason flush_reason, LogBuffer* log_buffer,
|
|
71
|
+
FSDirectory* db_directory, FSDirectory* output_file_directory,
|
|
72
72
|
CompressionType output_compression, Statistics* stats,
|
|
73
73
|
EventLogger* event_logger, bool measure_io_stats,
|
|
74
74
|
const bool sync_output_directory, const bool write_manifest,
|
|
@@ -150,6 +150,7 @@ class FlushJob {
|
|
|
150
150
|
SequenceNumber earliest_write_conflict_snapshot_;
|
|
151
151
|
SnapshotChecker* snapshot_checker_;
|
|
152
152
|
JobContext* job_context_;
|
|
153
|
+
FlushReason flush_reason_;
|
|
153
154
|
LogBuffer* log_buffer_;
|
|
154
155
|
FSDirectory* db_directory_;
|
|
155
156
|
FSDirectory* output_file_directory_;
|
|
@@ -164,15 +164,15 @@ TEST_F(FlushJobTest, Empty) {
|
|
|
164
164
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
165
165
|
EventLogger event_logger(db_options_.info_log.get());
|
|
166
166
|
SnapshotChecker* snapshot_checker = nullptr; // not relavant
|
|
167
|
-
FlushJob flush_job(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
167
|
+
FlushJob flush_job(
|
|
168
|
+
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
169
|
+
*cfd->GetLatestMutableCFOptions(),
|
|
170
|
+
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
171
|
+
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
172
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
173
|
+
nullptr, kNoCompression, nullptr, &event_logger, false,
|
|
174
|
+
true /* sync_output_directory */, true /* write_manifest */,
|
|
175
|
+
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
176
176
|
{
|
|
177
177
|
InstrumentedMutexLock l(&mutex_);
|
|
178
178
|
flush_job.PickMemTable();
|
|
@@ -255,9 +255,9 @@ TEST_F(FlushJobTest, NonEmpty) {
|
|
|
255
255
|
*cfd->GetLatestMutableCFOptions(),
|
|
256
256
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
257
257
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
258
|
-
snapshot_checker, &job_context,
|
|
259
|
-
db_options_.statistics.get(), &event_logger,
|
|
260
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
258
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
259
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
260
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
261
261
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
262
262
|
|
|
263
263
|
HistogramData hist;
|
|
@@ -318,9 +318,9 @@ TEST_F(FlushJobTest, FlushMemTablesSingleColumnFamily) {
|
|
|
318
318
|
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
319
319
|
*cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
|
|
320
320
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
321
|
-
snapshot_checker, &job_context,
|
|
322
|
-
db_options_.statistics.get(), &event_logger,
|
|
323
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
321
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
322
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
323
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
324
324
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
325
325
|
HistogramData hist;
|
|
326
326
|
FileMetaData file_meta;
|
|
@@ -391,8 +391,8 @@ TEST_F(FlushJobTest, FlushMemtablesMultipleColumnFamilies) {
|
|
|
391
391
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
392
392
|
memtable_ids[k], env_options_, versions_.get(), &mutex_,
|
|
393
393
|
&shutting_down_, snapshot_seqs, kMaxSequenceNumber, snapshot_checker,
|
|
394
|
-
&job_context,
|
|
395
|
-
db_options_.statistics.get(), &event_logger, true,
|
|
394
|
+
&job_context, FlushReason::kTest, nullptr, nullptr, nullptr,
|
|
395
|
+
kNoCompression, db_options_.statistics.get(), &event_logger, true,
|
|
396
396
|
false /* sync_output_directory */, false /* write_manifest */,
|
|
397
397
|
Env::Priority::USER, nullptr /*IOTracer*/,
|
|
398
398
|
empty_seqno_to_time_mapping_));
|
|
@@ -520,9 +520,9 @@ TEST_F(FlushJobTest, Snapshots) {
|
|
|
520
520
|
*cfd->GetLatestMutableCFOptions(),
|
|
521
521
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
522
522
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
523
|
-
snapshot_checker, &job_context,
|
|
524
|
-
db_options_.statistics.get(), &event_logger,
|
|
525
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
523
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
524
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
525
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
526
526
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
527
527
|
mutex_.Lock();
|
|
528
528
|
flush_job.PickMemTable();
|
|
@@ -576,9 +576,9 @@ TEST_F(FlushJobTest, GetRateLimiterPriorityForWrite) {
|
|
|
576
576
|
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
577
577
|
*cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
|
|
578
578
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
579
|
-
snapshot_checker, &job_context,
|
|
580
|
-
db_options_.statistics.get(), &event_logger,
|
|
581
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
579
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
580
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
581
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
582
582
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
583
583
|
|
|
584
584
|
// When the state from WriteController is normal.
|
|
@@ -656,9 +656,9 @@ TEST_F(FlushJobTimestampTest, AllKeysExpired) {
|
|
|
656
656
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
657
657
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
658
658
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
659
|
-
snapshot_checker, &job_context,
|
|
660
|
-
db_options_.statistics.get(), &event_logger,
|
|
661
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
659
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
660
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
661
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
662
662
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
|
|
663
663
|
/*db_id=*/"",
|
|
664
664
|
/*db_session_id=*/"", full_history_ts_low);
|
|
@@ -709,9 +709,9 @@ TEST_F(FlushJobTimestampTest, NoKeyExpired) {
|
|
|
709
709
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
710
710
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
711
711
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
712
|
-
snapshot_checker, &job_context,
|
|
713
|
-
db_options_.statistics.get(), &event_logger,
|
|
714
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
712
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
713
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
714
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
715
715
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
|
|
716
716
|
/*db_id=*/"",
|
|
717
717
|
/*db_session_id=*/"", full_history_ts_low);
|
|
@@ -82,10 +82,6 @@ class HistoryTrimmingIterator : public InternalIterator {
|
|
|
82
82
|
|
|
83
83
|
bool IsValuePinned() const override { return input_->IsValuePinned(); }
|
|
84
84
|
|
|
85
|
-
bool IsDeleteRangeSentinelKey() const override {
|
|
86
|
-
return input_->IsDeleteRangeSentinelKey();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
85
|
private:
|
|
90
86
|
InternalIterator* input_;
|
|
91
87
|
const std::string filter_ts_;
|
|
@@ -659,17 +659,18 @@ void InternalStats::CollectCacheEntryStats(bool foreground) {
|
|
|
659
659
|
min_interval_factor);
|
|
660
660
|
}
|
|
661
661
|
|
|
662
|
-
std::function<void(
|
|
662
|
+
std::function<void()> Blah() {
|
|
663
|
+
static int x = 42;
|
|
664
|
+
return [&]() { ++x; };
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
|
|
668
|
+
const Cache::CacheItemHelper* helper)>
|
|
663
669
|
InternalStats::CacheEntryRoleStats::GetEntryCallback() {
|
|
664
|
-
return [&](const Slice& /*key*/,
|
|
665
|
-
Cache::
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
if (e == role_map_.end()) {
|
|
669
|
-
role_idx = static_cast<size_t>(CacheEntryRole::kMisc);
|
|
670
|
-
} else {
|
|
671
|
-
role_idx = static_cast<size_t>(e->second);
|
|
672
|
-
}
|
|
670
|
+
return [&](const Slice& /*key*/, Cache::ObjectPtr /*value*/, size_t charge,
|
|
671
|
+
const Cache::CacheItemHelper* helper) -> void {
|
|
672
|
+
size_t role_idx =
|
|
673
|
+
static_cast<size_t>(helper ? helper->role : CacheEntryRole::kMisc);
|
|
673
674
|
entry_counts[role_idx]++;
|
|
674
675
|
total_charges[role_idx] += charge;
|
|
675
676
|
};
|
|
@@ -680,7 +681,6 @@ void InternalStats::CacheEntryRoleStats::BeginCollection(
|
|
|
680
681
|
Clear();
|
|
681
682
|
last_start_time_micros_ = start_time_micros;
|
|
682
683
|
++collection_count;
|
|
683
|
-
role_map_ = CopyCacheDeleterRoleMap();
|
|
684
684
|
std::ostringstream str;
|
|
685
685
|
str << cache->Name() << "@" << static_cast<void*>(cache) << "#"
|
|
686
686
|
<< port::GetProcessID();
|
|
@@ -472,7 +472,8 @@ class InternalStats {
|
|
|
472
472
|
}
|
|
473
473
|
|
|
474
474
|
void BeginCollection(Cache*, SystemClock*, uint64_t start_time_micros);
|
|
475
|
-
std::function<void(const Slice
|
|
475
|
+
std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
|
|
476
|
+
const Cache::CacheItemHelper* helper)>
|
|
476
477
|
GetEntryCallback();
|
|
477
478
|
void EndCollection(Cache*, SystemClock*, uint64_t end_time_micros);
|
|
478
479
|
void SkippedCollection();
|
|
@@ -482,7 +483,6 @@ class InternalStats {
|
|
|
482
483
|
SystemClock* clock) const;
|
|
483
484
|
|
|
484
485
|
private:
|
|
485
|
-
UnorderedMap<Cache::DeleterFn, CacheEntryRole> role_map_;
|
|
486
486
|
uint64_t GetLastDurationMicros() const;
|
|
487
487
|
};
|
|
488
488
|
|
|
@@ -515,10 +515,11 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
|
|
|
515
515
|
|
|
516
516
|
size_t uncompressed_size = 0;
|
|
517
517
|
int remaining = 0;
|
|
518
|
+
const char* input = header + header_size;
|
|
518
519
|
do {
|
|
519
|
-
remaining = uncompress_->Uncompress(
|
|
520
|
-
|
|
521
|
-
|
|
520
|
+
remaining = uncompress_->Uncompress(
|
|
521
|
+
input, length, uncompressed_buffer_.get(), &uncompressed_size);
|
|
522
|
+
input = nullptr;
|
|
522
523
|
if (remaining < 0) {
|
|
523
524
|
buffer_.clear();
|
|
524
525
|
return kBadRecord;
|
|
@@ -830,10 +831,11 @@ bool FragmentBufferedReader::TryReadFragment(
|
|
|
830
831
|
uncompressed_record_.clear();
|
|
831
832
|
size_t uncompressed_size = 0;
|
|
832
833
|
int remaining = 0;
|
|
834
|
+
const char* input = header + header_size;
|
|
833
835
|
do {
|
|
834
|
-
remaining = uncompress_->Uncompress(
|
|
835
|
-
|
|
836
|
-
|
|
836
|
+
remaining = uncompress_->Uncompress(
|
|
837
|
+
input, length, uncompressed_buffer_.get(), &uncompressed_size);
|
|
838
|
+
input = nullptr;
|
|
837
839
|
if (remaining < 0) {
|
|
838
840
|
buffer_.clear();
|
|
839
841
|
*fragment_type_or_err = kBadRecord;
|
|
@@ -979,6 +979,38 @@ TEST_P(CompressionLogTest, Fragmentation) {
|
|
|
979
979
|
ASSERT_EQ("EOF", Read());
|
|
980
980
|
}
|
|
981
981
|
|
|
982
|
+
TEST_P(CompressionLogTest, AlignedFragmentation) {
|
|
983
|
+
CompressionType compression_type = std::get<2>(GetParam());
|
|
984
|
+
if (!StreamingCompressionTypeSupported(compression_type)) {
|
|
985
|
+
ROCKSDB_GTEST_SKIP("Test requires support for compression type");
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
ASSERT_OK(SetupTestEnv());
|
|
989
|
+
Random rnd(301);
|
|
990
|
+
int num_filler_records = 0;
|
|
991
|
+
// Keep writing small records until the next record will be aligned at the
|
|
992
|
+
// beginning of the block.
|
|
993
|
+
while ((WrittenBytes() & (kBlockSize - 1)) >= kHeaderSize) {
|
|
994
|
+
char entry = 'a';
|
|
995
|
+
ASSERT_OK(writer_->AddRecord(Slice(&entry, 1)));
|
|
996
|
+
num_filler_records++;
|
|
997
|
+
}
|
|
998
|
+
const std::vector<std::string> wal_entries = {
|
|
999
|
+
rnd.RandomBinaryString(3 * kBlockSize),
|
|
1000
|
+
};
|
|
1001
|
+
for (const std::string& wal_entry : wal_entries) {
|
|
1002
|
+
Write(wal_entry);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
for (int i = 0; i < num_filler_records; ++i) {
|
|
1006
|
+
ASSERT_EQ("a", Read());
|
|
1007
|
+
}
|
|
1008
|
+
for (const std::string& wal_entry : wal_entries) {
|
|
1009
|
+
ASSERT_EQ(wal_entry, Read());
|
|
1010
|
+
}
|
|
1011
|
+
ASSERT_EQ("EOF", Read());
|
|
1012
|
+
}
|
|
1013
|
+
|
|
982
1014
|
INSTANTIATE_TEST_CASE_P(
|
|
983
1015
|
Compression, CompressionLogTest,
|
|
984
1016
|
::testing::Combine(::testing::Values(0, 1), ::testing::Bool(),
|
|
@@ -1026,10 +1058,11 @@ TEST_P(StreamingCompressionTest, Basic) {
|
|
|
1026
1058
|
for (int i = 0; i < (int)compressed_buffers.size(); i++) {
|
|
1027
1059
|
// Call uncompress till either the entire input is consumed or the output
|
|
1028
1060
|
// buffer size is equal to the allocated output buffer size.
|
|
1061
|
+
const char* input = compressed_buffers[i].c_str();
|
|
1029
1062
|
do {
|
|
1030
|
-
ret_val = uncompress->Uncompress(compressed_buffers[i].
|
|
1031
|
-
compressed_buffers[i].size(),
|
|
1063
|
+
ret_val = uncompress->Uncompress(input, compressed_buffers[i].size(),
|
|
1032
1064
|
uncompressed_output_buffer, &output_pos);
|
|
1065
|
+
input = nullptr;
|
|
1033
1066
|
if (output_pos > 0) {
|
|
1034
1067
|
std::string uncompressed_fragment;
|
|
1035
1068
|
uncompressed_fragment.assign(uncompressed_output_buffer, output_pos);
|
|
@@ -1067,11 +1067,15 @@ static bool SaveValue(void* arg, const char* entry) {
|
|
|
1067
1067
|
|
|
1068
1068
|
if (s->value || s->columns) {
|
|
1069
1069
|
std::string result;
|
|
1070
|
+
// `op_failure_scope` (an output parameter) is not provided (set to
|
|
1071
|
+
// nullptr) since a failure must be propagated regardless of its
|
|
1072
|
+
// value.
|
|
1070
1073
|
*(s->status) = MergeHelper::TimedFullMerge(
|
|
1071
1074
|
merge_operator, s->key->user_key(), &v,
|
|
1072
1075
|
merge_context->GetOperands(), &result, s->logger, s->statistics,
|
|
1073
1076
|
s->clock, /* result_operand */ nullptr,
|
|
1074
|
-
/* update_num_ops_stats */ true
|
|
1077
|
+
/* update_num_ops_stats */ true,
|
|
1078
|
+
/* op_failure_scope */ nullptr);
|
|
1075
1079
|
|
|
1076
1080
|
if (s->status->ok()) {
|
|
1077
1081
|
if (s->value) {
|
|
@@ -1130,18 +1134,26 @@ static bool SaveValue(void* arg, const char* entry) {
|
|
|
1130
1134
|
*(s->status) = WideColumnSerialization::GetValueOfDefaultColumn(
|
|
1131
1135
|
v, value_of_default);
|
|
1132
1136
|
if (s->status->ok()) {
|
|
1137
|
+
// `op_failure_scope` (an output parameter) is not provided (set
|
|
1138
|
+
// to nullptr) since a failure must be propagated regardless of
|
|
1139
|
+
// its value.
|
|
1133
1140
|
*(s->status) = MergeHelper::TimedFullMerge(
|
|
1134
1141
|
merge_operator, s->key->user_key(), &value_of_default,
|
|
1135
1142
|
merge_context->GetOperands(), s->value, s->logger,
|
|
1136
1143
|
s->statistics, s->clock, /* result_operand */ nullptr,
|
|
1137
|
-
/* update_num_ops_stats */ true
|
|
1144
|
+
/* update_num_ops_stats */ true,
|
|
1145
|
+
/* op_failure_scope */ nullptr);
|
|
1138
1146
|
}
|
|
1139
1147
|
} else if (s->columns) {
|
|
1140
1148
|
std::string result;
|
|
1149
|
+
// `op_failure_scope` (an output parameter) is not provided (set to
|
|
1150
|
+
// nullptr) since a failure must be propagated regardless of its
|
|
1151
|
+
// value.
|
|
1141
1152
|
*(s->status) = MergeHelper::TimedFullMergeWithEntity(
|
|
1142
1153
|
merge_operator, s->key->user_key(), v,
|
|
1143
1154
|
merge_context->GetOperands(), &result, s->logger, s->statistics,
|
|
1144
|
-
s->clock, /* update_num_ops_stats */ true
|
|
1155
|
+
s->clock, /* update_num_ops_stats */ true,
|
|
1156
|
+
/* op_failure_scope */ nullptr);
|
|
1145
1157
|
|
|
1146
1158
|
if (s->status->ok()) {
|
|
1147
1159
|
*(s->status) = s->columns->SetWideColumnValue(result);
|
|
@@ -1177,11 +1189,15 @@ static bool SaveValue(void* arg, const char* entry) {
|
|
|
1177
1189
|
if (*(s->merge_in_progress)) {
|
|
1178
1190
|
if (s->value || s->columns) {
|
|
1179
1191
|
std::string result;
|
|
1192
|
+
// `op_failure_scope` (an output parameter) is not provided (set to
|
|
1193
|
+
// nullptr) since a failure must be propagated regardless of its
|
|
1194
|
+
// value.
|
|
1180
1195
|
*(s->status) = MergeHelper::TimedFullMerge(
|
|
1181
1196
|
merge_operator, s->key->user_key(), nullptr,
|
|
1182
1197
|
merge_context->GetOperands(), &result, s->logger, s->statistics,
|
|
1183
1198
|
s->clock, /* result_operand */ nullptr,
|
|
1184
|
-
/* update_num_ops_stats */ true
|
|
1199
|
+
/* update_num_ops_stats */ true,
|
|
1200
|
+
/* op_failure_scope */ nullptr);
|
|
1185
1201
|
|
|
1186
1202
|
if (s->status->ok()) {
|
|
1187
1203
|
if (s->value) {
|
|
@@ -1191,6 +1207,11 @@ static bool SaveValue(void* arg, const char* entry) {
|
|
|
1191
1207
|
s->columns->SetPlainValue(result);
|
|
1192
1208
|
}
|
|
1193
1209
|
}
|
|
1210
|
+
} else {
|
|
1211
|
+
// We have found a final value (a base deletion) and have newer
|
|
1212
|
+
// merge operands that we do not intend to merge. Nothing remains
|
|
1213
|
+
// to be done so assign status to OK.
|
|
1214
|
+
*(s->status) = Status::OK();
|
|
1194
1215
|
}
|
|
1195
1216
|
} else {
|
|
1196
1217
|
*(s->status) = Status::NotFound();
|
|
@@ -1217,11 +1238,15 @@ static bool SaveValue(void* arg, const char* entry) {
|
|
|
1217
1238
|
merge_context->GetOperandsDirectionBackward())) {
|
|
1218
1239
|
if (s->value || s->columns) {
|
|
1219
1240
|
std::string result;
|
|
1241
|
+
// `op_failure_scope` (an output parameter) is not provided (set to
|
|
1242
|
+
// nullptr) since a failure must be propagated regardless of its
|
|
1243
|
+
// value.
|
|
1220
1244
|
*(s->status) = MergeHelper::TimedFullMerge(
|
|
1221
1245
|
merge_operator, s->key->user_key(), nullptr,
|
|
1222
1246
|
merge_context->GetOperands(), &result, s->logger, s->statistics,
|
|
1223
1247
|
s->clock, /* result_operand */ nullptr,
|
|
1224
|
-
/* update_num_ops_stats */ true
|
|
1248
|
+
/* update_num_ops_stats */ true,
|
|
1249
|
+
/* op_failure_scope */ nullptr);
|
|
1225
1250
|
|
|
1226
1251
|
if (s->status->ok()) {
|
|
1227
1252
|
if (s->value) {
|