@nxtedition/rocksdb 8.1.4 → 8.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
- package/deps/rocksdb/rocksdb/Makefile +15 -3
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
- package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +15 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
- package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
- package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
- package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +6 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
- package/package.json +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
|
@@ -973,7 +973,7 @@ TEST_F(ExternalSSTFileTest, MultiThreaded) {
|
|
|
973
973
|
|
|
974
974
|
do {
|
|
975
975
|
Options options = CurrentOptions();
|
|
976
|
-
|
|
976
|
+
options.disable_auto_compactions = true;
|
|
977
977
|
std::atomic<int> thread_num(0);
|
|
978
978
|
std::function<void()> write_file_func = [&]() {
|
|
979
979
|
int file_idx = thread_num.fetch_add(1);
|
|
@@ -1249,8 +1249,9 @@ TEST_P(ExternalSSTFileTest, PickedLevel) {
|
|
|
1249
1249
|
|
|
1250
1250
|
// This file overlaps with file 0 (L3), file 1 (L2) and the
|
|
1251
1251
|
// output of compaction going to L1
|
|
1252
|
-
ASSERT_OK(GenerateAndAddExternalFile(options, {4, 7}, -1,
|
|
1253
|
-
|
|
1252
|
+
ASSERT_OK(GenerateAndAddExternalFile(options, {4, 7}, -1,
|
|
1253
|
+
true /* allow_global_seqno */, false,
|
|
1254
|
+
true, false, false, &true_data));
|
|
1254
1255
|
EXPECT_EQ(FilesPerLevel(), "5,0,1,1");
|
|
1255
1256
|
|
|
1256
1257
|
// This file does not overlap with any file or with the running compaction
|
|
@@ -1270,106 +1271,6 @@ TEST_P(ExternalSSTFileTest, PickedLevel) {
|
|
|
1270
1271
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
|
1271
1272
|
}
|
|
1272
1273
|
|
|
1273
|
-
TEST_F(ExternalSSTFileTest, PickedLevelBug) {
|
|
1274
|
-
env_->skip_fsync_ = true;
|
|
1275
|
-
Options options = CurrentOptions();
|
|
1276
|
-
options.disable_auto_compactions = false;
|
|
1277
|
-
options.level0_file_num_compaction_trigger = 3;
|
|
1278
|
-
options.num_levels = 2;
|
|
1279
|
-
DestroyAndReopen(options);
|
|
1280
|
-
|
|
1281
|
-
std::vector<int> file_keys;
|
|
1282
|
-
|
|
1283
|
-
// file #1 in L0
|
|
1284
|
-
file_keys = {0, 5, 7};
|
|
1285
|
-
for (int k : file_keys) {
|
|
1286
|
-
ASSERT_OK(Put(Key(k), Key(k)));
|
|
1287
|
-
}
|
|
1288
|
-
ASSERT_OK(Flush());
|
|
1289
|
-
|
|
1290
|
-
// file #2 in L0
|
|
1291
|
-
file_keys = {4, 6, 8, 9};
|
|
1292
|
-
for (int k : file_keys) {
|
|
1293
|
-
ASSERT_OK(Put(Key(k), Key(k)));
|
|
1294
|
-
}
|
|
1295
|
-
ASSERT_OK(Flush());
|
|
1296
|
-
|
|
1297
|
-
// We have 2 overlapping files in L0
|
|
1298
|
-
EXPECT_EQ(FilesPerLevel(), "2");
|
|
1299
|
-
|
|
1300
|
-
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
1301
|
-
|
|
1302
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
|
|
1303
|
-
{{"DBImpl::IngestExternalFile:AfterIncIngestFileCounter",
|
|
1304
|
-
"ExternalSSTFileTest::PickedLevelBug:0"},
|
|
1305
|
-
{"ExternalSSTFileTest::PickedLevelBug:1", "DBImpl::AddFile:MutexUnlock"},
|
|
1306
|
-
{"ExternalSSTFileTest::PickedLevelBug:2",
|
|
1307
|
-
"DBImpl::RunManualCompaction:0"},
|
|
1308
|
-
{"ExternalSSTFileTest::PickedLevelBug:3",
|
|
1309
|
-
"DBImpl::RunManualCompaction:1"}});
|
|
1310
|
-
|
|
1311
|
-
std::atomic<bool> bg_compact_started(false);
|
|
1312
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1313
|
-
"DBImpl::BackgroundCompaction:Start",
|
|
1314
|
-
[&](void* /*arg*/) { bg_compact_started.store(true); });
|
|
1315
|
-
|
|
1316
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
1317
|
-
|
|
1318
|
-
Status bg_compact_status;
|
|
1319
|
-
Status bg_addfile_status;
|
|
1320
|
-
|
|
1321
|
-
{
|
|
1322
|
-
// While writing the MANIFEST start a thread that will ask for compaction
|
|
1323
|
-
ThreadGuard bg_compact(port::Thread([&]() {
|
|
1324
|
-
bg_compact_status =
|
|
1325
|
-
db_->CompactRange(CompactRangeOptions(), nullptr, nullptr);
|
|
1326
|
-
}));
|
|
1327
|
-
TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:2");
|
|
1328
|
-
|
|
1329
|
-
// Start a thread that will ingest a new file
|
|
1330
|
-
ThreadGuard bg_addfile(port::Thread([&]() {
|
|
1331
|
-
file_keys = {1, 2, 3};
|
|
1332
|
-
bg_addfile_status = GenerateAndAddExternalFile(options, file_keys, 1);
|
|
1333
|
-
}));
|
|
1334
|
-
|
|
1335
|
-
// Wait for AddFile to start picking levels and writing MANIFEST
|
|
1336
|
-
TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:0");
|
|
1337
|
-
|
|
1338
|
-
TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:3");
|
|
1339
|
-
|
|
1340
|
-
// We need to verify that no compactions can run while AddFile is
|
|
1341
|
-
// ingesting the files into the levels it find suitable. So we will
|
|
1342
|
-
// wait for 2 seconds to give a chance for compactions to run during
|
|
1343
|
-
// this period, and then make sure that no compactions where able to run
|
|
1344
|
-
env_->SleepForMicroseconds(1000000 * 2);
|
|
1345
|
-
bool bg_compact_started_tmp = bg_compact_started.load();
|
|
1346
|
-
|
|
1347
|
-
// Hold AddFile from finishing writing the MANIFEST
|
|
1348
|
-
TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:1");
|
|
1349
|
-
|
|
1350
|
-
// check the status at the end, so even if the ASSERT fails the threads
|
|
1351
|
-
// could be joined and return.
|
|
1352
|
-
ASSERT_FALSE(bg_compact_started_tmp);
|
|
1353
|
-
}
|
|
1354
|
-
|
|
1355
|
-
ASSERT_OK(bg_addfile_status);
|
|
1356
|
-
ASSERT_OK(bg_compact_status);
|
|
1357
|
-
|
|
1358
|
-
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
1359
|
-
|
|
1360
|
-
int total_keys = 0;
|
|
1361
|
-
Iterator* iter = db_->NewIterator(ReadOptions());
|
|
1362
|
-
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
|
1363
|
-
ASSERT_OK(iter->status());
|
|
1364
|
-
total_keys++;
|
|
1365
|
-
}
|
|
1366
|
-
ASSERT_EQ(total_keys, 10);
|
|
1367
|
-
|
|
1368
|
-
delete iter;
|
|
1369
|
-
|
|
1370
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
1274
|
TEST_F(ExternalSSTFileTest, IngestNonExistingFile) {
|
|
1374
1275
|
Options options = CurrentOptions();
|
|
1375
1276
|
DestroyAndReopen(options);
|
|
@@ -1420,7 +1321,8 @@ TEST_F(ExternalSSTFileTest, CompactDuringAddFileRandom) {
|
|
|
1420
1321
|
int range_id = 0;
|
|
1421
1322
|
std::vector<int> file_keys;
|
|
1422
1323
|
std::function<void()> bg_addfile = [&]() {
|
|
1423
|
-
ASSERT_OK(GenerateAndAddExternalFile(options, file_keys, range_id
|
|
1324
|
+
ASSERT_OK(GenerateAndAddExternalFile(options, file_keys, range_id,
|
|
1325
|
+
true /* allow_global_seqno */));
|
|
1424
1326
|
};
|
|
1425
1327
|
|
|
1426
1328
|
const int num_of_ranges = 1000;
|
|
@@ -1503,8 +1405,9 @@ TEST_F(ExternalSSTFileTest, PickedLevelDynamic) {
|
|
|
1503
1405
|
|
|
1504
1406
|
// This file overlaps with the output of the compaction (going to L3)
|
|
1505
1407
|
// so the file will be added to L0 since L3 is the base level
|
|
1506
|
-
ASSERT_OK(GenerateAndAddExternalFile(options, {31, 32, 33, 34}, -1,
|
|
1507
|
-
|
|
1408
|
+
ASSERT_OK(GenerateAndAddExternalFile(options, {31, 32, 33, 34}, -1,
|
|
1409
|
+
true /* allow_global_seqno */, false,
|
|
1410
|
+
true, false, false, &true_data));
|
|
1508
1411
|
EXPECT_EQ(FilesPerLevel(), "5");
|
|
1509
1412
|
|
|
1510
1413
|
// This file does not overlap with the current running compactiong
|
|
@@ -1642,14 +1545,15 @@ TEST_F(ExternalSSTFileTest, AddFileTrivialMoveBug) {
|
|
|
1642
1545
|
|
|
1643
1546
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1644
1547
|
"CompactionJob::Run():Start", [&](void* /*arg*/) {
|
|
1645
|
-
//
|
|
1646
|
-
// to L2
|
|
1647
|
-
// and break LSM consistency
|
|
1548
|
+
// Fit in L3 but will overlap with the compaction output so will be
|
|
1549
|
+
// added to L2. Prior to the fix, a compaction will then trivially move
|
|
1550
|
+
// this file to L3 and break LSM consistency
|
|
1648
1551
|
static std::atomic<bool> called = {false};
|
|
1649
1552
|
if (!called) {
|
|
1650
1553
|
called = true;
|
|
1651
1554
|
ASSERT_OK(dbfull()->SetOptions({{"max_bytes_for_level_base", "1"}}));
|
|
1652
|
-
ASSERT_OK(GenerateAndAddExternalFile(options, {15, 16}, 7
|
|
1555
|
+
ASSERT_OK(GenerateAndAddExternalFile(options, {15, 16}, 7,
|
|
1556
|
+
true /* allow_global_seqno */));
|
|
1653
1557
|
}
|
|
1654
1558
|
});
|
|
1655
1559
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#include "db/memtable_list.h"
|
|
24
24
|
#include "db/merge_context.h"
|
|
25
25
|
#include "db/range_tombstone_fragmenter.h"
|
|
26
|
+
#include "db/version_edit.h"
|
|
26
27
|
#include "db/version_set.h"
|
|
27
28
|
#include "file/file_util.h"
|
|
28
29
|
#include "file/filename.h"
|
|
@@ -90,7 +91,7 @@ FlushJob::FlushJob(
|
|
|
90
91
|
std::vector<SequenceNumber> existing_snapshots,
|
|
91
92
|
SequenceNumber earliest_write_conflict_snapshot,
|
|
92
93
|
SnapshotChecker* snapshot_checker, JobContext* job_context,
|
|
93
|
-
LogBuffer* log_buffer, FSDirectory* db_directory,
|
|
94
|
+
FlushReason flush_reason, LogBuffer* log_buffer, FSDirectory* db_directory,
|
|
94
95
|
FSDirectory* output_file_directory, CompressionType output_compression,
|
|
95
96
|
Statistics* stats, EventLogger* event_logger, bool measure_io_stats,
|
|
96
97
|
const bool sync_output_directory, const bool write_manifest,
|
|
@@ -113,6 +114,7 @@ FlushJob::FlushJob(
|
|
|
113
114
|
earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
|
|
114
115
|
snapshot_checker_(snapshot_checker),
|
|
115
116
|
job_context_(job_context),
|
|
117
|
+
flush_reason_(flush_reason),
|
|
116
118
|
log_buffer_(log_buffer),
|
|
117
119
|
db_directory_(db_directory),
|
|
118
120
|
output_file_directory_(output_file_directory),
|
|
@@ -199,6 +201,7 @@ void FlushJob::PickMemTable() {
|
|
|
199
201
|
|
|
200
202
|
// path 0 for level 0 file.
|
|
201
203
|
meta_.fd = FileDescriptor(versions_->NewFileNumber(), 0, 0);
|
|
204
|
+
meta_.epoch_number = cfd_->NewEpochNumber();
|
|
202
205
|
|
|
203
206
|
base_ = cfd_->current();
|
|
204
207
|
base_->Ref(); // it is likely that we do not need this reference
|
|
@@ -243,9 +246,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, FileMetaData* file_meta,
|
|
|
243
246
|
}
|
|
244
247
|
Status mempurge_s = Status::NotFound("No MemPurge.");
|
|
245
248
|
if ((mempurge_threshold > 0.0) &&
|
|
246
|
-
(
|
|
247
|
-
(
|
|
248
|
-
!(db_options_.atomic_flush)) {
|
|
249
|
+
(flush_reason_ == FlushReason::kWriteBufferFull) && (!mems_.empty()) &&
|
|
250
|
+
MemPurgeDecider(mempurge_threshold) && !(db_options_.atomic_flush)) {
|
|
249
251
|
cfd_->SetMempurgeUsed();
|
|
250
252
|
mempurge_s = MemPurge();
|
|
251
253
|
if (!mempurge_s.ok()) {
|
|
@@ -876,7 +878,7 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
876
878
|
<< total_num_deletes << "total_data_size"
|
|
877
879
|
<< total_data_size << "memory_usage"
|
|
878
880
|
<< total_memory_usage << "flush_reason"
|
|
879
|
-
<< GetFlushReasonString(
|
|
881
|
+
<< GetFlushReasonString(flush_reason_);
|
|
880
882
|
|
|
881
883
|
{
|
|
882
884
|
ScopedArenaIterator iter(
|
|
@@ -939,7 +941,7 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
939
941
|
cfd_->internal_stats(), &io_s, io_tracer_,
|
|
940
942
|
BlobFileCreationReason::kFlush, seqno_to_time_mapping_, event_logger_,
|
|
941
943
|
job_context_->job_id, io_priority, &table_properties_, write_hint,
|
|
942
|
-
full_history_ts_low, blob_callback_, &num_input_entries,
|
|
944
|
+
full_history_ts_low, blob_callback_, base_, &num_input_entries,
|
|
943
945
|
&memtable_payload_bytes, &memtable_garbage_bytes);
|
|
944
946
|
// TODO: Cleanup io_status in BuildTable and table builders
|
|
945
947
|
assert(!s.ok() || io_s.ok());
|
|
@@ -999,9 +1001,9 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
999
1001
|
meta_.fd.smallest_seqno, meta_.fd.largest_seqno,
|
|
1000
1002
|
meta_.marked_for_compaction, meta_.temperature,
|
|
1001
1003
|
meta_.oldest_blob_file_number, meta_.oldest_ancester_time,
|
|
1002
|
-
meta_.file_creation_time, meta_.
|
|
1003
|
-
meta_.
|
|
1004
|
-
|
|
1004
|
+
meta_.file_creation_time, meta_.epoch_number,
|
|
1005
|
+
meta_.file_checksum, meta_.file_checksum_func_name,
|
|
1006
|
+
meta_.unique_id, meta_.compensated_range_deletion_size);
|
|
1005
1007
|
edit_->SetBlobFileAdditions(std::move(blob_file_additions));
|
|
1006
1008
|
}
|
|
1007
1009
|
#ifndef ROCKSDB_LITE
|
|
@@ -1074,7 +1076,7 @@ std::unique_ptr<FlushJobInfo> FlushJob::GetFlushJobInfo() const {
|
|
|
1074
1076
|
info->smallest_seqno = meta_.fd.smallest_seqno;
|
|
1075
1077
|
info->largest_seqno = meta_.fd.largest_seqno;
|
|
1076
1078
|
info->table_properties = table_properties_;
|
|
1077
|
-
info->flush_reason =
|
|
1079
|
+
info->flush_reason = flush_reason_;
|
|
1078
1080
|
info->blob_compression_type = mutable_cf_options_.blob_compression_type;
|
|
1079
1081
|
|
|
1080
1082
|
// Update BlobFilesInfo.
|
|
@@ -67,8 +67,8 @@ class FlushJob {
|
|
|
67
67
|
std::vector<SequenceNumber> existing_snapshots,
|
|
68
68
|
SequenceNumber earliest_write_conflict_snapshot,
|
|
69
69
|
SnapshotChecker* snapshot_checker, JobContext* job_context,
|
|
70
|
-
|
|
71
|
-
FSDirectory* output_file_directory,
|
|
70
|
+
FlushReason flush_reason, LogBuffer* log_buffer,
|
|
71
|
+
FSDirectory* db_directory, FSDirectory* output_file_directory,
|
|
72
72
|
CompressionType output_compression, Statistics* stats,
|
|
73
73
|
EventLogger* event_logger, bool measure_io_stats,
|
|
74
74
|
const bool sync_output_directory, const bool write_manifest,
|
|
@@ -150,6 +150,7 @@ class FlushJob {
|
|
|
150
150
|
SequenceNumber earliest_write_conflict_snapshot_;
|
|
151
151
|
SnapshotChecker* snapshot_checker_;
|
|
152
152
|
JobContext* job_context_;
|
|
153
|
+
FlushReason flush_reason_;
|
|
153
154
|
LogBuffer* log_buffer_;
|
|
154
155
|
FSDirectory* db_directory_;
|
|
155
156
|
FSDirectory* output_file_directory_;
|
|
@@ -164,15 +164,15 @@ TEST_F(FlushJobTest, Empty) {
|
|
|
164
164
|
auto cfd = versions_->GetColumnFamilySet()->GetDefault();
|
|
165
165
|
EventLogger event_logger(db_options_.info_log.get());
|
|
166
166
|
SnapshotChecker* snapshot_checker = nullptr; // not relavant
|
|
167
|
-
FlushJob flush_job(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
167
|
+
FlushJob flush_job(
|
|
168
|
+
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
169
|
+
*cfd->GetLatestMutableCFOptions(),
|
|
170
|
+
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
171
|
+
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
172
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
173
|
+
nullptr, kNoCompression, nullptr, &event_logger, false,
|
|
174
|
+
true /* sync_output_directory */, true /* write_manifest */,
|
|
175
|
+
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
176
176
|
{
|
|
177
177
|
InstrumentedMutexLock l(&mutex_);
|
|
178
178
|
flush_job.PickMemTable();
|
|
@@ -255,9 +255,9 @@ TEST_F(FlushJobTest, NonEmpty) {
|
|
|
255
255
|
*cfd->GetLatestMutableCFOptions(),
|
|
256
256
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
257
257
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
258
|
-
snapshot_checker, &job_context,
|
|
259
|
-
db_options_.statistics.get(), &event_logger,
|
|
260
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
258
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
259
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
260
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
261
261
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
262
262
|
|
|
263
263
|
HistogramData hist;
|
|
@@ -318,9 +318,9 @@ TEST_F(FlushJobTest, FlushMemTablesSingleColumnFamily) {
|
|
|
318
318
|
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
319
319
|
*cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
|
|
320
320
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
321
|
-
snapshot_checker, &job_context,
|
|
322
|
-
db_options_.statistics.get(), &event_logger,
|
|
323
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
321
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
322
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
323
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
324
324
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
325
325
|
HistogramData hist;
|
|
326
326
|
FileMetaData file_meta;
|
|
@@ -391,8 +391,8 @@ TEST_F(FlushJobTest, FlushMemtablesMultipleColumnFamilies) {
|
|
|
391
391
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
392
392
|
memtable_ids[k], env_options_, versions_.get(), &mutex_,
|
|
393
393
|
&shutting_down_, snapshot_seqs, kMaxSequenceNumber, snapshot_checker,
|
|
394
|
-
&job_context,
|
|
395
|
-
db_options_.statistics.get(), &event_logger, true,
|
|
394
|
+
&job_context, FlushReason::kTest, nullptr, nullptr, nullptr,
|
|
395
|
+
kNoCompression, db_options_.statistics.get(), &event_logger, true,
|
|
396
396
|
false /* sync_output_directory */, false /* write_manifest */,
|
|
397
397
|
Env::Priority::USER, nullptr /*IOTracer*/,
|
|
398
398
|
empty_seqno_to_time_mapping_));
|
|
@@ -520,9 +520,9 @@ TEST_F(FlushJobTest, Snapshots) {
|
|
|
520
520
|
*cfd->GetLatestMutableCFOptions(),
|
|
521
521
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
522
522
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
523
|
-
snapshot_checker, &job_context,
|
|
524
|
-
db_options_.statistics.get(), &event_logger,
|
|
525
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
523
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
524
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
525
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
526
526
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
527
527
|
mutex_.Lock();
|
|
528
528
|
flush_job.PickMemTable();
|
|
@@ -576,9 +576,9 @@ TEST_F(FlushJobTest, GetRateLimiterPriorityForWrite) {
|
|
|
576
576
|
dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
|
|
577
577
|
*cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
|
|
578
578
|
versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
|
|
579
|
-
snapshot_checker, &job_context,
|
|
580
|
-
db_options_.statistics.get(), &event_logger,
|
|
581
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
579
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
580
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
581
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
582
582
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
|
|
583
583
|
|
|
584
584
|
// When the state from WriteController is normal.
|
|
@@ -656,9 +656,9 @@ TEST_F(FlushJobTimestampTest, AllKeysExpired) {
|
|
|
656
656
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
657
657
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
658
658
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
659
|
-
snapshot_checker, &job_context,
|
|
660
|
-
db_options_.statistics.get(), &event_logger,
|
|
661
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
659
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
660
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
661
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
662
662
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
|
|
663
663
|
/*db_id=*/"",
|
|
664
664
|
/*db_session_id=*/"", full_history_ts_low);
|
|
@@ -709,9 +709,9 @@ TEST_F(FlushJobTimestampTest, NoKeyExpired) {
|
|
|
709
709
|
dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
|
|
710
710
|
std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
|
|
711
711
|
versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
|
|
712
|
-
snapshot_checker, &job_context,
|
|
713
|
-
db_options_.statistics.get(), &event_logger,
|
|
714
|
-
true /* sync_output_directory */, true /* write_manifest */,
|
|
712
|
+
snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
|
|
713
|
+
nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
|
|
714
|
+
true, true /* sync_output_directory */, true /* write_manifest */,
|
|
715
715
|
Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
|
|
716
716
|
/*db_id=*/"",
|
|
717
717
|
/*db_session_id=*/"", full_history_ts_low);
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
5
|
// (found in the LICENSE.Apache file in the root directory).
|
|
6
6
|
|
|
7
|
+
#include "db/version_builder.h"
|
|
7
8
|
#ifndef ROCKSDB_LITE
|
|
8
9
|
|
|
9
10
|
#include "db/import_column_family_job.h"
|
|
@@ -45,40 +46,6 @@ Status ImportColumnFamilyJob::Prepare(uint64_t next_file_number,
|
|
|
45
46
|
auto num_files = files_to_import_.size();
|
|
46
47
|
if (num_files == 0) {
|
|
47
48
|
return Status::InvalidArgument("The list of files is empty");
|
|
48
|
-
} else if (num_files > 1) {
|
|
49
|
-
// Verify that passed files don't have overlapping ranges in any particular
|
|
50
|
-
// level.
|
|
51
|
-
int min_level = 1; // Check for overlaps in Level 1 and above.
|
|
52
|
-
int max_level = -1;
|
|
53
|
-
for (const auto& file_metadata : metadata_) {
|
|
54
|
-
if (file_metadata.level > max_level) {
|
|
55
|
-
max_level = file_metadata.level;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
for (int level = min_level; level <= max_level; ++level) {
|
|
59
|
-
autovector<const IngestedFileInfo*> sorted_files;
|
|
60
|
-
for (size_t i = 0; i < num_files; i++) {
|
|
61
|
-
if (metadata_[i].level == level) {
|
|
62
|
-
sorted_files.push_back(&files_to_import_[i]);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
std::sort(
|
|
67
|
-
sorted_files.begin(), sorted_files.end(),
|
|
68
|
-
[this](const IngestedFileInfo* info1, const IngestedFileInfo* info2) {
|
|
69
|
-
return cfd_->internal_comparator().Compare(
|
|
70
|
-
info1->smallest_internal_key,
|
|
71
|
-
info2->smallest_internal_key) < 0;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
for (size_t i = 0; i + 1 < sorted_files.size(); i++) {
|
|
75
|
-
if (cfd_->internal_comparator().Compare(
|
|
76
|
-
sorted_files[i]->largest_internal_key,
|
|
77
|
-
sorted_files[i + 1]->smallest_internal_key) >= 0) {
|
|
78
|
-
return Status::InvalidArgument("Files have overlapping ranges");
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
49
|
}
|
|
83
50
|
|
|
84
51
|
for (const auto& f : files_to_import_) {
|
|
@@ -143,9 +110,6 @@ Status ImportColumnFamilyJob::Prepare(uint64_t next_file_number,
|
|
|
143
110
|
// REQUIRES: we have become the only writer by entering both write_thread_ and
|
|
144
111
|
// nonmem_write_thread_
|
|
145
112
|
Status ImportColumnFamilyJob::Run() {
|
|
146
|
-
Status status;
|
|
147
|
-
edit_.SetColumnFamily(cfd_->GetID());
|
|
148
|
-
|
|
149
113
|
// We use the import time as the ancester time. This is the time the data
|
|
150
114
|
// is written to the database.
|
|
151
115
|
int64_t temp_current_time = 0;
|
|
@@ -156,27 +120,67 @@ Status ImportColumnFamilyJob::Run() {
|
|
|
156
120
|
static_cast<uint64_t>(temp_current_time);
|
|
157
121
|
}
|
|
158
122
|
|
|
159
|
-
|
|
123
|
+
// Recover files' epoch number using dummy VersionStorageInfo
|
|
124
|
+
VersionBuilder dummy_version_builder(
|
|
125
|
+
cfd_->current()->version_set()->file_options(), cfd_->ioptions(),
|
|
126
|
+
cfd_->table_cache(), cfd_->current()->storage_info(),
|
|
127
|
+
cfd_->current()->version_set(),
|
|
128
|
+
cfd_->GetFileMetadataCacheReservationManager());
|
|
129
|
+
VersionStorageInfo dummy_vstorage(
|
|
130
|
+
&cfd_->internal_comparator(), cfd_->user_comparator(),
|
|
131
|
+
cfd_->NumberLevels(), cfd_->ioptions()->compaction_style,
|
|
132
|
+
nullptr /* src_vstorage */, cfd_->ioptions()->force_consistency_checks,
|
|
133
|
+
EpochNumberRequirement::kMightMissing);
|
|
134
|
+
Status s;
|
|
135
|
+
for (size_t i = 0; s.ok() && i < files_to_import_.size(); ++i) {
|
|
160
136
|
const auto& f = files_to_import_[i];
|
|
161
137
|
const auto& file_metadata = metadata_[i];
|
|
162
138
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
139
|
+
VersionEdit dummy_version_edit;
|
|
140
|
+
dummy_version_edit.AddFile(
|
|
141
|
+
file_metadata.level, f.fd.GetNumber(), f.fd.GetPathId(),
|
|
142
|
+
f.fd.GetFileSize(), f.smallest_internal_key, f.largest_internal_key,
|
|
143
|
+
file_metadata.smallest_seqno, file_metadata.largest_seqno, false,
|
|
144
|
+
file_metadata.temperature, kInvalidBlobFileNumber, oldest_ancester_time,
|
|
145
|
+
current_time, file_metadata.epoch_number, kUnknownFileChecksum,
|
|
146
|
+
kUnknownFileChecksumFuncName, f.unique_id, 0);
|
|
147
|
+
s = dummy_version_builder.Apply(&dummy_version_edit);
|
|
148
|
+
}
|
|
149
|
+
if (s.ok()) {
|
|
150
|
+
s = dummy_version_builder.SaveTo(&dummy_vstorage);
|
|
151
|
+
}
|
|
152
|
+
if (s.ok()) {
|
|
153
|
+
dummy_vstorage.RecoverEpochNumbers(cfd_);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Record changes from this CF import in VersionEdit, including files with
|
|
157
|
+
// recovered epoch numbers
|
|
158
|
+
if (s.ok()) {
|
|
159
|
+
edit_.SetColumnFamily(cfd_->GetID());
|
|
160
|
+
|
|
161
|
+
for (int level = 0; level < dummy_vstorage.num_levels(); level++) {
|
|
162
|
+
for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
|
|
163
|
+
edit_.AddFile(level, *file_meta);
|
|
164
|
+
// If incoming sequence number is higher, update local sequence number.
|
|
165
|
+
if (file_meta->fd.largest_seqno > versions_->LastSequence()) {
|
|
166
|
+
versions_->SetLastAllocatedSequence(file_meta->fd.largest_seqno);
|
|
167
|
+
versions_->SetLastPublishedSequence(file_meta->fd.largest_seqno);
|
|
168
|
+
versions_->SetLastSequence(file_meta->fd.largest_seqno);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
176
171
|
}
|
|
177
172
|
}
|
|
178
173
|
|
|
179
|
-
|
|
174
|
+
// Release resources occupied by the dummy VersionStorageInfo
|
|
175
|
+
for (int level = 0; level < dummy_vstorage.num_levels(); level++) {
|
|
176
|
+
for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
|
|
177
|
+
file_meta->refs--;
|
|
178
|
+
if (file_meta->refs <= 0) {
|
|
179
|
+
delete file_meta;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return s;
|
|
180
184
|
}
|
|
181
185
|
|
|
182
186
|
void ImportColumnFamilyJob::Cleanup(const Status& status) {
|
|
@@ -306,7 +310,6 @@ Status ImportColumnFamilyJob::GetIngestedFileInfo(
|
|
|
306
310
|
|
|
307
311
|
return status;
|
|
308
312
|
}
|
|
309
|
-
|
|
310
313
|
} // namespace ROCKSDB_NAMESPACE
|
|
311
314
|
|
|
312
315
|
#endif // !ROCKSDB_LITE
|
|
@@ -556,10 +556,9 @@ TEST_F(ImportColumnFamilyTest, ImportColumnFamilyNegativeTest) {
|
|
|
556
556
|
LiveFileMetaDataInit(file2_sst_name, sst_files_dir_, 1, 10, 19));
|
|
557
557
|
metadata.db_comparator_name = options.comparator->Name();
|
|
558
558
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
Status::InvalidArgument("Files have overlapping ranges"));
|
|
559
|
+
ASSERT_NOK(db_->CreateColumnFamilyWithImport(ColumnFamilyOptions(), "yoyo",
|
|
560
|
+
ImportColumnFamilyOptions(),
|
|
561
|
+
metadata, &import_cfh_));
|
|
563
562
|
ASSERT_EQ(import_cfh_, nullptr);
|
|
564
563
|
}
|
|
565
564
|
|
|
@@ -659,17 +659,18 @@ void InternalStats::CollectCacheEntryStats(bool foreground) {
|
|
|
659
659
|
min_interval_factor);
|
|
660
660
|
}
|
|
661
661
|
|
|
662
|
-
std::function<void(
|
|
662
|
+
std::function<void()> Blah() {
|
|
663
|
+
static int x = 42;
|
|
664
|
+
return [&]() { ++x; };
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
|
|
668
|
+
const Cache::CacheItemHelper* helper)>
|
|
663
669
|
InternalStats::CacheEntryRoleStats::GetEntryCallback() {
|
|
664
|
-
return [&](const Slice& /*key*/,
|
|
665
|
-
Cache::
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
if (e == role_map_.end()) {
|
|
669
|
-
role_idx = static_cast<size_t>(CacheEntryRole::kMisc);
|
|
670
|
-
} else {
|
|
671
|
-
role_idx = static_cast<size_t>(e->second);
|
|
672
|
-
}
|
|
670
|
+
return [&](const Slice& /*key*/, Cache::ObjectPtr /*value*/, size_t charge,
|
|
671
|
+
const Cache::CacheItemHelper* helper) -> void {
|
|
672
|
+
size_t role_idx =
|
|
673
|
+
static_cast<size_t>(helper ? helper->role : CacheEntryRole::kMisc);
|
|
673
674
|
entry_counts[role_idx]++;
|
|
674
675
|
total_charges[role_idx] += charge;
|
|
675
676
|
};
|
|
@@ -680,7 +681,6 @@ void InternalStats::CacheEntryRoleStats::BeginCollection(
|
|
|
680
681
|
Clear();
|
|
681
682
|
last_start_time_micros_ = start_time_micros;
|
|
682
683
|
++collection_count;
|
|
683
|
-
role_map_ = CopyCacheDeleterRoleMap();
|
|
684
684
|
std::ostringstream str;
|
|
685
685
|
str << cache->Name() << "@" << static_cast<void*>(cache) << "#"
|
|
686
686
|
<< port::GetProcessID();
|
|
@@ -472,7 +472,8 @@ class InternalStats {
|
|
|
472
472
|
}
|
|
473
473
|
|
|
474
474
|
void BeginCollection(Cache*, SystemClock*, uint64_t start_time_micros);
|
|
475
|
-
std::function<void(const Slice
|
|
475
|
+
std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
|
|
476
|
+
const Cache::CacheItemHelper* helper)>
|
|
476
477
|
GetEntryCallback();
|
|
477
478
|
void EndCollection(Cache*, SystemClock*, uint64_t end_time_micros);
|
|
478
479
|
void SkippedCollection();
|
|
@@ -482,7 +483,6 @@ class InternalStats {
|
|
|
482
483
|
SystemClock* clock) const;
|
|
483
484
|
|
|
484
485
|
private:
|
|
485
|
-
UnorderedMap<Cache::DeleterFn, CacheEntryRole> role_map_;
|
|
486
486
|
uint64_t GetLastDurationMicros() const;
|
|
487
487
|
};
|
|
488
488
|
|
|
@@ -515,10 +515,11 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
|
|
|
515
515
|
|
|
516
516
|
size_t uncompressed_size = 0;
|
|
517
517
|
int remaining = 0;
|
|
518
|
+
const char* input = header + header_size;
|
|
518
519
|
do {
|
|
519
|
-
remaining = uncompress_->Uncompress(
|
|
520
|
-
|
|
521
|
-
|
|
520
|
+
remaining = uncompress_->Uncompress(
|
|
521
|
+
input, length, uncompressed_buffer_.get(), &uncompressed_size);
|
|
522
|
+
input = nullptr;
|
|
522
523
|
if (remaining < 0) {
|
|
523
524
|
buffer_.clear();
|
|
524
525
|
return kBadRecord;
|
|
@@ -830,10 +831,11 @@ bool FragmentBufferedReader::TryReadFragment(
|
|
|
830
831
|
uncompressed_record_.clear();
|
|
831
832
|
size_t uncompressed_size = 0;
|
|
832
833
|
int remaining = 0;
|
|
834
|
+
const char* input = header + header_size;
|
|
833
835
|
do {
|
|
834
|
-
remaining = uncompress_->Uncompress(
|
|
835
|
-
|
|
836
|
-
|
|
836
|
+
remaining = uncompress_->Uncompress(
|
|
837
|
+
input, length, uncompressed_buffer_.get(), &uncompressed_size);
|
|
838
|
+
input = nullptr;
|
|
837
839
|
if (remaining < 0) {
|
|
838
840
|
buffer_.clear();
|
|
839
841
|
*fragment_type_or_err = kBadRecord;
|