@nxtedition/rocksdb 7.1.3 → 7.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/binding.cc +32 -14
- package/deps/rocksdb/iostats.patch +19 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
- package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
- package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
- package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
- package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
- package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
- package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
- package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
- package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
- package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
- package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
- package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
- package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
- package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
- package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
- package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
- package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
- package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
- package/deps/rocksdb/rocksdb/util/math.h +41 -0
- package/deps/rocksdb/rocksdb/util/math128.h +6 -0
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
- package/index.js +17 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/logging/posix_logger.h +0 -179
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
1
7
|
#ifndef ROCKSDB_LITE
|
|
2
8
|
|
|
3
9
|
#include "db/import_column_family_job.h"
|
|
@@ -160,7 +166,7 @@ Status ImportColumnFamilyJob::Run() {
|
|
|
160
166
|
file_metadata.largest_seqno, false, file_metadata.temperature,
|
|
161
167
|
kInvalidBlobFileNumber, oldest_ancester_time, current_time,
|
|
162
168
|
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
163
|
-
|
|
169
|
+
f.unique_id);
|
|
164
170
|
|
|
165
171
|
// If incoming sequence number is higher, update local sequence number.
|
|
166
172
|
if (file_metadata.largest_seqno > versions_->LastSequence()) {
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
1
7
|
#pragma once
|
|
2
8
|
#include <string>
|
|
3
9
|
#include <unordered_set>
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
1
7
|
#ifndef ROCKSDB_LITE
|
|
2
8
|
|
|
3
9
|
#include <functional>
|
|
@@ -65,6 +65,8 @@ class ProtectionInfo {
|
|
|
65
65
|
const SliceParts& value,
|
|
66
66
|
ValueType op_type) const;
|
|
67
67
|
|
|
68
|
+
T GetVal() const { return val_; }
|
|
69
|
+
|
|
68
70
|
private:
|
|
69
71
|
friend class ProtectionInfoKVO<T>;
|
|
70
72
|
friend class ProtectionInfoKVOS<T>;
|
|
@@ -87,7 +89,6 @@ class ProtectionInfo {
|
|
|
87
89
|
static_assert(sizeof(ProtectionInfo<T>) == sizeof(T), "");
|
|
88
90
|
}
|
|
89
91
|
|
|
90
|
-
T GetVal() const { return val_; }
|
|
91
92
|
void SetVal(T val) { val_ = val; }
|
|
92
93
|
|
|
93
94
|
T val_ = 0;
|
|
@@ -112,6 +113,8 @@ class ProtectionInfoKVO {
|
|
|
112
113
|
void UpdateV(const SliceParts& old_value, const SliceParts& new_value);
|
|
113
114
|
void UpdateO(ValueType old_op_type, ValueType new_op_type);
|
|
114
115
|
|
|
116
|
+
T GetVal() const { return info_.GetVal(); }
|
|
117
|
+
|
|
115
118
|
private:
|
|
116
119
|
friend class ProtectionInfo<T>;
|
|
117
120
|
friend class ProtectionInfoKVOS<T>;
|
|
@@ -121,7 +124,6 @@ class ProtectionInfoKVO {
|
|
|
121
124
|
static_assert(sizeof(ProtectionInfoKVO<T>) == sizeof(T), "");
|
|
122
125
|
}
|
|
123
126
|
|
|
124
|
-
T GetVal() const { return info_.GetVal(); }
|
|
125
127
|
void SetVal(T val) { info_.SetVal(val); }
|
|
126
128
|
|
|
127
129
|
ProtectionInfo<T> info_;
|
|
@@ -152,6 +154,8 @@ class ProtectionInfoKVOC {
|
|
|
152
154
|
void UpdateC(ColumnFamilyId old_column_family_id,
|
|
153
155
|
ColumnFamilyId new_column_family_id);
|
|
154
156
|
|
|
157
|
+
T GetVal() const { return kvo_.GetVal(); }
|
|
158
|
+
|
|
155
159
|
private:
|
|
156
160
|
friend class ProtectionInfoKVO<T>;
|
|
157
161
|
|
|
@@ -159,7 +163,6 @@ class ProtectionInfoKVOC {
|
|
|
159
163
|
static_assert(sizeof(ProtectionInfoKVOC<T>) == sizeof(T), "");
|
|
160
164
|
}
|
|
161
165
|
|
|
162
|
-
T GetVal() const { return kvo_.GetVal(); }
|
|
163
166
|
void SetVal(T val) { kvo_.SetVal(val); }
|
|
164
167
|
|
|
165
168
|
ProtectionInfoKVO<T> kvo_;
|
|
@@ -190,6 +193,8 @@ class ProtectionInfoKVOS {
|
|
|
190
193
|
void UpdateS(SequenceNumber old_sequence_number,
|
|
191
194
|
SequenceNumber new_sequence_number);
|
|
192
195
|
|
|
196
|
+
T GetVal() const { return kvo_.GetVal(); }
|
|
197
|
+
|
|
193
198
|
private:
|
|
194
199
|
friend class ProtectionInfoKVO<T>;
|
|
195
200
|
|
|
@@ -197,7 +202,6 @@ class ProtectionInfoKVOS {
|
|
|
197
202
|
static_assert(sizeof(ProtectionInfoKVOS<T>) == sizeof(T), "");
|
|
198
203
|
}
|
|
199
204
|
|
|
200
|
-
T GetVal() const { return kvo_.GetVal(); }
|
|
201
205
|
void SetVal(T val) { kvo_.SetVal(val); }
|
|
202
206
|
|
|
203
207
|
ProtectionInfoKVO<T> kvo_;
|
|
@@ -44,7 +44,8 @@ Reader::Reader(std::shared_ptr<Logger> info_log,
|
|
|
44
44
|
compression_type_(kNoCompression),
|
|
45
45
|
compression_type_record_read_(false),
|
|
46
46
|
uncompress_(nullptr),
|
|
47
|
-
hash_state_(nullptr)
|
|
47
|
+
hash_state_(nullptr),
|
|
48
|
+
uncompress_hash_state_(nullptr){};
|
|
48
49
|
|
|
49
50
|
Reader::~Reader() {
|
|
50
51
|
delete[] backing_store_;
|
|
@@ -54,6 +55,9 @@ Reader::~Reader() {
|
|
|
54
55
|
if (hash_state_) {
|
|
55
56
|
XXH3_freeState(hash_state_);
|
|
56
57
|
}
|
|
58
|
+
if (uncompress_hash_state_) {
|
|
59
|
+
XXH3_freeState(uncompress_hash_state_);
|
|
60
|
+
}
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
// For kAbsoluteConsistency, on clean shutdown we don't expect any error
|
|
@@ -64,10 +68,11 @@ Reader::~Reader() {
|
|
|
64
68
|
// TODO krad: Evaluate if we need to move to a more strict mode where we
|
|
65
69
|
// restrict the inconsistency to only the last log
|
|
66
70
|
bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
67
|
-
WALRecoveryMode wal_recovery_mode,
|
|
71
|
+
WALRecoveryMode wal_recovery_mode,
|
|
72
|
+
uint64_t* record_checksum) {
|
|
68
73
|
scratch->clear();
|
|
69
74
|
record->clear();
|
|
70
|
-
if (
|
|
75
|
+
if (record_checksum != nullptr) {
|
|
71
76
|
if (hash_state_ == nullptr) {
|
|
72
77
|
hash_state_ = XXH3_createState();
|
|
73
78
|
}
|
|
@@ -85,7 +90,8 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
|
85
90
|
while (true) {
|
|
86
91
|
uint64_t physical_record_offset = end_of_buffer_offset_ - buffer_.size();
|
|
87
92
|
size_t drop_size = 0;
|
|
88
|
-
const unsigned int record_type =
|
|
93
|
+
const unsigned int record_type =
|
|
94
|
+
ReadPhysicalRecord(&fragment, &drop_size, record_checksum);
|
|
89
95
|
switch (record_type) {
|
|
90
96
|
case kFullType:
|
|
91
97
|
case kRecyclableFullType:
|
|
@@ -96,9 +102,12 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
|
96
102
|
// at the beginning of the next block.
|
|
97
103
|
ReportCorruption(scratch->size(), "partial record without end(1)");
|
|
98
104
|
}
|
|
99
|
-
|
|
105
|
+
// No need to compute record_checksum since the record
|
|
106
|
+
// consists of a single fragment and the checksum is computed
|
|
107
|
+
// in ReadPhysicalRecord() if WAL compression is enabled
|
|
108
|
+
if (record_checksum != nullptr && uncompress_ == nullptr) {
|
|
100
109
|
// No need to stream since the record is a single fragment
|
|
101
|
-
*
|
|
110
|
+
*record_checksum = XXH3_64bits(fragment.data(), fragment.size());
|
|
102
111
|
}
|
|
103
112
|
prospective_record_offset = physical_record_offset;
|
|
104
113
|
scratch->clear();
|
|
@@ -117,7 +126,7 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
|
117
126
|
ReportCorruption(scratch->size(), "partial record without end(2)");
|
|
118
127
|
XXH3_64bits_reset(hash_state_);
|
|
119
128
|
}
|
|
120
|
-
if (
|
|
129
|
+
if (record_checksum != nullptr) {
|
|
121
130
|
XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
|
|
122
131
|
}
|
|
123
132
|
prospective_record_offset = physical_record_offset;
|
|
@@ -131,7 +140,7 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
|
131
140
|
ReportCorruption(fragment.size(),
|
|
132
141
|
"missing start of fragmented record(1)");
|
|
133
142
|
} else {
|
|
134
|
-
if (
|
|
143
|
+
if (record_checksum != nullptr) {
|
|
135
144
|
XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
|
|
136
145
|
}
|
|
137
146
|
scratch->append(fragment.data(), fragment.size());
|
|
@@ -144,9 +153,9 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
|
|
|
144
153
|
ReportCorruption(fragment.size(),
|
|
145
154
|
"missing start of fragmented record(2)");
|
|
146
155
|
} else {
|
|
147
|
-
if (
|
|
156
|
+
if (record_checksum != nullptr) {
|
|
148
157
|
XXH3_64bits_update(hash_state_, fragment.data(), fragment.size());
|
|
149
|
-
*
|
|
158
|
+
*record_checksum = XXH3_64bits_digest(hash_state_);
|
|
150
159
|
}
|
|
151
160
|
scratch->append(fragment.data(), fragment.size());
|
|
152
161
|
*record = Slice(*scratch);
|
|
@@ -417,7 +426,8 @@ bool Reader::ReadMore(size_t* drop_size, int *error) {
|
|
|
417
426
|
}
|
|
418
427
|
}
|
|
419
428
|
|
|
420
|
-
unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size
|
|
429
|
+
unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
|
|
430
|
+
uint64_t* fragment_checksum) {
|
|
421
431
|
while (true) {
|
|
422
432
|
// We need at least the minimum header size
|
|
423
433
|
if (buffer_.size() < static_cast<size_t>(kHeaderSize)) {
|
|
@@ -500,6 +510,13 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) {
|
|
|
500
510
|
} else {
|
|
501
511
|
// Uncompress compressed records
|
|
502
512
|
uncompressed_record_.clear();
|
|
513
|
+
if (fragment_checksum != nullptr) {
|
|
514
|
+
if (uncompress_hash_state_ == nullptr) {
|
|
515
|
+
uncompress_hash_state_ = XXH3_createState();
|
|
516
|
+
}
|
|
517
|
+
XXH3_64bits_reset(uncompress_hash_state_);
|
|
518
|
+
}
|
|
519
|
+
|
|
503
520
|
size_t uncompressed_size = 0;
|
|
504
521
|
int remaining = 0;
|
|
505
522
|
do {
|
|
@@ -511,10 +528,30 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) {
|
|
|
511
528
|
return kBadRecord;
|
|
512
529
|
}
|
|
513
530
|
if (uncompressed_size > 0) {
|
|
531
|
+
if (fragment_checksum != nullptr) {
|
|
532
|
+
XXH3_64bits_update(uncompress_hash_state_,
|
|
533
|
+
uncompressed_buffer_.get(), uncompressed_size);
|
|
534
|
+
}
|
|
514
535
|
uncompressed_record_.append(uncompressed_buffer_.get(),
|
|
515
536
|
uncompressed_size);
|
|
516
537
|
}
|
|
517
538
|
} while (remaining > 0 || uncompressed_size == kBlockSize);
|
|
539
|
+
|
|
540
|
+
if (fragment_checksum != nullptr) {
|
|
541
|
+
// We can remove this check by updating hash_state_ directly,
|
|
542
|
+
// but that requires resetting hash_state_ for full and first types
|
|
543
|
+
// for edge cases like consecutive fist type records.
|
|
544
|
+
// Leaving the check as is since it is cleaner and can revert to the
|
|
545
|
+
// above approach if it causes performance impact.
|
|
546
|
+
*fragment_checksum = XXH3_64bits_digest(uncompress_hash_state_);
|
|
547
|
+
uint64_t actual_checksum = XXH3_64bits(uncompressed_record_.data(),
|
|
548
|
+
uncompressed_record_.size());
|
|
549
|
+
if (*fragment_checksum != actual_checksum) {
|
|
550
|
+
// uncompressed_record_ contains bad content that does not match
|
|
551
|
+
// actual decompressed content
|
|
552
|
+
return kBadRecord;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
518
555
|
*result = Slice(uncompressed_record_);
|
|
519
556
|
return type;
|
|
520
557
|
}
|
|
@@ -151,8 +151,10 @@ class Reader {
|
|
|
151
151
|
std::unique_ptr<char[]> uncompressed_buffer_;
|
|
152
152
|
// Reusable uncompressed record
|
|
153
153
|
std::string uncompressed_record_;
|
|
154
|
-
// Used for stream hashing
|
|
154
|
+
// Used for stream hashing fragment content in ReadRecord()
|
|
155
155
|
XXH3_state_t* hash_state_;
|
|
156
|
+
// Used for stream hashing uncompressed buffer in ReadPhysicalRecord()
|
|
157
|
+
XXH3_state_t* uncompress_hash_state_;
|
|
156
158
|
|
|
157
159
|
// Extend record types with the following special values
|
|
158
160
|
enum {
|
|
@@ -173,7 +175,11 @@ class Reader {
|
|
|
173
175
|
};
|
|
174
176
|
|
|
175
177
|
// Return type, or one of the preceding special values
|
|
176
|
-
|
|
178
|
+
// If WAL compressioned is enabled, fragment_checksum is the checksum of the
|
|
179
|
+
// fragment computed from the orginal buffer containinng uncompressed
|
|
180
|
+
// fragment.
|
|
181
|
+
unsigned int ReadPhysicalRecord(Slice* result, size_t* drop_size,
|
|
182
|
+
uint64_t* fragment_checksum = nullptr);
|
|
177
183
|
|
|
178
184
|
// Read some more
|
|
179
185
|
bool ReadMore(size_t* drop_size, int *error);
|
|
@@ -194,8 +194,17 @@ class LogTest
|
|
|
194
194
|
std::string scratch;
|
|
195
195
|
Slice record;
|
|
196
196
|
bool ret = false;
|
|
197
|
-
|
|
197
|
+
uint64_t record_checksum;
|
|
198
|
+
ret = reader_->ReadRecord(&record, &scratch, wal_recovery_mode,
|
|
199
|
+
&record_checksum);
|
|
198
200
|
if (ret) {
|
|
201
|
+
if (!allow_retry_read_) {
|
|
202
|
+
// allow_retry_read_ means using FragmentBufferedReader which does not
|
|
203
|
+
// support record checksum yet.
|
|
204
|
+
uint64_t actual_record_checksum =
|
|
205
|
+
XXH3_64bits(record.data(), record.size());
|
|
206
|
+
assert(actual_record_checksum == record_checksum);
|
|
207
|
+
}
|
|
199
208
|
return record.ToString();
|
|
200
209
|
} else {
|
|
201
210
|
return "EOF";
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
#include "file/writable_file_writer.h"
|
|
15
15
|
#include "rocksdb/env.h"
|
|
16
|
+
#include "rocksdb/io_status.h"
|
|
16
17
|
#include "util/coding.h"
|
|
17
18
|
#include "util/crc32c.h"
|
|
18
19
|
|
|
@@ -44,7 +45,12 @@ Writer::~Writer() {
|
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
IOStatus Writer::WriteBuffer() {
|
|
48
|
+
IOStatus Writer::WriteBuffer() {
|
|
49
|
+
if (dest_->seen_error()) {
|
|
50
|
+
return IOStatus::IOError("Seen error. Skip writing buffer.");
|
|
51
|
+
}
|
|
52
|
+
return dest_->Flush();
|
|
53
|
+
}
|
|
48
54
|
|
|
49
55
|
IOStatus Writer::Close() {
|
|
50
56
|
IOStatus s;
|
|
@@ -52,7 +52,7 @@ class ManualCompactionTest : public testing::Test {
|
|
|
52
52
|
// Get rid of any state from an old run.
|
|
53
53
|
dbname_ = ROCKSDB_NAMESPACE::test::PerThreadDBPath(
|
|
54
54
|
"rocksdb_manual_compaction_test");
|
|
55
|
-
DestroyDB(dbname_, Options());
|
|
55
|
+
EXPECT_OK(DestroyDB(dbname_, Options()));
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
std::string dbname_;
|
|
@@ -130,7 +130,7 @@ TEST_F(ManualCompactionTest, CompactTouchesAllKeys) {
|
|
|
130
130
|
|
|
131
131
|
delete options.compaction_filter;
|
|
132
132
|
delete db;
|
|
133
|
-
DestroyDB(dbname_, options);
|
|
133
|
+
ASSERT_OK(DestroyDB(dbname_, options));
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
|
|
@@ -186,7 +186,7 @@ TEST_F(ManualCompactionTest, Test) {
|
|
|
186
186
|
|
|
187
187
|
// close database
|
|
188
188
|
delete db;
|
|
189
|
-
DestroyDB(dbname_, Options());
|
|
189
|
+
ASSERT_OK(DestroyDB(dbname_, Options()));
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
TEST_F(ManualCompactionTest, SkipLevel) {
|
|
@@ -298,7 +298,7 @@ TEST_F(ManualCompactionTest, SkipLevel) {
|
|
|
298
298
|
|
|
299
299
|
delete filter;
|
|
300
300
|
delete db;
|
|
301
|
-
DestroyDB(dbname_, options);
|
|
301
|
+
ASSERT_OK(DestroyDB(dbname_, options));
|
|
302
302
|
}
|
|
303
303
|
|
|
304
304
|
} // anonymous namespace
|