@nxtedition/rocksdb 7.1.14 → 7.1.16
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 +1 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
- package/deps/rocksdb/rocksdb/Makefile +91 -11
- package/deps/rocksdb/rocksdb/TARGETS +8 -4
- package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
- package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
- package/deps/rocksdb/rocksdb/db/c.cc +29 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
- package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
- package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
- package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
- package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
- package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
- package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
- package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
- package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
- package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
- package/deps/rocksdb/rocksdb/file/filename.h +4 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
- package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options.cc +2 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
- package/deps/rocksdb/rocksdb/src.mk +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +26 -29
- package/deps/rocksdb/rocksdb/table/format.h +44 -26
- package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
- package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
- package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
- package/deps/rocksdb/rocksdb/util/timer.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
- package/deps/rocksdb/rocksdb.gyp +0 -1
- package/index.js +6 -10
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
#include "db/db_impl/db_impl.h"
|
|
20
20
|
#include "db/error_handler.h"
|
|
21
21
|
#include "db/version_set.h"
|
|
22
|
+
#include "file/random_access_file_reader.h"
|
|
22
23
|
#include "file/writable_file_writer.h"
|
|
24
|
+
#include "options/options_helper.h"
|
|
23
25
|
#include "rocksdb/cache.h"
|
|
24
26
|
#include "rocksdb/convenience.h"
|
|
25
27
|
#include "rocksdb/db.h"
|
|
@@ -194,13 +196,15 @@ class MockTestFileSystem : public FileSystemWrapper {
|
|
|
194
196
|
Env::IOPriority write_io_priority_;
|
|
195
197
|
};
|
|
196
198
|
|
|
199
|
+
enum TableTypeForTest : uint8_t { kMockTable = 0, kBlockBasedTable = 1 };
|
|
200
|
+
|
|
197
201
|
} // namespace
|
|
198
202
|
|
|
199
203
|
class CompactionJobTestBase : public testing::Test {
|
|
200
204
|
protected:
|
|
201
205
|
CompactionJobTestBase(std::string dbname, const Comparator* ucmp,
|
|
202
206
|
std::function<std::string(uint64_t)> encode_u64_ts,
|
|
203
|
-
bool test_io_priority)
|
|
207
|
+
bool test_io_priority, TableTypeForTest table_type)
|
|
204
208
|
: dbname_(std::move(dbname)),
|
|
205
209
|
ucmp_(ucmp),
|
|
206
210
|
db_options_(),
|
|
@@ -217,7 +221,8 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
217
221
|
mock_table_factory_(new mock::MockTableFactory()),
|
|
218
222
|
error_handler_(nullptr, db_options_, &mutex_),
|
|
219
223
|
encode_u64_ts_(std::move(encode_u64_ts)),
|
|
220
|
-
test_io_priority_(test_io_priority)
|
|
224
|
+
test_io_priority_(test_io_priority),
|
|
225
|
+
table_type_(table_type) {
|
|
221
226
|
Env* base_env = Env::Default();
|
|
222
227
|
EXPECT_OK(
|
|
223
228
|
test::CreateEnvFromSystem(ConfigOptions(), &base_env, &env_guard_));
|
|
@@ -232,11 +237,13 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
232
237
|
db_options_.db_paths.emplace_back(dbname_,
|
|
233
238
|
std::numeric_limits<uint64_t>::max());
|
|
234
239
|
cf_options_.comparator = ucmp_;
|
|
235
|
-
if (
|
|
240
|
+
if (table_type_ == TableTypeForTest::kBlockBasedTable) {
|
|
236
241
|
BlockBasedTableOptions table_options;
|
|
237
242
|
cf_options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
238
|
-
} else {
|
|
243
|
+
} else if (table_type_ == TableTypeForTest::kMockTable) {
|
|
239
244
|
cf_options_.table_factory = mock_table_factory_;
|
|
245
|
+
} else {
|
|
246
|
+
assert(false);
|
|
240
247
|
}
|
|
241
248
|
}
|
|
242
249
|
|
|
@@ -358,13 +365,15 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
358
365
|
|
|
359
366
|
uint64_t file_number = versions_->NewFileNumber();
|
|
360
367
|
|
|
361
|
-
uint64_t file_size;
|
|
362
|
-
if (
|
|
368
|
+
uint64_t file_size = 0;
|
|
369
|
+
if (table_type_ == TableTypeForTest::kBlockBasedTable) {
|
|
363
370
|
CreateTable(GenerateFileName(file_number), contents, file_size);
|
|
364
|
-
} else {
|
|
371
|
+
} else if (table_type_ == TableTypeForTest::kMockTable) {
|
|
365
372
|
file_size = 10;
|
|
366
373
|
EXPECT_OK(mock_table_factory_->CreateMockTable(
|
|
367
374
|
env_, GenerateFileName(file_number), std::move(contents)));
|
|
375
|
+
} else {
|
|
376
|
+
assert(false);
|
|
368
377
|
}
|
|
369
378
|
|
|
370
379
|
VersionEdit edit;
|
|
@@ -377,10 +386,87 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
377
386
|
mutex_.Lock();
|
|
378
387
|
EXPECT_OK(
|
|
379
388
|
versions_->LogAndApply(versions_->GetColumnFamilySet()->GetDefault(),
|
|
380
|
-
mutable_cf_options_, &edit, &mutex_));
|
|
389
|
+
mutable_cf_options_, &edit, &mutex_, nullptr));
|
|
381
390
|
mutex_.Unlock();
|
|
382
391
|
}
|
|
383
392
|
|
|
393
|
+
void VerifyTables(int output_level,
|
|
394
|
+
const std::vector<mock::KVVector>& expected_results,
|
|
395
|
+
std::vector<uint64_t> expected_oldest_blob_file_numbers) {
|
|
396
|
+
if (expected_results.empty()) {
|
|
397
|
+
ASSERT_EQ(compaction_job_stats_.num_output_files, 0U);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
int expected_output_file_num = 0;
|
|
401
|
+
for (const auto& e : expected_results) {
|
|
402
|
+
if (!e.empty()) {
|
|
403
|
+
++expected_output_file_num;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
ASSERT_EQ(expected_output_file_num, compaction_job_stats_.num_output_files);
|
|
407
|
+
if (expected_output_file_num == 0) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (expected_oldest_blob_file_numbers.empty()) {
|
|
412
|
+
expected_oldest_blob_file_numbers.resize(expected_output_file_num,
|
|
413
|
+
kInvalidBlobFileNumber);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
417
|
+
if (table_type_ == TableTypeForTest::kMockTable) {
|
|
418
|
+
assert(expected_results.size() == 1);
|
|
419
|
+
mock_table_factory_->AssertLatestFile(expected_results[0]);
|
|
420
|
+
} else {
|
|
421
|
+
assert(table_type_ == TableTypeForTest::kBlockBasedTable);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
auto output_files =
|
|
425
|
+
cfd->current()->storage_info()->LevelFiles(output_level);
|
|
426
|
+
ASSERT_EQ(expected_output_file_num, output_files.size());
|
|
427
|
+
|
|
428
|
+
if (table_type_ == TableTypeForTest::kMockTable) {
|
|
429
|
+
assert(output_files.size() == 1);
|
|
430
|
+
const FileMetaData* const output_file = output_files[0];
|
|
431
|
+
ASSERT_EQ(output_file->oldest_blob_file_number,
|
|
432
|
+
expected_oldest_blob_file_numbers[0]);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
for (size_t i = 0; i < expected_results.size(); ++i) {
|
|
437
|
+
const FileMetaData* const output_file = output_files[i];
|
|
438
|
+
std::string file_name = GenerateFileName(output_file->fd.GetNumber());
|
|
439
|
+
const auto& fs = env_->GetFileSystem();
|
|
440
|
+
std::unique_ptr<RandomAccessFileReader> freader;
|
|
441
|
+
IOStatus ios = RandomAccessFileReader::Create(
|
|
442
|
+
fs, file_name, FileOptions(), &freader, nullptr);
|
|
443
|
+
ASSERT_OK(ios);
|
|
444
|
+
std::unique_ptr<TableReader> table_reader;
|
|
445
|
+
uint64_t file_size = output_file->fd.GetFileSize();
|
|
446
|
+
ReadOptions read_opts;
|
|
447
|
+
Status s = cf_options_.table_factory->NewTableReader(
|
|
448
|
+
read_opts,
|
|
449
|
+
TableReaderOptions(*cfd->ioptions(), nullptr, FileOptions(),
|
|
450
|
+
cfd_->internal_comparator()),
|
|
451
|
+
std::move(freader), file_size, &table_reader, false);
|
|
452
|
+
ASSERT_OK(s);
|
|
453
|
+
assert(table_reader);
|
|
454
|
+
std::unique_ptr<InternalIterator> iiter(
|
|
455
|
+
table_reader->NewIterator(read_opts, nullptr, nullptr, true,
|
|
456
|
+
TableReaderCaller::kUncategorized));
|
|
457
|
+
assert(iiter);
|
|
458
|
+
|
|
459
|
+
mock::KVVector from_db;
|
|
460
|
+
for (iiter->SeekToFirst(); iiter->Valid(); iiter->Next()) {
|
|
461
|
+
const Slice key = iiter->key();
|
|
462
|
+
const Slice value = iiter->value();
|
|
463
|
+
from_db.emplace_back(
|
|
464
|
+
make_pair(key.ToString(false), value.ToString(false)));
|
|
465
|
+
}
|
|
466
|
+
ASSERT_EQ(expected_results[i], from_db);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
384
470
|
void SetLastSequence(const SequenceNumber sequence_number) {
|
|
385
471
|
versions_->SetLastAllocatedSequence(sequence_number + 1);
|
|
386
472
|
versions_->SetLastPublishedSequence(sequence_number + 1);
|
|
@@ -439,6 +525,13 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
439
525
|
void NewDB() {
|
|
440
526
|
EXPECT_OK(DestroyDB(dbname_, Options()));
|
|
441
527
|
EXPECT_OK(env_->CreateDirIfMissing(dbname_));
|
|
528
|
+
|
|
529
|
+
std::shared_ptr<Logger> info_log;
|
|
530
|
+
DBOptions db_opts = BuildDBOptions(db_options_, mutable_db_options_);
|
|
531
|
+
Status s = CreateLoggerFromOptions(dbname_, db_opts, &info_log);
|
|
532
|
+
ASSERT_OK(s);
|
|
533
|
+
db_options_.info_log = info_log;
|
|
534
|
+
|
|
442
535
|
versions_.reset(
|
|
443
536
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
444
537
|
&write_buffer_manager_, &write_controller_,
|
|
@@ -455,9 +548,9 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
455
548
|
const std::string manifest = DescriptorFileName(dbname_, 1);
|
|
456
549
|
std::unique_ptr<WritableFileWriter> file_writer;
|
|
457
550
|
const auto& fs = env_->GetFileSystem();
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
551
|
+
s = WritableFileWriter::Create(fs, manifest,
|
|
552
|
+
fs->OptimizeForManifestWrite(env_options_),
|
|
553
|
+
&file_writer, nullptr);
|
|
461
554
|
|
|
462
555
|
ASSERT_OK(s);
|
|
463
556
|
{
|
|
@@ -481,27 +574,32 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
481
574
|
cfd_ = versions_->GetColumnFamilySet()->GetDefault();
|
|
482
575
|
}
|
|
483
576
|
|
|
577
|
+
// input_files[i] on input_levels[i]
|
|
484
578
|
void RunLastLevelCompaction(
|
|
485
579
|
const std::vector<std::vector<FileMetaData*>>& input_files,
|
|
580
|
+
const std::vector<int> input_levels,
|
|
486
581
|
std::function<void(Compaction& comp)>&& verify_func,
|
|
487
582
|
const std::vector<SequenceNumber>& snapshots = {}) {
|
|
488
583
|
const int kLastLevel = cf_options_.num_levels - 1;
|
|
489
584
|
verify_per_key_placement_ = std::move(verify_func);
|
|
490
585
|
mock::KVVector empty_map;
|
|
491
|
-
RunCompaction(input_files, empty_map, snapshots,
|
|
492
|
-
kLastLevel, false);
|
|
586
|
+
RunCompaction(input_files, input_levels, {empty_map}, snapshots,
|
|
587
|
+
kMaxSequenceNumber, kLastLevel, false);
|
|
493
588
|
}
|
|
494
589
|
|
|
590
|
+
// input_files[i] on input_levels[i]
|
|
495
591
|
void RunCompaction(
|
|
496
592
|
const std::vector<std::vector<FileMetaData*>>& input_files,
|
|
497
|
-
const
|
|
593
|
+
const std::vector<int>& input_levels,
|
|
594
|
+
const std::vector<mock::KVVector>& expected_results,
|
|
498
595
|
const std::vector<SequenceNumber>& snapshots = {},
|
|
499
596
|
SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber,
|
|
500
597
|
int output_level = 1, bool verify = true,
|
|
501
|
-
uint64_t
|
|
598
|
+
std::vector<uint64_t> expected_oldest_blob_file_numbers = {},
|
|
502
599
|
bool check_get_priority = false,
|
|
503
600
|
Env::IOPriority read_io_priority = Env::IO_TOTAL,
|
|
504
|
-
Env::IOPriority write_io_priority = Env::IO_TOTAL
|
|
601
|
+
Env::IOPriority write_io_priority = Env::IO_TOTAL,
|
|
602
|
+
int max_subcompactions = 0) {
|
|
505
603
|
// For compaction, set fs as MockTestFileSystem to check the io_priority.
|
|
506
604
|
if (test_io_priority_) {
|
|
507
605
|
db_options_.fs.reset(
|
|
@@ -512,10 +610,10 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
512
610
|
|
|
513
611
|
size_t num_input_files = 0;
|
|
514
612
|
std::vector<CompactionInputFiles> compaction_input_files;
|
|
515
|
-
for (size_t
|
|
516
|
-
auto level_files = input_files[
|
|
613
|
+
for (size_t i = 0; i < input_files.size(); ++i) {
|
|
614
|
+
auto level_files = input_files[i];
|
|
517
615
|
CompactionInputFiles compaction_level;
|
|
518
|
-
compaction_level.level =
|
|
616
|
+
compaction_level.level = input_levels[i];
|
|
519
617
|
compaction_level.files.insert(compaction_level.files.end(),
|
|
520
618
|
level_files.begin(), level_files.end());
|
|
521
619
|
compaction_input_files.push_back(compaction_level);
|
|
@@ -527,9 +625,10 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
527
625
|
*cfd->GetLatestMutableCFOptions(), mutable_db_options_,
|
|
528
626
|
compaction_input_files, output_level, 1024 * 1024, 10 * 1024 * 1024, 0,
|
|
529
627
|
kNoCompression, cfd->GetLatestMutableCFOptions()->compression_opts,
|
|
530
|
-
Temperature::kUnknown,
|
|
628
|
+
Temperature::kUnknown, max_subcompactions, {}, true);
|
|
531
629
|
compaction.SetInputVersion(cfd->current());
|
|
532
630
|
|
|
631
|
+
assert(db_options_.info_log);
|
|
533
632
|
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, db_options_.info_log.get());
|
|
534
633
|
mutex_.Lock();
|
|
535
634
|
EventLogger event_logger(db_options_.info_log.get());
|
|
@@ -559,23 +658,14 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
559
658
|
ASSERT_OK(compaction_job.Install(*cfd->GetLatestMutableCFOptions()));
|
|
560
659
|
ASSERT_OK(compaction_job.io_status());
|
|
561
660
|
mutex_.Unlock();
|
|
661
|
+
log_buffer.FlushBufferToLog();
|
|
562
662
|
|
|
563
663
|
if (verify) {
|
|
564
664
|
ASSERT_GE(compaction_job_stats_.elapsed_micros, 0U);
|
|
565
665
|
ASSERT_EQ(compaction_job_stats_.num_input_files, num_input_files);
|
|
566
666
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
} else {
|
|
570
|
-
ASSERT_EQ(compaction_job_stats_.num_output_files, 1U);
|
|
571
|
-
mock_table_factory_->AssertLatestFile(expected_results);
|
|
572
|
-
|
|
573
|
-
auto output_files =
|
|
574
|
-
cfd->current()->storage_info()->LevelFiles(output_level);
|
|
575
|
-
ASSERT_EQ(output_files.size(), 1);
|
|
576
|
-
ASSERT_EQ(output_files[0]->oldest_blob_file_number,
|
|
577
|
-
expected_oldest_blob_file_number);
|
|
578
|
-
}
|
|
667
|
+
VerifyTables(output_level, expected_results,
|
|
668
|
+
expected_oldest_blob_file_numbers);
|
|
579
669
|
}
|
|
580
670
|
|
|
581
671
|
if (check_get_priority) {
|
|
@@ -635,8 +725,9 @@ class CompactionJobTestBase : public testing::Test {
|
|
|
635
725
|
ErrorHandler error_handler_;
|
|
636
726
|
std::string full_history_ts_low_;
|
|
637
727
|
const std::function<std::string(uint64_t)> encode_u64_ts_;
|
|
638
|
-
bool test_io_priority_;
|
|
728
|
+
const bool test_io_priority_;
|
|
639
729
|
std::function<void(Compaction& comp)> verify_per_key_placement_;
|
|
730
|
+
const TableTypeForTest table_type_ = kMockTable;
|
|
640
731
|
};
|
|
641
732
|
|
|
642
733
|
// TODO(icanadi) Make it simpler once we mock out VersionSet
|
|
@@ -645,7 +736,8 @@ class CompactionJobTest : public CompactionJobTestBase {
|
|
|
645
736
|
CompactionJobTest()
|
|
646
737
|
: CompactionJobTestBase(
|
|
647
738
|
test::PerThreadDBPath("compaction_job_test"), BytewiseComparator(),
|
|
648
|
-
[](uint64_t /*ts*/) { return ""; }, false
|
|
739
|
+
[](uint64_t /*ts*/) { return ""; }, /*test_io_priority=*/false,
|
|
740
|
+
TableTypeForTest::kMockTable) {}
|
|
649
741
|
};
|
|
650
742
|
|
|
651
743
|
TEST_F(CompactionJobTest, Simple) {
|
|
@@ -653,9 +745,10 @@ TEST_F(CompactionJobTest, Simple) {
|
|
|
653
745
|
|
|
654
746
|
auto expected_results = CreateTwoFiles(false);
|
|
655
747
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
656
|
-
|
|
748
|
+
constexpr int input_level = 0;
|
|
749
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
657
750
|
ASSERT_EQ(2U, files.size());
|
|
658
|
-
RunCompaction({
|
|
751
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
659
752
|
}
|
|
660
753
|
|
|
661
754
|
TEST_F(CompactionJobTest, DISABLED_SimpleCorrupted) {
|
|
@@ -663,8 +756,9 @@ TEST_F(CompactionJobTest, DISABLED_SimpleCorrupted) {
|
|
|
663
756
|
|
|
664
757
|
auto expected_results = CreateTwoFiles(true);
|
|
665
758
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
666
|
-
|
|
667
|
-
|
|
759
|
+
constexpr int input_level = 0;
|
|
760
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
761
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
668
762
|
ASSERT_EQ(compaction_job_stats_.num_corrupt_keys, 400U);
|
|
669
763
|
}
|
|
670
764
|
|
|
@@ -683,8 +777,9 @@ TEST_F(CompactionJobTest, SimpleDeletion) {
|
|
|
683
777
|
mock::MakeMockFile({{KeyStr("b", 0U, kTypeValue), "val"}});
|
|
684
778
|
|
|
685
779
|
SetLastSequence(4U);
|
|
686
|
-
|
|
687
|
-
|
|
780
|
+
constexpr int input_level = 0;
|
|
781
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
782
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
688
783
|
}
|
|
689
784
|
|
|
690
785
|
TEST_F(CompactionJobTest, OutputNothing) {
|
|
@@ -701,8 +796,10 @@ TEST_F(CompactionJobTest, OutputNothing) {
|
|
|
701
796
|
auto expected_results = mock::MakeMockFile();
|
|
702
797
|
|
|
703
798
|
SetLastSequence(4U);
|
|
704
|
-
|
|
705
|
-
|
|
799
|
+
|
|
800
|
+
constexpr int input_level = 0;
|
|
801
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
802
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
706
803
|
}
|
|
707
804
|
|
|
708
805
|
TEST_F(CompactionJobTest, SimpleOverwrite) {
|
|
@@ -723,8 +820,9 @@ TEST_F(CompactionJobTest, SimpleOverwrite) {
|
|
|
723
820
|
{KeyStr("b", 0U, kTypeValue), "val3"}});
|
|
724
821
|
|
|
725
822
|
SetLastSequence(4U);
|
|
726
|
-
|
|
727
|
-
|
|
823
|
+
constexpr int input_level = 0;
|
|
824
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
825
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
728
826
|
}
|
|
729
827
|
|
|
730
828
|
TEST_F(CompactionJobTest, SimpleNonLastLevel) {
|
|
@@ -751,9 +849,12 @@ TEST_F(CompactionJobTest, SimpleNonLastLevel) {
|
|
|
751
849
|
{KeyStr("b", 6U, kTypeValue), "val3"}});
|
|
752
850
|
|
|
753
851
|
SetLastSequence(6U);
|
|
754
|
-
|
|
755
|
-
auto
|
|
756
|
-
|
|
852
|
+
const std::vector<int> input_levels = {0, 1};
|
|
853
|
+
auto lvl0_files =
|
|
854
|
+
cfd_->current()->storage_info()->LevelFiles(input_levels[0]);
|
|
855
|
+
auto lvl1_files =
|
|
856
|
+
cfd_->current()->storage_info()->LevelFiles(input_levels[1]);
|
|
857
|
+
RunCompaction({lvl0_files, lvl1_files}, input_levels, {expected_results});
|
|
757
858
|
}
|
|
758
859
|
|
|
759
860
|
TEST_F(CompactionJobTest, SimpleMerge) {
|
|
@@ -776,8 +877,9 @@ TEST_F(CompactionJobTest, SimpleMerge) {
|
|
|
776
877
|
{KeyStr("b", 0U, kTypeValue), "1,2"}});
|
|
777
878
|
|
|
778
879
|
SetLastSequence(5U);
|
|
779
|
-
|
|
780
|
-
|
|
880
|
+
constexpr int input_level = 0;
|
|
881
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
882
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
781
883
|
}
|
|
782
884
|
|
|
783
885
|
TEST_F(CompactionJobTest, NonAssocMerge) {
|
|
@@ -800,8 +902,9 @@ TEST_F(CompactionJobTest, NonAssocMerge) {
|
|
|
800
902
|
{KeyStr("b", 0U, kTypeValue), "1,2"}});
|
|
801
903
|
|
|
802
904
|
SetLastSequence(5U);
|
|
803
|
-
|
|
804
|
-
|
|
905
|
+
constexpr int input_level = 0;
|
|
906
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
907
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
805
908
|
}
|
|
806
909
|
|
|
807
910
|
// Filters merge operands with value 10.
|
|
@@ -827,8 +930,9 @@ TEST_F(CompactionJobTest, MergeOperandFilter) {
|
|
|
827
930
|
{KeyStr("b", 0U, kTypeValue), test::EncodeInt(2U)}});
|
|
828
931
|
|
|
829
932
|
SetLastSequence(5U);
|
|
830
|
-
|
|
831
|
-
|
|
933
|
+
constexpr int input_level = 0;
|
|
934
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
935
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
832
936
|
}
|
|
833
937
|
|
|
834
938
|
TEST_F(CompactionJobTest, FilterSomeMergeOperands) {
|
|
@@ -863,8 +967,9 @@ TEST_F(CompactionJobTest, FilterSomeMergeOperands) {
|
|
|
863
967
|
});
|
|
864
968
|
|
|
865
969
|
SetLastSequence(5U);
|
|
866
|
-
|
|
867
|
-
|
|
970
|
+
constexpr int input_level = 0;
|
|
971
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
972
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
868
973
|
}
|
|
869
974
|
|
|
870
975
|
// Test where all operands/merge results are filtered out.
|
|
@@ -897,10 +1002,11 @@ TEST_F(CompactionJobTest, FilterAllMergeOperands) {
|
|
|
897
1002
|
AddMockFile(file3, 2);
|
|
898
1003
|
|
|
899
1004
|
SetLastSequence(11U);
|
|
900
|
-
|
|
1005
|
+
constexpr int input_level = 0;
|
|
1006
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
901
1007
|
|
|
902
1008
|
mock::KVVector empty_map;
|
|
903
|
-
RunCompaction({files}, empty_map);
|
|
1009
|
+
RunCompaction({files}, {input_level}, {empty_map});
|
|
904
1010
|
}
|
|
905
1011
|
|
|
906
1012
|
TEST_F(CompactionJobTest, SimpleSingleDelete) {
|
|
@@ -925,8 +1031,9 @@ TEST_F(CompactionJobTest, SimpleSingleDelete) {
|
|
|
925
1031
|
mock::MakeMockFile({{KeyStr("a", 5U, kTypeDeletion), ""}});
|
|
926
1032
|
|
|
927
1033
|
SetLastSequence(6U);
|
|
928
|
-
|
|
929
|
-
|
|
1034
|
+
constexpr int input_level = 0;
|
|
1035
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1036
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
930
1037
|
}
|
|
931
1038
|
|
|
932
1039
|
TEST_F(CompactionJobTest, SingleDeleteSnapshots) {
|
|
@@ -990,8 +1097,9 @@ TEST_F(CompactionJobTest, SingleDeleteSnapshots) {
|
|
|
990
1097
|
});
|
|
991
1098
|
|
|
992
1099
|
SetLastSequence(22U);
|
|
993
|
-
|
|
994
|
-
|
|
1100
|
+
constexpr int input_level = 0;
|
|
1101
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1102
|
+
RunCompaction({files}, {input_level}, {expected_results}, {10U, 20U}, 10U);
|
|
995
1103
|
}
|
|
996
1104
|
|
|
997
1105
|
TEST_F(CompactionJobTest, EarliestWriteConflictSnapshot) {
|
|
@@ -1068,8 +1176,10 @@ TEST_F(CompactionJobTest, EarliestWriteConflictSnapshot) {
|
|
|
1068
1176
|
});
|
|
1069
1177
|
|
|
1070
1178
|
SetLastSequence(24U);
|
|
1071
|
-
|
|
1072
|
-
|
|
1179
|
+
constexpr int input_level = 0;
|
|
1180
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1181
|
+
RunCompaction({files}, {input_level}, {expected_results}, {10U, 20U, 30U},
|
|
1182
|
+
20U);
|
|
1073
1183
|
}
|
|
1074
1184
|
|
|
1075
1185
|
TEST_F(CompactionJobTest, SingleDeleteZeroSeq) {
|
|
@@ -1091,8 +1201,9 @@ TEST_F(CompactionJobTest, SingleDeleteZeroSeq) {
|
|
|
1091
1201
|
});
|
|
1092
1202
|
|
|
1093
1203
|
SetLastSequence(22U);
|
|
1094
|
-
|
|
1095
|
-
|
|
1204
|
+
constexpr int input_level = 0;
|
|
1205
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1206
|
+
RunCompaction({files}, {input_level}, {expected_results}, {});
|
|
1096
1207
|
}
|
|
1097
1208
|
|
|
1098
1209
|
TEST_F(CompactionJobTest, MultiSingleDelete) {
|
|
@@ -1246,8 +1357,9 @@ TEST_F(CompactionJobTest, MultiSingleDelete) {
|
|
|
1246
1357
|
{KeyStr("M", 3U, kTypeSingleDeletion), ""}});
|
|
1247
1358
|
|
|
1248
1359
|
SetLastSequence(22U);
|
|
1249
|
-
|
|
1250
|
-
|
|
1360
|
+
constexpr int input_level = 0;
|
|
1361
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1362
|
+
RunCompaction({files}, {input_level}, {expected_results}, {10U}, 10U);
|
|
1251
1363
|
}
|
|
1252
1364
|
|
|
1253
1365
|
// This test documents the behavior where a corrupt key follows a deletion or a
|
|
@@ -1276,8 +1388,9 @@ TEST_F(CompactionJobTest, DISABLED_CorruptionAfterDeletion) {
|
|
|
1276
1388
|
{test::KeyStr("c", 0U, kTypeValue), "val2"}});
|
|
1277
1389
|
|
|
1278
1390
|
SetLastSequence(6U);
|
|
1279
|
-
|
|
1280
|
-
|
|
1391
|
+
constexpr int input_level = 0;
|
|
1392
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1393
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1281
1394
|
}
|
|
1282
1395
|
|
|
1283
1396
|
TEST_F(CompactionJobTest, OldestBlobFileNumber) {
|
|
@@ -1322,10 +1435,12 @@ TEST_F(CompactionJobTest, OldestBlobFileNumber) {
|
|
|
1322
1435
|
expected_blob4, expected_blob5, expected_blob6});
|
|
1323
1436
|
|
|
1324
1437
|
SetLastSequence(6U);
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1438
|
+
constexpr int input_level = 0;
|
|
1439
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1440
|
+
RunCompaction({files}, {input_level}, {expected_results},
|
|
1441
|
+
std::vector<SequenceNumber>(), kMaxSequenceNumber,
|
|
1442
|
+
/* output_level */ 1, /* verify */ true,
|
|
1443
|
+
/* expected_oldest_blob_file_numbers */ {19});
|
|
1329
1444
|
}
|
|
1330
1445
|
|
|
1331
1446
|
TEST_F(CompactionJobTest, VerifyPenultimateLevelOutput) {
|
|
@@ -1377,13 +1492,15 @@ TEST_F(CompactionJobTest, VerifyPenultimateLevelOutput) {
|
|
|
1377
1492
|
AddMockFile(file3_2, 3);
|
|
1378
1493
|
|
|
1379
1494
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1380
|
-
|
|
1381
|
-
auto
|
|
1382
|
-
auto
|
|
1383
|
-
auto
|
|
1495
|
+
const std::vector<int> input_levels = {0, 1, 2, 3};
|
|
1496
|
+
auto files0 = cfd->current()->storage_info()->LevelFiles(input_levels[0]);
|
|
1497
|
+
auto files1 = cfd->current()->storage_info()->LevelFiles(input_levels[1]);
|
|
1498
|
+
auto files2 = cfd->current()->storage_info()->LevelFiles(input_levels[2]);
|
|
1499
|
+
auto files3 = cfd->current()->storage_info()->LevelFiles(input_levels[3]);
|
|
1384
1500
|
|
|
1385
1501
|
RunLastLevelCompaction(
|
|
1386
|
-
{files0, files1, files2, files3},
|
|
1502
|
+
{files0, files1, files2, files3}, input_levels,
|
|
1503
|
+
/*verify_func=*/[&](Compaction& comp) {
|
|
1387
1504
|
for (char c = 'a'; c <= 'z'; c++) {
|
|
1388
1505
|
std::string c_str;
|
|
1389
1506
|
c_str = c;
|
|
@@ -1408,8 +1525,9 @@ TEST_F(CompactionJobTest, NoEnforceSingleDeleteContract) {
|
|
|
1408
1525
|
SetLastSequence(4U);
|
|
1409
1526
|
|
|
1410
1527
|
auto expected_results = mock::MakeMockFile();
|
|
1411
|
-
|
|
1412
|
-
|
|
1528
|
+
constexpr int input_level = 0;
|
|
1529
|
+
auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1530
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1413
1531
|
}
|
|
1414
1532
|
|
|
1415
1533
|
TEST_F(CompactionJobTest, InputSerialization) {
|
|
@@ -1609,7 +1727,8 @@ class CompactionJobTimestampTest : public CompactionJobTestBase {
|
|
|
1609
1727
|
CompactionJobTimestampTest()
|
|
1610
1728
|
: CompactionJobTestBase(test::PerThreadDBPath("compaction_job_ts_test"),
|
|
1611
1729
|
test::BytewiseComparatorWithU64TsWrapper(),
|
|
1612
|
-
test::EncodeInt, false
|
|
1730
|
+
test::EncodeInt, /*test_io_priority=*/false,
|
|
1731
|
+
TableTypeForTest::kMockTable) {}
|
|
1613
1732
|
};
|
|
1614
1733
|
|
|
1615
1734
|
TEST_F(CompactionJobTimestampTest, GCDisabled) {
|
|
@@ -1641,8 +1760,9 @@ TEST_F(CompactionJobTimestampTest, GCDisabled) {
|
|
|
1641
1760
|
{KeyStr("c", 4, ValueType::kTypeValue, 94), "c5"},
|
|
1642
1761
|
{KeyStr("d", 7, ValueType::kTypeValue, 97), "d7"},
|
|
1643
1762
|
{KeyStr("d", 3, ValueType::kTypeSingleDeletion, 93), ""}});
|
|
1644
|
-
|
|
1645
|
-
|
|
1763
|
+
constexpr int input_level = 0;
|
|
1764
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1765
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1646
1766
|
}
|
|
1647
1767
|
|
|
1648
1768
|
TEST_F(CompactionJobTimestampTest, NoKeyExpired) {
|
|
@@ -1667,10 +1787,11 @@ TEST_F(CompactionJobTimestampTest, NoKeyExpired) {
|
|
|
1667
1787
|
{KeyStr("b", 7, ValueType::kTypeValue, 101), "b7"},
|
|
1668
1788
|
{KeyStr("c", 5, ValueType::kTypeValue, 99), "c5"},
|
|
1669
1789
|
{KeyStr("c", 3, ValueType::kTypeValue, 97), "c3"}});
|
|
1670
|
-
|
|
1790
|
+
constexpr int input_level = 0;
|
|
1791
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1671
1792
|
|
|
1672
1793
|
full_history_ts_low_ = encode_u64_ts_(0);
|
|
1673
|
-
RunCompaction({files}, expected_results);
|
|
1794
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1674
1795
|
}
|
|
1675
1796
|
|
|
1676
1797
|
TEST_F(CompactionJobTimestampTest, AllKeysExpired) {
|
|
@@ -1693,10 +1814,11 @@ TEST_F(CompactionJobTimestampTest, AllKeysExpired) {
|
|
|
1693
1814
|
|
|
1694
1815
|
auto expected_results =
|
|
1695
1816
|
mock::MakeMockFile({{KeyStr("c", 0, ValueType::kTypeValue, 0), "c7"}});
|
|
1696
|
-
|
|
1817
|
+
constexpr int input_level = 0;
|
|
1818
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1697
1819
|
|
|
1698
1820
|
full_history_ts_low_ = encode_u64_ts_(std::numeric_limits<uint64_t>::max());
|
|
1699
|
-
RunCompaction({files}, expected_results);
|
|
1821
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1700
1822
|
}
|
|
1701
1823
|
|
|
1702
1824
|
TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
|
|
@@ -1719,10 +1841,121 @@ TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
|
|
|
1719
1841
|
mock::MakeMockFile({{KeyStr("a", 5, ValueType::kTypeValue, 50), "a5"},
|
|
1720
1842
|
{KeyStr("a", 0, ValueType::kTypeValue, 0), "a3"},
|
|
1721
1843
|
{KeyStr("b", 6, ValueType::kTypeValue, 49), "b6"}});
|
|
1722
|
-
|
|
1844
|
+
constexpr int input_level = 0;
|
|
1845
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1723
1846
|
|
|
1724
1847
|
full_history_ts_low_ = encode_u64_ts_(49);
|
|
1725
|
-
RunCompaction({files}, expected_results);
|
|
1848
|
+
RunCompaction({files}, {input_level}, {expected_results});
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1851
|
+
class CompactionJobTimestampTestWithBbTable : public CompactionJobTestBase {
|
|
1852
|
+
public:
|
|
1853
|
+
// Block-based table is needed if we want to test subcompaction partitioning
|
|
1854
|
+
// with anchors.
|
|
1855
|
+
explicit CompactionJobTimestampTestWithBbTable()
|
|
1856
|
+
: CompactionJobTestBase(
|
|
1857
|
+
test::PerThreadDBPath("compaction_job_ts_bbt_test"),
|
|
1858
|
+
test::BytewiseComparatorWithU64TsWrapper(), test::EncodeInt,
|
|
1859
|
+
/*test_io_priority=*/false, TableTypeForTest::kBlockBasedTable) {}
|
|
1860
|
+
};
|
|
1861
|
+
|
|
1862
|
+
TEST_F(CompactionJobTimestampTestWithBbTable, SubcompactionAnchorL1) {
|
|
1863
|
+
cf_options_.target_file_size_base = 20;
|
|
1864
|
+
mutable_cf_options_.target_file_size_base = 20;
|
|
1865
|
+
NewDB();
|
|
1866
|
+
|
|
1867
|
+
const std::vector<std::string> keys = {
|
|
1868
|
+
KeyStr("a", 20, ValueType::kTypeValue, 200),
|
|
1869
|
+
KeyStr("b", 21, ValueType::kTypeValue, 210),
|
|
1870
|
+
KeyStr("b", 20, ValueType::kTypeValue, 200),
|
|
1871
|
+
KeyStr("b", 18, ValueType::kTypeValue, 180),
|
|
1872
|
+
KeyStr("c", 17, ValueType::kTypeValue, 170),
|
|
1873
|
+
KeyStr("c", 16, ValueType::kTypeValue, 160),
|
|
1874
|
+
KeyStr("c", 15, ValueType::kTypeValue, 150)};
|
|
1875
|
+
const std::vector<std::string> values = {"a20", "b21", "b20", "b18",
|
|
1876
|
+
"c17", "c16", "c15"};
|
|
1877
|
+
|
|
1878
|
+
constexpr int input_level = 1;
|
|
1879
|
+
|
|
1880
|
+
auto file1 = mock::MakeMockFile(
|
|
1881
|
+
{{keys[0], values[0]}, {keys[1], values[1]}, {keys[2], values[2]}});
|
|
1882
|
+
AddMockFile(file1, input_level);
|
|
1883
|
+
|
|
1884
|
+
auto file2 = mock::MakeMockFile(
|
|
1885
|
+
{{keys[3], values[3]}, {keys[4], values[4]}, {keys[5], values[5]}});
|
|
1886
|
+
AddMockFile(file2, input_level);
|
|
1887
|
+
|
|
1888
|
+
auto file3 = mock::MakeMockFile({{keys[6], values[6]}});
|
|
1889
|
+
AddMockFile(file3, input_level);
|
|
1890
|
+
|
|
1891
|
+
SetLastSequence(20);
|
|
1892
|
+
|
|
1893
|
+
auto output1 = mock::MakeMockFile({{keys[0], values[0]}});
|
|
1894
|
+
auto output2 = mock::MakeMockFile(
|
|
1895
|
+
{{keys[1], values[1]}, {keys[2], values[2]}, {keys[3], values[3]}});
|
|
1896
|
+
auto output3 = mock::MakeMockFile(
|
|
1897
|
+
{{keys[4], values[4]}, {keys[5], values[5]}, {keys[6], values[6]}});
|
|
1898
|
+
|
|
1899
|
+
auto expected_results =
|
|
1900
|
+
std::vector<mock::KVVector>{output1, output2, output3};
|
|
1901
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1902
|
+
|
|
1903
|
+
constexpr int output_level = 2;
|
|
1904
|
+
constexpr int max_subcompactions = 4;
|
|
1905
|
+
RunCompaction({files}, {input_level}, expected_results, /*snapshots=*/{},
|
|
1906
|
+
/*earliest_write_conflict_snapshot=*/kMaxSequenceNumber,
|
|
1907
|
+
output_level, /*verify=*/true, {kInvalidBlobFileNumber},
|
|
1908
|
+
/*check_get_priority=*/false, Env::IO_TOTAL, Env::IO_TOTAL,
|
|
1909
|
+
max_subcompactions);
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
TEST_F(CompactionJobTimestampTestWithBbTable, SubcompactionL0) {
|
|
1913
|
+
cf_options_.target_file_size_base = 20;
|
|
1914
|
+
mutable_cf_options_.target_file_size_base = 20;
|
|
1915
|
+
NewDB();
|
|
1916
|
+
|
|
1917
|
+
const std::vector<std::string> keys = {
|
|
1918
|
+
KeyStr("a", 20, ValueType::kTypeValue, 200),
|
|
1919
|
+
KeyStr("b", 20, ValueType::kTypeValue, 200),
|
|
1920
|
+
KeyStr("b", 19, ValueType::kTypeValue, 190),
|
|
1921
|
+
KeyStr("b", 18, ValueType::kTypeValue, 180),
|
|
1922
|
+
KeyStr("c", 17, ValueType::kTypeValue, 170),
|
|
1923
|
+
KeyStr("c", 16, ValueType::kTypeValue, 160),
|
|
1924
|
+
KeyStr("c", 15, ValueType::kTypeValue, 150)};
|
|
1925
|
+
const std::vector<std::string> values = {"a20", "b20", "b19", "b18",
|
|
1926
|
+
"c17", "c16", "c15"};
|
|
1927
|
+
|
|
1928
|
+
constexpr int input_level = 0;
|
|
1929
|
+
|
|
1930
|
+
auto file1 = mock::MakeMockFile({{keys[5], values[5]}, {keys[6], values[6]}});
|
|
1931
|
+
AddMockFile(file1, input_level);
|
|
1932
|
+
|
|
1933
|
+
auto file2 = mock::MakeMockFile({{keys[3], values[3]}, {keys[4], values[4]}});
|
|
1934
|
+
AddMockFile(file2, input_level);
|
|
1935
|
+
|
|
1936
|
+
auto file3 = mock::MakeMockFile(
|
|
1937
|
+
{{keys[0], values[0]}, {keys[1], values[1]}, {keys[2], values[2]}});
|
|
1938
|
+
AddMockFile(file3, input_level);
|
|
1939
|
+
|
|
1940
|
+
SetLastSequence(20);
|
|
1941
|
+
|
|
1942
|
+
auto output1 = mock::MakeMockFile({{keys[0], values[0]}});
|
|
1943
|
+
auto output2 = mock::MakeMockFile(
|
|
1944
|
+
{{keys[1], values[1]}, {keys[2], values[2]}, {keys[3], values[3]}});
|
|
1945
|
+
auto output3 = mock::MakeMockFile(
|
|
1946
|
+
{{keys[4], values[4]}, {keys[5], values[5]}, {keys[6], values[6]}});
|
|
1947
|
+
|
|
1948
|
+
auto expected_results =
|
|
1949
|
+
std::vector<mock::KVVector>{output1, output2, output3};
|
|
1950
|
+
const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
|
|
1951
|
+
|
|
1952
|
+
constexpr int output_level = 1;
|
|
1953
|
+
constexpr int max_subcompactions = 4;
|
|
1954
|
+
RunCompaction({files}, {input_level}, expected_results, /*snapshots=*/{},
|
|
1955
|
+
/*earliest_write_conflict_snapshot=*/kMaxSequenceNumber,
|
|
1956
|
+
output_level, /*verify=*/true, {kInvalidBlobFileNumber},
|
|
1957
|
+
/*check_get_priority=*/false, Env::IO_TOTAL, Env::IO_TOTAL,
|
|
1958
|
+
max_subcompactions);
|
|
1726
1959
|
}
|
|
1727
1960
|
|
|
1728
1961
|
// The io priority of the compaction reads and writes are different from
|
|
@@ -1734,7 +1967,8 @@ class CompactionJobIOPriorityTest : public CompactionJobTestBase {
|
|
|
1734
1967
|
CompactionJobIOPriorityTest()
|
|
1735
1968
|
: CompactionJobTestBase(
|
|
1736
1969
|
test::PerThreadDBPath("compaction_job_io_priority_test"),
|
|
1737
|
-
BytewiseComparator(), [](uint64_t /*ts*/) { return ""; },
|
|
1970
|
+
BytewiseComparator(), [](uint64_t /*ts*/) { return ""; },
|
|
1971
|
+
/*test_io_priority=*/true, TableTypeForTest::kBlockBasedTable) {}
|
|
1738
1972
|
};
|
|
1739
1973
|
|
|
1740
1974
|
TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
|
|
@@ -1742,10 +1976,12 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
|
|
|
1742
1976
|
NewDB();
|
|
1743
1977
|
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1744
1978
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1745
|
-
|
|
1979
|
+
constexpr int input_level = 0;
|
|
1980
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
1746
1981
|
ASSERT_EQ(2U, files.size());
|
|
1747
|
-
RunCompaction({files},
|
|
1748
|
-
|
|
1982
|
+
RunCompaction({files}, {input_level}, {expected_results}, {},
|
|
1983
|
+
kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
|
|
1984
|
+
Env::IO_LOW, Env::IO_LOW);
|
|
1749
1985
|
}
|
|
1750
1986
|
|
|
1751
1987
|
TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
|
|
@@ -1753,13 +1989,15 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
|
|
|
1753
1989
|
NewDB();
|
|
1754
1990
|
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1755
1991
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1756
|
-
|
|
1992
|
+
constexpr int input_level = 0;
|
|
1993
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
1757
1994
|
ASSERT_EQ(2U, files.size());
|
|
1758
1995
|
{
|
|
1759
1996
|
std::unique_ptr<WriteControllerToken> delay_token =
|
|
1760
1997
|
write_controller_.GetDelayToken(1000000);
|
|
1761
|
-
RunCompaction({files},
|
|
1762
|
-
|
|
1998
|
+
RunCompaction({files}, {input_level}, {expected_results}, {},
|
|
1999
|
+
kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
|
|
2000
|
+
Env::IO_USER, Env::IO_USER);
|
|
1763
2001
|
}
|
|
1764
2002
|
}
|
|
1765
2003
|
|
|
@@ -1768,13 +2006,15 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateStalled) {
|
|
|
1768
2006
|
NewDB();
|
|
1769
2007
|
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1770
2008
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1771
|
-
|
|
2009
|
+
constexpr int input_level = 0;
|
|
2010
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
1772
2011
|
ASSERT_EQ(2U, files.size());
|
|
1773
2012
|
{
|
|
1774
2013
|
std::unique_ptr<WriteControllerToken> stop_token =
|
|
1775
2014
|
write_controller_.GetStopToken();
|
|
1776
|
-
RunCompaction({files},
|
|
1777
|
-
|
|
2015
|
+
RunCompaction({files}, {input_level}, {expected_results}, {},
|
|
2016
|
+
kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
|
|
2017
|
+
Env::IO_USER, Env::IO_USER);
|
|
1778
2018
|
}
|
|
1779
2019
|
}
|
|
1780
2020
|
|
|
@@ -1782,10 +2022,12 @@ TEST_F(CompactionJobIOPriorityTest, GetRateLimiterPriority) {
|
|
|
1782
2022
|
NewDB();
|
|
1783
2023
|
mock::KVVector expected_results = CreateTwoFiles(false);
|
|
1784
2024
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
1785
|
-
|
|
2025
|
+
constexpr int input_level = 0;
|
|
2026
|
+
auto files = cfd->current()->storage_info()->LevelFiles(input_level);
|
|
1786
2027
|
ASSERT_EQ(2U, files.size());
|
|
1787
|
-
RunCompaction({files},
|
|
1788
|
-
|
|
2028
|
+
RunCompaction({files}, {input_level}, {expected_results}, {},
|
|
2029
|
+
kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, true,
|
|
2030
|
+
Env::IO_LOW, Env::IO_LOW);
|
|
1789
2031
|
}
|
|
1790
2032
|
|
|
1791
2033
|
} // namespace ROCKSDB_NAMESPACE
|