@nxtedition/rocksdb 7.0.0-alpha.6 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +37 -36
- package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
- package/deps/rocksdb/rocksdb/Makefile +8 -1
- package/deps/rocksdb/rocksdb/TARGETS +14 -0
- package/deps/rocksdb/rocksdb/cache/cache.cc +50 -2
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -3
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +111 -33
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +71 -31
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +31 -30
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +21 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +35 -38
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +22 -9
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +48 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +78 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +7 -5
- package/deps/rocksdb/rocksdb/db/c.cc +777 -108
- package/deps/rocksdb/rocksdb/db/c_test.c +290 -30
- package/deps/rocksdb/rocksdb/db/column_family.cc +13 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +24 -36
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +18 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +38 -40
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +14 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +253 -24
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +9 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +67 -10
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +83 -7
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -2
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +68 -0
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +40 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +94 -23
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +17 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +263 -58
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +186 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +24 -28
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +116 -83
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +13 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +71 -34
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +72 -33
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +629 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +438 -10
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +43 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +41 -1
- package/deps/rocksdb/rocksdb/db/db_test2.cc +41 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +90 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +109 -16
- package/deps/rocksdb/rocksdb/db/dbformat.h +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -3
- package/deps/rocksdb/rocksdb/db/log_reader.cc +22 -4
- package/deps/rocksdb/rocksdb/db/log_reader.h +4 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +4 -0
- package/deps/rocksdb/rocksdb/db/post_memtable_callback.h +25 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/snapshot_impl.h +65 -2
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +52 -0
- package/deps/rocksdb/rocksdb/db/version_set.h +57 -43
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +14 -4
- package/deps/rocksdb/rocksdb/db/wal_manager.h +16 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +141 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +55 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +292 -0
- package/deps/rocksdb/rocksdb/db/write_thread.h +6 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +42 -19
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +28 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +6 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +11 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +74 -167
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -9
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -9
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +117 -10
- package/deps/rocksdb/rocksdb/env/composite_env.cc +7 -0
- package/deps/rocksdb/rocksdb/env/env.cc +4 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +3 -3
- package/deps/rocksdb/rocksdb/env/env_test.cc +5 -5
- package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +45 -0
- package/deps/rocksdb/rocksdb/env/file_system_tracer.h +14 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/io_posix.cc +50 -24
- package/deps/rocksdb/rocksdb/env/io_posix.h +9 -7
- package/deps/rocksdb/rocksdb/env/mock_env.cc +9 -3
- package/deps/rocksdb/rocksdb/file/file_util.cc +4 -1
- package/deps/rocksdb/rocksdb/file/filename.cc +14 -0
- package/deps/rocksdb/rocksdb/file/line_file_reader.cc +9 -4
- package/deps/rocksdb/rocksdb/file/line_file_reader.h +3 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +157 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -1
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +68 -32
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +20 -6
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +10 -6
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +231 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +13 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +4 -20
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +31 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +4 -20
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +34 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +36 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +74 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +36 -3
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +16 -3
- package/deps/rocksdb/rocksdb/logging/env_logger.h +3 -3
- package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -2
- package/deps/rocksdb/rocksdb/logging/log_buffer.h +1 -1
- package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -3
- package/deps/rocksdb/rocksdb/memory/arena.cc +0 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +61 -73
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +6 -5
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +7 -3
- package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +3 -0
- package/deps/rocksdb/rocksdb/options/options.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_parser.cc +1 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +0 -2
- package/deps/rocksdb/rocksdb/port/sys_time.h +27 -11
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -1
- package/deps/rocksdb/rocksdb/port/win/io_win.cc +16 -0
- package/deps/rocksdb/rocksdb/port/win/io_win.h +11 -2
- package/deps/rocksdb/rocksdb/port/win/port_win.cc +1 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -16
- package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +2 -2
- package/deps/rocksdb/rocksdb/port/win/win_logger.cc +2 -2
- package/deps/rocksdb/rocksdb/rocksdb.pc.in +4 -5
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +7 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +39 -43
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +2 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +42 -34
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +7 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +6 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +8 -5
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -14
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +2 -0
- package/deps/rocksdb/rocksdb/table/format.h +1 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +5 -0
- package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -0
- package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +3 -4
- package/deps/rocksdb/rocksdb/table/table_test.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +102 -6
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +19 -2
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2 -1
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +2 -4
- package/deps/rocksdb/rocksdb/util/autovector.h +11 -1
- package/deps/rocksdb/rocksdb/util/cleanable.cc +1 -0
- package/deps/rocksdb/rocksdb/util/compression.h +5 -7
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +14 -8
- package/deps/rocksdb/rocksdb/util/string_util.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +33 -63
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +14 -0
- package/deps/rocksdb/rocksdb/utilities/counted_fs.h +7 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +8 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +6 -4
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +34 -21
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +31 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +63 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +40 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +426 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +37 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +16 -18
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +18 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +61 -0
- package/deps/rocksdb/rocksdb.gyp +1 -0
- package/index.js +5 -2
- 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
|
@@ -69,12 +69,138 @@ void VerifyInitializationOfCompactionJobStats(
|
|
|
69
69
|
#endif // !defined(IOS_CROSS_COMPILE)
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
// Mock FSWritableFile for testing io priority.
|
|
73
|
+
// Only override the essential functions for testing compaction io priority.
|
|
74
|
+
class MockTestWritableFile : public FSWritableFileOwnerWrapper {
|
|
75
|
+
public:
|
|
76
|
+
MockTestWritableFile(std::unique_ptr<FSWritableFile>&& file,
|
|
77
|
+
Env::IOPriority io_priority)
|
|
78
|
+
: FSWritableFileOwnerWrapper(std::move(file)),
|
|
79
|
+
write_io_priority_(io_priority) {}
|
|
80
|
+
IOStatus Append(const Slice& data, const IOOptions& options,
|
|
81
|
+
IODebugContext* dbg) override {
|
|
82
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
83
|
+
return target()->Append(data, options, dbg);
|
|
84
|
+
}
|
|
85
|
+
IOStatus Append(const Slice& data, const IOOptions& options,
|
|
86
|
+
const DataVerificationInfo& verification_info,
|
|
87
|
+
IODebugContext* dbg) override {
|
|
88
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
89
|
+
return target()->Append(data, options, verification_info, dbg);
|
|
90
|
+
}
|
|
91
|
+
IOStatus Close(const IOOptions& options, IODebugContext* dbg) override {
|
|
92
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
93
|
+
return target()->Close(options, dbg);
|
|
94
|
+
}
|
|
95
|
+
IOStatus Flush(const IOOptions& options, IODebugContext* dbg) override {
|
|
96
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
97
|
+
return target()->Flush(options, dbg);
|
|
98
|
+
}
|
|
99
|
+
IOStatus Sync(const IOOptions& options, IODebugContext* dbg) override {
|
|
100
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
101
|
+
return target()->Sync(options, dbg);
|
|
102
|
+
}
|
|
103
|
+
IOStatus Fsync(const IOOptions& options, IODebugContext* dbg) override {
|
|
104
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
105
|
+
return target()->Fsync(options, dbg);
|
|
106
|
+
}
|
|
107
|
+
uint64_t GetFileSize(const IOOptions& options, IODebugContext* dbg) override {
|
|
108
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
109
|
+
return target()->GetFileSize(options, dbg);
|
|
110
|
+
}
|
|
111
|
+
IOStatus RangeSync(uint64_t offset, uint64_t nbytes, const IOOptions& options,
|
|
112
|
+
IODebugContext* dbg) override {
|
|
113
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
114
|
+
return target()->RangeSync(offset, nbytes, options, dbg);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
void PrepareWrite(size_t offset, size_t len, const IOOptions& options,
|
|
118
|
+
IODebugContext* dbg) override {
|
|
119
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
120
|
+
target()->PrepareWrite(offset, len, options, dbg);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
IOStatus Allocate(uint64_t offset, uint64_t len, const IOOptions& options,
|
|
124
|
+
IODebugContext* dbg) override {
|
|
125
|
+
EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
|
|
126
|
+
return target()->Allocate(offset, len, options, dbg);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private:
|
|
130
|
+
Env::IOPriority write_io_priority_;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Mock FSRandomAccessFile for testing io priority.
|
|
134
|
+
// Only override the essential functions for testing compaction io priority.
|
|
135
|
+
class MockTestRandomAccessFile : public FSRandomAccessFileOwnerWrapper {
|
|
136
|
+
public:
|
|
137
|
+
MockTestRandomAccessFile(std::unique_ptr<FSRandomAccessFile>&& file,
|
|
138
|
+
Env::IOPriority io_priority)
|
|
139
|
+
: FSRandomAccessFileOwnerWrapper(std::move(file)),
|
|
140
|
+
read_io_priority_(io_priority) {}
|
|
141
|
+
|
|
142
|
+
IOStatus Read(uint64_t offset, size_t n, const IOOptions& options,
|
|
143
|
+
Slice* result, char* scratch,
|
|
144
|
+
IODebugContext* dbg) const override {
|
|
145
|
+
EXPECT_EQ(options.rate_limiter_priority, read_io_priority_);
|
|
146
|
+
return target()->Read(offset, n, options, result, scratch, dbg);
|
|
147
|
+
}
|
|
148
|
+
IOStatus Prefetch(uint64_t offset, size_t n, const IOOptions& options,
|
|
149
|
+
IODebugContext* dbg) override {
|
|
150
|
+
EXPECT_EQ(options.rate_limiter_priority, read_io_priority_);
|
|
151
|
+
return target()->Prefetch(offset, n, options, dbg);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private:
|
|
155
|
+
Env::IOPriority read_io_priority_;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Mock FileSystem for testing io priority.
|
|
159
|
+
class MockTestFileSystem : public FileSystemWrapper {
|
|
160
|
+
public:
|
|
161
|
+
explicit MockTestFileSystem(const std::shared_ptr<FileSystem>& base,
|
|
162
|
+
Env::IOPriority read_io_priority,
|
|
163
|
+
Env::IOPriority write_io_priority)
|
|
164
|
+
: FileSystemWrapper(base),
|
|
165
|
+
read_io_priority_(read_io_priority),
|
|
166
|
+
write_io_priority_(write_io_priority) {}
|
|
167
|
+
|
|
168
|
+
static const char* kClassName() { return "MockTestFileSystem"; }
|
|
169
|
+
const char* Name() const override { return kClassName(); }
|
|
170
|
+
|
|
171
|
+
IOStatus NewRandomAccessFile(const std::string& fname,
|
|
172
|
+
const FileOptions& file_opts,
|
|
173
|
+
std::unique_ptr<FSRandomAccessFile>* result,
|
|
174
|
+
IODebugContext* dbg) override {
|
|
175
|
+
IOStatus s = target()->NewRandomAccessFile(fname, file_opts, result, dbg);
|
|
176
|
+
EXPECT_OK(s);
|
|
177
|
+
result->reset(
|
|
178
|
+
new MockTestRandomAccessFile(std::move(*result), read_io_priority_));
|
|
179
|
+
return s;
|
|
180
|
+
}
|
|
181
|
+
IOStatus NewWritableFile(const std::string& fname,
|
|
182
|
+
const FileOptions& file_opts,
|
|
183
|
+
std::unique_ptr<FSWritableFile>* result,
|
|
184
|
+
IODebugContext* dbg) override {
|
|
185
|
+
IOStatus s = target()->NewWritableFile(fname, file_opts, result, dbg);
|
|
186
|
+
EXPECT_OK(s);
|
|
187
|
+
result->reset(
|
|
188
|
+
new MockTestWritableFile(std::move(*result), write_io_priority_));
|
|
189
|
+
return s;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private:
|
|
193
|
+
Env::IOPriority read_io_priority_;
|
|
194
|
+
Env::IOPriority write_io_priority_;
|
|
195
|
+
};
|
|
196
|
+
|
|
72
197
|
} // namespace
|
|
73
198
|
|
|
74
199
|
class CompactionJobTestBase : public testing::Test {
|
|
75
200
|
protected:
|
|
76
201
|
CompactionJobTestBase(std::string dbname, const Comparator* ucmp,
|
|
77
|
-
std::function<std::string(uint64_t)> encode_u64_ts
|
|
202
|
+
std::function<std::string(uint64_t)> encode_u64_ts,
|
|
203
|
+
bool test_io_priority)
|
|
78
204
|
: dbname_(std::move(dbname)),
|
|
79
205
|
ucmp_(ucmp),
|
|
80
206
|
db_options_(),
|
|
@@ -90,7 +216,8 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
90
216
|
shutting_down_(false),
|
|
91
217
|
mock_table_factory_(new mock::MockTableFactory()),
|
|
92
218
|
error_handler_(nullptr, db_options_, &mutex_),
|
|
93
|
-
encode_u64_ts_(std::move(encode_u64_ts))
|
|
219
|
+
encode_u64_ts_(std::move(encode_u64_ts)),
|
|
220
|
+
test_io_priority_(test_io_priority) {
|
|
94
221
|
Env* base_env = Env::Default();
|
|
95
222
|
EXPECT_OK(
|
|
96
223
|
test::CreateEnvFromSystem(ConfigOptions(), &base_env, &env_guard_));
|
|
@@ -105,7 +232,12 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
105
232
|
db_options_.db_paths.emplace_back(dbname_,
|
|
106
233
|
std::numeric_limits<uint64_t>::max());
|
|
107
234
|
cf_options_.comparator = ucmp_;
|
|
108
|
-
|
|
235
|
+
if (test_io_priority_) {
|
|
236
|
+
BlockBasedTableOptions table_options;
|
|
237
|
+
cf_options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
238
|
+
} else {
|
|
239
|
+
cf_options_.table_factory = mock_table_factory_;
|
|
240
|
+
}
|
|
109
241
|
}
|
|
110
242
|
|
|
111
243
|
std::string GenerateFileName(uint64_t file_number) {
|
|
@@ -145,6 +277,33 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
145
277
|
return blob_index;
|
|
146
278
|
}
|
|
147
279
|
|
|
280
|
+
// Creates a table with the specificied key value pairs.
|
|
281
|
+
void CreateTable(const std::string& table_name,
|
|
282
|
+
const mock::KVVector& contents, uint64_t& file_size) {
|
|
283
|
+
std::unique_ptr<WritableFileWriter> file_writer;
|
|
284
|
+
Status s = WritableFileWriter::Create(fs_, table_name, FileOptions(),
|
|
285
|
+
&file_writer, nullptr);
|
|
286
|
+
ASSERT_OK(s);
|
|
287
|
+
std::unique_ptr<TableBuilder> table_builder(
|
|
288
|
+
cf_options_.table_factory->NewTableBuilder(
|
|
289
|
+
TableBuilderOptions(*cfd_->ioptions(), mutable_cf_options_,
|
|
290
|
+
cfd_->internal_comparator(),
|
|
291
|
+
cfd_->int_tbl_prop_collector_factories(),
|
|
292
|
+
CompressionType::kNoCompression,
|
|
293
|
+
CompressionOptions(), 0 /* column_family_id */,
|
|
294
|
+
kDefaultColumnFamilyName, -1 /* level */),
|
|
295
|
+
file_writer.get()));
|
|
296
|
+
// Build table.
|
|
297
|
+
for (auto kv : contents) {
|
|
298
|
+
std::string key;
|
|
299
|
+
std::string value;
|
|
300
|
+
std::tie(key, value) = kv;
|
|
301
|
+
table_builder->Add(key, value);
|
|
302
|
+
}
|
|
303
|
+
ASSERT_OK(table_builder->Finish());
|
|
304
|
+
file_size = table_builder->FileSize();
|
|
305
|
+
}
|
|
306
|
+
|
|
148
307
|
void AddMockFile(const mock::KVVector& contents, int level = 0) {
|
|
149
308
|
assert(contents.size() > 0);
|
|
150
309
|
|
|
@@ -198,11 +357,18 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
198
357
|
}
|
|
199
358
|
|
|
200
359
|
uint64_t file_number = versions_->NewFileNumber();
|
|
201
|
-
|
|
202
|
-
|
|
360
|
+
|
|
361
|
+
uint64_t file_size;
|
|
362
|
+
if (test_io_priority_) {
|
|
363
|
+
CreateTable(GenerateFileName(file_number), contents, file_size);
|
|
364
|
+
} else {
|
|
365
|
+
file_size = 10;
|
|
366
|
+
EXPECT_OK(mock_table_factory_->CreateMockTable(
|
|
367
|
+
env_, GenerateFileName(file_number), std::move(contents)));
|
|
368
|
+
}
|
|
203
369
|
|
|
204
370
|
VersionEdit edit;
|
|
205
|
-
edit.AddFile(level, file_number, 0,
|
|
371
|
+
edit.AddFile(level, file_number, 0, file_size, smallest_key, largest_key,
|
|
206
372
|
smallest_seqno, largest_seqno, false, Temperature::kUnknown,
|
|
207
373
|
oldest_blob_file_number, kUnknownOldestAncesterTime,
|
|
208
374
|
kUnknownFileCreationTime, kUnknownFileChecksum,
|
|
@@ -323,7 +489,15 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
323
489
|
SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber,
|
|
324
490
|
int output_level = 1, bool verify = true,
|
|
325
491
|
uint64_t expected_oldest_blob_file_number = kInvalidBlobFileNumber,
|
|
326
|
-
bool check_get_priority = false
|
|
492
|
+
bool check_get_priority = false,
|
|
493
|
+
Env::IOPriority read_io_priority = Env::IO_TOTAL,
|
|
494
|
+
Env::IOPriority write_io_priority = Env::IO_TOTAL) {
|
|
495
|
+
// For compaction, set fs as MockTestFileSystem to check the io_priority.
|
|
496
|
+
if (test_io_priority_) {
|
|
497
|
+
db_options_.fs.reset(
|
|
498
|
+
new MockTestFileSystem(fs_, read_io_priority, write_io_priority));
|
|
499
|
+
}
|
|
500
|
+
|
|
327
501
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
328
502
|
|
|
329
503
|
size_t num_input_files = 0;
|
|
@@ -353,6 +527,7 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
353
527
|
SnapshotChecker* snapshot_checker = nullptr;
|
|
354
528
|
ASSERT_TRUE(full_history_ts_low_.empty() ||
|
|
355
529
|
ucmp_->timestamp_size() == full_history_ts_low_.size());
|
|
530
|
+
const std::atomic<bool> kManualCompactionCanceledFalse{false};
|
|
356
531
|
CompactionJob compaction_job(
|
|
357
532
|
0, &compaction, db_options_, mutable_db_options_, env_options_,
|
|
358
533
|
versions_.get(), &shutting_down_, &log_buffer, nullptr, nullptr,
|
|
@@ -360,9 +535,9 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
360
535
|
earliest_write_conflict_snapshot, snapshot_checker, nullptr,
|
|
361
536
|
table_cache_, &event_logger, false, false, dbname_,
|
|
362
537
|
&compaction_job_stats_, Env::Priority::USER, nullptr /* IOTracer */,
|
|
363
|
-
/*
|
|
364
|
-
|
|
365
|
-
|
|
538
|
+
/*manual_compaction_canceled=*/kManualCompactionCanceledFalse,
|
|
539
|
+
env_->GenerateUniqueId(), DBImpl::GenerateDbSessionId(nullptr),
|
|
540
|
+
full_history_ts_low_);
|
|
366
541
|
VerifyInitializationOfCompactionJobStats(compaction_job_stats_);
|
|
367
542
|
|
|
368
543
|
compaction_job.Prepare();
|
|
@@ -444,15 +619,16 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
444
619
|
ErrorHandler error_handler_;
|
|
445
620
|
std::string full_history_ts_low_;
|
|
446
621
|
const std::function<std::string(uint64_t)> encode_u64_ts_;
|
|
622
|
+
bool test_io_priority_;
|
|
447
623
|
};
|
|
448
624
|
|
|
449
625
|
// TODO(icanadi) Make it simpler once we mock out VersionSet
|
|
450
626
|
class CompactionJobTest : public CompactionJobTestBase {
|
|
451
627
|
public:
|
|
452
628
|
CompactionJobTest()
|
|
453
|
-
: CompactionJobTestBase(
|
|
454
|
-
|
|
455
|
-
|
|
629
|
+
: CompactionJobTestBase(
|
|
630
|
+
test::PerThreadDBPath("compaction_job_test"), BytewiseComparator(),
|
|
631
|
+
[](uint64_t /*ts*/) { return ""; }, false) {}
|
|
456
632
|
};
|
|
457
633
|
|
|
458
634
|
TEST_F(CompactionJobTest, Simple) {
|
|
@@ -1342,23 +1518,13 @@ TEST_F(CompactionJobTest, ResultSerialization) {
|
|
|
1342
1518
|
}
|
|
1343
1519
|
}
|
|
1344
1520
|
|
|
1345
|
-
TEST_F(CompactionJobTest, GetRateLimiterPriority) {
|
|
1346
|
-
NewDB();
|
|
1347
|
-
|
|
1348
|
-
auto expected_results = CreateTwoFiles(false);
|
|
1349
|
-
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1350
|
-
auto files = cfd->current()->storage_info()->LevelFiles(0);
|
|
1351
|
-
ASSERT_EQ(2U, files.size());
|
|
1352
|
-
RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, true,
|
|
1353
|
-
kInvalidBlobFileNumber, true);
|
|
1354
|
-
}
|
|
1355
1521
|
|
|
1356
1522
|
class CompactionJobTimestampTest : public CompactionJobTestBase {
|
|
1357
1523
|
public:
|
|
1358
1524
|
CompactionJobTimestampTest()
|
|
1359
1525
|
: CompactionJobTestBase(test::PerThreadDBPath("compaction_job_ts_test"),
|
|
1360
1526
|
test::BytewiseComparatorWithU64TsWrapper(),
|
|
1361
|
-
test::EncodeInt) {}
|
|
1527
|
+
test::EncodeInt, false) {}
|
|
1362
1528
|
};
|
|
1363
1529
|
|
|
1364
1530
|
TEST_F(CompactionJobTimestampTest, GCDisabled) {
|
|
@@ -1474,6 +1640,69 @@ TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
|
|
|
1474
1640
|
RunCompaction({files}, expected_results);
|
|
1475
1641
|
}
|
|
1476
1642
|
|
|
1643
|
+
// The io priority of the compaction reads and writes are different from
|
|
1644
|
+
// other DB reads and writes. To prepare the compaction input files, use the
|
|
1645
|
+
// default filesystem from Env. To test the io priority of the compaction
|
|
1646
|
+
// reads and writes, db_options_.fs is set as MockTestFileSystem.
|
|
1647
|
+
class CompactionJobIOPriorityTest : public CompactionJobTestBase {
|
|
1648
|
+
public:
|
|
1649
|
+
CompactionJobIOPriorityTest()
|
|
1650
|
+
: CompactionJobTestBase(
|
|
1651
|
+
test::PerThreadDBPath("compaction_job_io_priority_test"),
|
|
1652
|
+
BytewiseComparator(), [](uint64_t /*ts*/) { return ""; }, true) {}
|
|
1653
|
+
};
|
|
1654
|
+
|
|
1655
|
+
TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
|
|
1656
|
+
// When the state from WriteController is normal.
|
|
1657
|
+
NewDB();
|
|
1658
|
+
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1659
|
+
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1660
|
+
auto files = cfd->current()->storage_info()->LevelFiles(0);
|
|
1661
|
+
ASSERT_EQ(2U, files.size());
|
|
1662
|
+
RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
|
|
1663
|
+
kInvalidBlobFileNumber, false, Env::IO_LOW, Env::IO_LOW);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
|
|
1667
|
+
// When the state from WriteController is Delayed.
|
|
1668
|
+
NewDB();
|
|
1669
|
+
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1670
|
+
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1671
|
+
auto files = cfd->current()->storage_info()->LevelFiles(0);
|
|
1672
|
+
ASSERT_EQ(2U, files.size());
|
|
1673
|
+
{
|
|
1674
|
+
std::unique_ptr<WriteControllerToken> delay_token =
|
|
1675
|
+
write_controller_.GetDelayToken(1000000);
|
|
1676
|
+
RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
|
|
1677
|
+
kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
TEST_F(CompactionJobIOPriorityTest, WriteControllerStateStalled) {
|
|
1682
|
+
// When the state from WriteController is Stalled.
|
|
1683
|
+
NewDB();
|
|
1684
|
+
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1685
|
+
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1686
|
+
auto files = cfd->current()->storage_info()->LevelFiles(0);
|
|
1687
|
+
ASSERT_EQ(2U, files.size());
|
|
1688
|
+
{
|
|
1689
|
+
std::unique_ptr<WriteControllerToken> stop_token =
|
|
1690
|
+
write_controller_.GetStopToken();
|
|
1691
|
+
RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
|
|
1692
|
+
kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
TEST_F(CompactionJobIOPriorityTest, GetRateLimiterPriority) {
|
|
1697
|
+
NewDB();
|
|
1698
|
+
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1699
|
+
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1700
|
+
auto files = cfd->current()->storage_info()->LevelFiles(0);
|
|
1701
|
+
ASSERT_EQ(2U, files.size());
|
|
1702
|
+
RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
|
|
1703
|
+
kInvalidBlobFileNumber, true, Env::IO_LOW, Env::IO_LOW);
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1477
1706
|
} // namespace ROCKSDB_NAMESPACE
|
|
1478
1707
|
|
|
1479
1708
|
int main(int argc, char** argv) {
|
|
@@ -640,7 +640,11 @@ Compaction* CompactionPicker::CompactRange(
|
|
|
640
640
|
GetCompressionType(vstorage, mutable_cf_options, output_level, 1),
|
|
641
641
|
GetCompressionOptions(mutable_cf_options, vstorage, output_level),
|
|
642
642
|
Temperature::kUnknown, compact_range_options.max_subcompactions,
|
|
643
|
-
/* grandparents */ {}, /* is manual */ true, trim_ts
|
|
643
|
+
/* grandparents */ {}, /* is manual */ true, trim_ts, /* score */ -1,
|
|
644
|
+
/* deletion_compaction */ false, CompactionReason::kUnknown,
|
|
645
|
+
compact_range_options.blob_garbage_collection_policy,
|
|
646
|
+
compact_range_options.blob_garbage_collection_age_cutoff);
|
|
647
|
+
|
|
644
648
|
RegisterCompaction(c);
|
|
645
649
|
vstorage->ComputeCompactionScore(ioptions_, mutable_cf_options);
|
|
646
650
|
return c;
|
|
@@ -818,8 +822,10 @@ Compaction* CompactionPicker::CompactRange(
|
|
|
818
822
|
vstorage->base_level()),
|
|
819
823
|
GetCompressionOptions(mutable_cf_options, vstorage, output_level),
|
|
820
824
|
Temperature::kUnknown, compact_range_options.max_subcompactions,
|
|
821
|
-
std::move(grandparents),
|
|
822
|
-
/*
|
|
825
|
+
std::move(grandparents), /* is manual */ true, trim_ts, /* score */ -1,
|
|
826
|
+
/* deletion_compaction */ false, CompactionReason::kUnknown,
|
|
827
|
+
compact_range_options.blob_garbage_collection_policy,
|
|
828
|
+
compact_range_options.blob_garbage_collection_age_cutoff);
|
|
823
829
|
|
|
824
830
|
TEST_SYNC_POINT_CALLBACK("CompactionPicker::CompactRange:Return", compaction);
|
|
825
831
|
RegisterCompaction(compaction);
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
#include "db/db_test_util.h"
|
|
9
9
|
#include "port/stack_trace.h"
|
|
10
|
+
#include "table/unique_id_impl.h"
|
|
10
11
|
|
|
11
12
|
namespace ROCKSDB_NAMESPACE {
|
|
12
13
|
|
|
@@ -294,8 +295,8 @@ TEST_F(CompactionServiceTest, BasicCompactions) {
|
|
|
294
295
|
SyncPoint::GetInstance()->SetCallBack(
|
|
295
296
|
"Version::VerifySstUniqueIds::Passed", [&](void* arg) {
|
|
296
297
|
// override job status
|
|
297
|
-
auto id = static_cast<
|
|
298
|
-
assert(
|
|
298
|
+
auto id = static_cast<UniqueId64x2*>(arg);
|
|
299
|
+
assert(*id != kNullUniqueId64x2);
|
|
299
300
|
verify_passed++;
|
|
300
301
|
});
|
|
301
302
|
SyncPoint::GetInstance()->EnableProcessing();
|
|
@@ -1065,7 +1065,7 @@ INSTANTIATE_TEST_CASE_P(CorruptionTest, CrashDuringRecoveryWithCorruptionTest,
|
|
|
1065
1065
|
// The combination of corrupting a WAL and injecting an error during subsequent
|
|
1066
1066
|
// re-open exposes the bug of prematurely persisting a new MANIFEST with
|
|
1067
1067
|
// advanced ColumnFamilyData::log_number.
|
|
1068
|
-
TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
1068
|
+
TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
|
|
1069
1069
|
CloseDb();
|
|
1070
1070
|
Options options;
|
|
1071
1071
|
options.track_and_verify_wals_in_manifest =
|
|
@@ -1107,7 +1107,8 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
|
|
|
1107
1107
|
// number. TEST_SwitchMemtable makes sure WALs are not synced and test can
|
|
1108
1108
|
// corrupt un-sync WAL.
|
|
1109
1109
|
for (int i = 0; i < 2; ++i) {
|
|
1110
|
-
ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
|
|
1110
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
|
|
1111
|
+
"value" + std::to_string(i)));
|
|
1111
1112
|
ASSERT_OK(dbimpl->TEST_SwitchMemtable());
|
|
1112
1113
|
}
|
|
1113
1114
|
|
|
@@ -1188,6 +1189,23 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
|
|
|
1188
1189
|
{
|
|
1189
1190
|
options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
|
|
1190
1191
|
ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
|
|
1192
|
+
|
|
1193
|
+
// Verify that data is not lost.
|
|
1194
|
+
{
|
|
1195
|
+
std::string v;
|
|
1196
|
+
ASSERT_OK(db_->Get(ReadOptions(), handles[1], "old_key", &v));
|
|
1197
|
+
ASSERT_EQ("dontcare", v);
|
|
1198
|
+
|
|
1199
|
+
v.clear();
|
|
1200
|
+
ASSERT_OK(db_->Get(ReadOptions(), "key" + std::to_string(0), &v));
|
|
1201
|
+
ASSERT_EQ("value" + std::to_string(0), v);
|
|
1202
|
+
|
|
1203
|
+
// Since it's corrupting second last wal, below key is not found.
|
|
1204
|
+
v.clear();
|
|
1205
|
+
ASSERT_EQ(db_->Get(ReadOptions(), "key" + std::to_string(1), &v),
|
|
1206
|
+
Status::NotFound());
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1191
1209
|
for (auto* h : handles) {
|
|
1192
1210
|
delete h;
|
|
1193
1211
|
}
|
|
@@ -1219,8 +1237,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
|
|
|
1219
1237
|
// The combination of corrupting a WAL and injecting an error during subsequent
|
|
1220
1238
|
// re-open exposes the bug of prematurely persisting a new MANIFEST with
|
|
1221
1239
|
// advanced ColumnFamilyData::log_number.
|
|
1222
|
-
TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
1223
|
-
DISABLED_TxnDbCrashDuringRecovery) {
|
|
1240
|
+
TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
|
|
1224
1241
|
CloseDb();
|
|
1225
1242
|
Options options;
|
|
1226
1243
|
options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
|
|
@@ -1271,13 +1288,14 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1271
1288
|
|
|
1272
1289
|
// Put and flush cf0
|
|
1273
1290
|
for (int i = 0; i < 2; ++i) {
|
|
1274
|
-
ASSERT_OK(txn_db->Put(WriteOptions(), "
|
|
1291
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), "key" + std::to_string(i),
|
|
1292
|
+
"value" + std::to_string(i)));
|
|
1275
1293
|
ASSERT_OK(dbimpl->TEST_SwitchMemtable());
|
|
1276
1294
|
}
|
|
1277
1295
|
|
|
1278
1296
|
// Put cf1
|
|
1279
1297
|
txn = txn_db->BeginTransaction(WriteOptions(), TransactionOptions());
|
|
1280
|
-
ASSERT_OK(txn->Put(handles[1], "foo1", "
|
|
1298
|
+
ASSERT_OK(txn->Put(handles[1], "foo1", "value1"));
|
|
1281
1299
|
ASSERT_OK(txn->Commit());
|
|
1282
1300
|
|
|
1283
1301
|
delete txn;
|
|
@@ -1337,7 +1355,6 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1337
1355
|
std::vector<uint64_t> file_nums;
|
|
1338
1356
|
GetSortedWalFiles(file_nums);
|
|
1339
1357
|
size_t size = file_nums.size();
|
|
1340
|
-
assert(size >= 2);
|
|
1341
1358
|
uint64_t log_num = file_nums[size - 1];
|
|
1342
1359
|
CorruptFileWithTruncation(FileType::kWalFile, log_num);
|
|
1343
1360
|
}
|
|
@@ -1354,6 +1371,27 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1354
1371
|
{
|
|
1355
1372
|
ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs,
|
|
1356
1373
|
&handles, &txn_db));
|
|
1374
|
+
|
|
1375
|
+
// Verify that data is not lost.
|
|
1376
|
+
{
|
|
1377
|
+
std::string v;
|
|
1378
|
+
// Key not visible since it's not committed.
|
|
1379
|
+
ASSERT_EQ(txn_db->Get(ReadOptions(), handles[1], "foo", &v),
|
|
1380
|
+
Status::NotFound());
|
|
1381
|
+
|
|
1382
|
+
v.clear();
|
|
1383
|
+
ASSERT_OK(txn_db->Get(ReadOptions(), "key" + std::to_string(0), &v));
|
|
1384
|
+
ASSERT_EQ("value" + std::to_string(0), v);
|
|
1385
|
+
|
|
1386
|
+
// Last WAL is corrupted which contains two keys below.
|
|
1387
|
+
v.clear();
|
|
1388
|
+
ASSERT_EQ(txn_db->Get(ReadOptions(), "key" + std::to_string(1), &v),
|
|
1389
|
+
Status::NotFound());
|
|
1390
|
+
v.clear();
|
|
1391
|
+
ASSERT_EQ(txn_db->Get(ReadOptions(), handles[1], "foo1", &v),
|
|
1392
|
+
Status::NotFound());
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1357
1395
|
for (auto* h : handles) {
|
|
1358
1396
|
delete h;
|
|
1359
1397
|
}
|
|
@@ -1396,8 +1434,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1396
1434
|
// The combination of corrupting a WAL and injecting an error during subsequent
|
|
1397
1435
|
// re-open exposes the bug of prematurely persisting a new MANIFEST with
|
|
1398
1436
|
// advanced ColumnFamilyData::log_number.
|
|
1399
|
-
TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
1400
|
-
DISABLED_CrashDuringRecoveryWithFlush) {
|
|
1437
|
+
TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecoveryWithFlush) {
|
|
1401
1438
|
CloseDb();
|
|
1402
1439
|
Options options;
|
|
1403
1440
|
options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
|
|
@@ -1430,7 +1467,8 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1430
1467
|
// Write to default_cf and flush this cf several times to advance wal
|
|
1431
1468
|
// number.
|
|
1432
1469
|
for (int i = 0; i < 2; ++i) {
|
|
1433
|
-
ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
|
|
1470
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
|
|
1471
|
+
"value" + std::to_string(i)));
|
|
1434
1472
|
ASSERT_OK(db_->Flush(FlushOptions()));
|
|
1435
1473
|
}
|
|
1436
1474
|
|
|
@@ -1483,6 +1521,25 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
|
|
|
1483
1521
|
{
|
|
1484
1522
|
options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
|
|
1485
1523
|
ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
|
|
1524
|
+
|
|
1525
|
+
// Verify that data is not lost.
|
|
1526
|
+
{
|
|
1527
|
+
std::string v;
|
|
1528
|
+
ASSERT_OK(db_->Get(ReadOptions(), handles[1], "old_key", &v));
|
|
1529
|
+
ASSERT_EQ("dontcare", v);
|
|
1530
|
+
|
|
1531
|
+
for (int i = 0; i < 2; ++i) {
|
|
1532
|
+
v.clear();
|
|
1533
|
+
ASSERT_OK(db_->Get(ReadOptions(), "key" + std::to_string(i), &v));
|
|
1534
|
+
ASSERT_EQ("value" + std::to_string(i), v);
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
// Since it's corrupting last wal after Flush, below key is not found.
|
|
1538
|
+
v.clear();
|
|
1539
|
+
ASSERT_EQ(db_->Get(ReadOptions(), handles[1], "dontcare", &v),
|
|
1540
|
+
Status::NotFound());
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1486
1543
|
for (auto* h : handles) {
|
|
1487
1544
|
delete h;
|
|
1488
1545
|
}
|