@nxtedition/rocksdb 7.1.4 → 7.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deps/rocksdb/iostats.patch +19 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -40
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +103 -28
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +33 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +177 -38
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +125 -71
- package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +36 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +50 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +41 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +17 -8
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
- package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
- package/deps/rocksdb/rocksdb/db/db_test2.cc +18 -7
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +49 -14
- package/deps/rocksdb/rocksdb/db/memtable.h +60 -14
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
- package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
- package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +8 -14
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
- package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
- package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
- package/deps/rocksdb/rocksdb/db/version_set.cc +34 -10
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
- package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +6 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
- package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
- package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
- package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +6 -5
- package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
- package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +50 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +7 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +14 -1
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
- package/index.js +2 -2
- 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/logging/posix_logger.h +0 -179
|
@@ -764,6 +764,7 @@ TEST_F(CorruptionTest, ParanoidFileChecksOnCompact) {
|
|
|
764
764
|
delete db_;
|
|
765
765
|
db_ = nullptr;
|
|
766
766
|
s = DestroyDB(dbname_, options);
|
|
767
|
+
ASSERT_OK(s);
|
|
767
768
|
std::shared_ptr<mock::MockTableFactory> mock =
|
|
768
769
|
std::make_shared<mock::MockTableFactory>();
|
|
769
770
|
options.table_factory = mock;
|
|
@@ -1209,9 +1209,9 @@ TEST_F(DBBasicTest, DBCloseAllDirectoryFDs) {
|
|
|
1209
1209
|
s = db->Close();
|
|
1210
1210
|
auto* counted_fs =
|
|
1211
1211
|
options.env->GetFileSystem()->CheckedCast<CountedFileSystem>();
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1212
|
+
ASSERT_TRUE(counted_fs != nullptr);
|
|
1213
|
+
ASSERT_EQ(counted_fs->counters()->dir_opens,
|
|
1214
|
+
counted_fs->counters()->dir_closes);
|
|
1215
1215
|
ASSERT_OK(s);
|
|
1216
1216
|
delete db;
|
|
1217
1217
|
}
|
|
@@ -2146,7 +2146,7 @@ class DBMultiGetAsyncIOTest : public DBBasicTest {
|
|
|
2146
2146
|
|
|
2147
2147
|
// Put all keys in the bottommost level, and overwrite some keys
|
|
2148
2148
|
// in L0 and L1
|
|
2149
|
-
for (int i = 0; i <
|
|
2149
|
+
for (int i = 0; i < 256; ++i) {
|
|
2150
2150
|
EXPECT_OK(Put(Key(i), "val_l2_" + std::to_string(i)));
|
|
2151
2151
|
num_keys++;
|
|
2152
2152
|
if (num_keys == 8) {
|
|
@@ -2172,6 +2172,21 @@ class DBMultiGetAsyncIOTest : public DBBasicTest {
|
|
|
2172
2172
|
EXPECT_OK(Flush());
|
|
2173
2173
|
num_keys = 0;
|
|
2174
2174
|
}
|
|
2175
|
+
// Put some range deletes in L1
|
|
2176
|
+
for (int i = 128; i < 256; i += 32) {
|
|
2177
|
+
std::string range_begin = Key(i);
|
|
2178
|
+
std::string range_end = Key(i + 16);
|
|
2179
|
+
EXPECT_OK(dbfull()->DeleteRange(WriteOptions(),
|
|
2180
|
+
dbfull()->DefaultColumnFamily(),
|
|
2181
|
+
range_begin, range_end));
|
|
2182
|
+
// Also do some Puts to force creation of bloom filter
|
|
2183
|
+
for (int j = i + 16; j < i + 32; ++j) {
|
|
2184
|
+
if (j % 3 == 0) {
|
|
2185
|
+
EXPECT_OK(Put(Key(j), "val_l1_" + std::to_string(j)));
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
EXPECT_OK(Flush());
|
|
2189
|
+
}
|
|
2175
2190
|
MoveFilesToLevel(1);
|
|
2176
2191
|
|
|
2177
2192
|
for (int i = 0; i < 128; i += 5) {
|
|
@@ -2338,6 +2353,60 @@ TEST_F(DBMultiGetAsyncIOTest, GetFromL1AndL2) {
|
|
|
2338
2353
|
ASSERT_EQ(multiget_io_batch_size.count, 1);
|
|
2339
2354
|
ASSERT_EQ(multiget_io_batch_size.max, 2);
|
|
2340
2355
|
}
|
|
2356
|
+
|
|
2357
|
+
TEST_F(DBMultiGetAsyncIOTest, GetFromL2WithRangeOverlapL0L1) {
|
|
2358
|
+
std::vector<std::string> key_strs;
|
|
2359
|
+
std::vector<Slice> keys;
|
|
2360
|
+
std::vector<PinnableSlice> values;
|
|
2361
|
+
std::vector<Status> statuses;
|
|
2362
|
+
|
|
2363
|
+
// 19 and 26 are in L2, but overlap with L0 and L1 file ranges
|
|
2364
|
+
key_strs.push_back(Key(19));
|
|
2365
|
+
key_strs.push_back(Key(26));
|
|
2366
|
+
keys.push_back(key_strs[0]);
|
|
2367
|
+
keys.push_back(key_strs[1]);
|
|
2368
|
+
values.resize(keys.size());
|
|
2369
|
+
statuses.resize(keys.size());
|
|
2370
|
+
|
|
2371
|
+
ReadOptions ro;
|
|
2372
|
+
ro.async_io = true;
|
|
2373
|
+
dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
|
|
2374
|
+
keys.data(), values.data(), statuses.data());
|
|
2375
|
+
ASSERT_EQ(values.size(), 2);
|
|
2376
|
+
ASSERT_EQ(statuses[0], Status::OK());
|
|
2377
|
+
ASSERT_EQ(statuses[1], Status::OK());
|
|
2378
|
+
ASSERT_EQ(values[0], "val_l2_" + std::to_string(19));
|
|
2379
|
+
ASSERT_EQ(values[1], "val_l2_" + std::to_string(26));
|
|
2380
|
+
|
|
2381
|
+
// Bloom filters in L0/L1 will avoid the coroutine calls in those levels
|
|
2382
|
+
ASSERT_EQ(statistics()->getTickerCount(MULTIGET_COROUTINE_COUNT), 2);
|
|
2383
|
+
}
|
|
2384
|
+
|
|
2385
|
+
TEST_F(DBMultiGetAsyncIOTest, GetFromL2WithRangeDelInL1) {
|
|
2386
|
+
std::vector<std::string> key_strs;
|
|
2387
|
+
std::vector<Slice> keys;
|
|
2388
|
+
std::vector<PinnableSlice> values;
|
|
2389
|
+
std::vector<Status> statuses;
|
|
2390
|
+
|
|
2391
|
+
// 139 and 163 are in L2, but overlap with a range deletes in L1
|
|
2392
|
+
key_strs.push_back(Key(139));
|
|
2393
|
+
key_strs.push_back(Key(163));
|
|
2394
|
+
keys.push_back(key_strs[0]);
|
|
2395
|
+
keys.push_back(key_strs[1]);
|
|
2396
|
+
values.resize(keys.size());
|
|
2397
|
+
statuses.resize(keys.size());
|
|
2398
|
+
|
|
2399
|
+
ReadOptions ro;
|
|
2400
|
+
ro.async_io = true;
|
|
2401
|
+
dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
|
|
2402
|
+
keys.data(), values.data(), statuses.data());
|
|
2403
|
+
ASSERT_EQ(values.size(), 2);
|
|
2404
|
+
ASSERT_EQ(statuses[0], Status::NotFound());
|
|
2405
|
+
ASSERT_EQ(statuses[1], Status::NotFound());
|
|
2406
|
+
|
|
2407
|
+
// Bloom filters in L0/L1 will avoid the coroutine calls in those levels
|
|
2408
|
+
ASSERT_EQ(statistics()->getTickerCount(MULTIGET_COROUTINE_COUNT), 2);
|
|
2409
|
+
}
|
|
2341
2410
|
#endif // USE_COROUTINES
|
|
2342
2411
|
|
|
2343
2412
|
TEST_F(DBBasicTest, MultiGetStats) {
|
|
@@ -1294,10 +1294,12 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
|
|
|
1294
1294
|
const size_t capacity = size_t{1} << 25;
|
|
1295
1295
|
int iterations_tested = 0;
|
|
1296
1296
|
for (bool partition : {false, true}) {
|
|
1297
|
-
for (std::shared_ptr<Cache> cache :
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1297
|
+
for (std::shared_ptr<Cache> cache :
|
|
1298
|
+
{NewLRUCache(capacity),
|
|
1299
|
+
ExperimentalNewClockCache(capacity, 1 /*estimated_value_size*/,
|
|
1300
|
+
-1 /*num_shard_bits*/,
|
|
1301
|
+
false /*strict_capacity_limit*/,
|
|
1302
|
+
kDefaultCacheMetadataChargePolicy)}) {
|
|
1301
1303
|
if (!cache) {
|
|
1302
1304
|
// Skip clock cache when not supported
|
|
1303
1305
|
continue;
|
|
@@ -1450,9 +1452,16 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
|
|
|
1450
1452
|
// even if the cache is full
|
|
1451
1453
|
ClearCache(cache.get());
|
|
1452
1454
|
Cache::Handle* h = nullptr;
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1455
|
+
if (strcmp(cache->Name(), "LRUCache") == 0) {
|
|
1456
|
+
ASSERT_OK(cache->Insert("Fill-it-up", nullptr, capacity + 1,
|
|
1457
|
+
GetNoopDeleterForRole<CacheEntryRole::kMisc>(),
|
|
1458
|
+
&h, Cache::Priority::HIGH));
|
|
1459
|
+
} else {
|
|
1460
|
+
// For ClockCache we use a 16-byte key.
|
|
1461
|
+
ASSERT_OK(cache->Insert("Fill-it-up-xxxxx", nullptr, capacity + 1,
|
|
1462
|
+
GetNoopDeleterForRole<CacheEntryRole::kMisc>(),
|
|
1463
|
+
&h, Cache::Priority::HIGH));
|
|
1464
|
+
}
|
|
1456
1465
|
ASSERT_GT(cache->GetUsage(), cache->GetCapacity());
|
|
1457
1466
|
expected = {};
|
|
1458
1467
|
// For CacheEntryStatsCollector
|
|
@@ -1709,7 +1718,7 @@ TEST_P(DBBlockCacheKeyTest, StableCacheKeys) {
|
|
|
1709
1718
|
delete metadata_ptr_;
|
|
1710
1719
|
metadata_ptr_ = nullptr;
|
|
1711
1720
|
|
|
1712
|
-
DestroyDB(export_files_dir, options);
|
|
1721
|
+
ASSERT_OK(DestroyDB(export_files_dir, options));
|
|
1713
1722
|
|
|
1714
1723
|
ReopenWithColumnFamilies({"default", "yoyo"}, options);
|
|
1715
1724
|
|
|
@@ -2660,8 +2660,9 @@ TEST_F(DBCompactionTest, ManualAutoRace) {
|
|
|
2660
2660
|
TEST_SYNC_POINT("DBCompactionTest::ManualAutoRace:1");
|
|
2661
2661
|
// The auto compaction will wait until the manual compaction is registerd
|
|
2662
2662
|
// before processing so that it will be cancelled.
|
|
2663
|
-
|
|
2664
|
-
|
|
2663
|
+
CompactRangeOptions cro;
|
|
2664
|
+
cro.exclusive_manual_compaction = true;
|
|
2665
|
+
ASSERT_OK(dbfull()->CompactRange(cro, handles_[1], nullptr, nullptr));
|
|
2665
2666
|
ASSERT_EQ("0,1", FilesPerLevel(1));
|
|
2666
2667
|
|
|
2667
2668
|
// Eventually the cancelled compaction will be rescheduled and executed.
|
|
@@ -5511,6 +5512,74 @@ INSTANTIATE_TEST_CASE_P(RoundRobinSubcompactionsAgainstResources,
|
|
|
5511
5512
|
std::make_tuple(5, 10),
|
|
5512
5513
|
std::make_tuple(10, 10)));
|
|
5513
5514
|
|
|
5515
|
+
TEST_P(DBCompactionTestWithParam, RoundRobinWithoutAdditionalResources) {
|
|
5516
|
+
const int kKeysPerBuffer = 200;
|
|
5517
|
+
Options options = CurrentOptions();
|
|
5518
|
+
options.num_levels = 4;
|
|
5519
|
+
options.level0_file_num_compaction_trigger = 3;
|
|
5520
|
+
options.target_file_size_base = kKeysPerBuffer * 1024;
|
|
5521
|
+
options.compaction_pri = CompactionPri::kRoundRobin;
|
|
5522
|
+
options.max_bytes_for_level_base = 30 * kKeysPerBuffer * 1024;
|
|
5523
|
+
options.disable_auto_compactions = true;
|
|
5524
|
+
options.max_subcompactions = max_subcompactions_;
|
|
5525
|
+
options.max_background_compactions = 1;
|
|
5526
|
+
options.max_compaction_bytes = 100000000;
|
|
5527
|
+
// Similar experiment setting as above except the max_subcompactions
|
|
5528
|
+
// is given by max_subcompactions_ (1 or 4), and we fix the
|
|
5529
|
+
// additional resources as (1, 1) and thus no more extra resources
|
|
5530
|
+
// can be used
|
|
5531
|
+
DestroyAndReopen(options);
|
|
5532
|
+
env_->SetBackgroundThreads(1, Env::LOW);
|
|
5533
|
+
|
|
5534
|
+
Random rnd(301);
|
|
5535
|
+
const std::vector<int> files_per_level = {0, 33, 100};
|
|
5536
|
+
for (int lvl = 2; lvl > 0; lvl--) {
|
|
5537
|
+
for (int i = 0; i < files_per_level[lvl]; i++) {
|
|
5538
|
+
for (int j = 0; j < kKeysPerBuffer; j++) {
|
|
5539
|
+
// Add (lvl-1) to ensure nearly equivallent number of files
|
|
5540
|
+
// in L2 are overlapped with fils selected to compact from
|
|
5541
|
+
// L1
|
|
5542
|
+
ASSERT_OK(Put(Key(2 * i * kKeysPerBuffer + 2 * j + (lvl - 1)),
|
|
5543
|
+
rnd.RandomString(1010)));
|
|
5544
|
+
}
|
|
5545
|
+
ASSERT_OK(Flush());
|
|
5546
|
+
}
|
|
5547
|
+
MoveFilesToLevel(lvl);
|
|
5548
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
5549
|
+
ASSERT_EQ(files_per_level[lvl], NumTableFilesAtLevel(lvl, 0));
|
|
5550
|
+
}
|
|
5551
|
+
|
|
5552
|
+
// 33 files in L1; 100 files in L2
|
|
5553
|
+
// This is a variable for making sure the following callback is called
|
|
5554
|
+
// and the assertions in it are indeed excuted.
|
|
5555
|
+
bool num_planned_subcompactions_verified = false;
|
|
5556
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
5557
|
+
"CompactionJob::GenSubcompactionBoundaries:0", [&](void* arg) {
|
|
5558
|
+
uint64_t num_planned_subcompactions = *(static_cast<uint64_t*>(arg));
|
|
5559
|
+
// At most 4 files are selected for round-robin under auto
|
|
5560
|
+
// compaction. The number of planned subcompaction is restricted by
|
|
5561
|
+
// the max_subcompactions since no extra resources can be used
|
|
5562
|
+
ASSERT_EQ(num_planned_subcompactions, options.max_subcompactions);
|
|
5563
|
+
num_planned_subcompactions_verified = true;
|
|
5564
|
+
});
|
|
5565
|
+
// No need to setup dependency for pressure token since
|
|
5566
|
+
// AcquireSubcompactionResources may not be called and it anyway cannot
|
|
5567
|
+
// reserve any additional resources
|
|
5568
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
5569
|
+
{{"DBCompactionTest::RoundRobinWithoutAdditionalResources:0",
|
|
5570
|
+
"BackgroundCallCompaction:0"}});
|
|
5571
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
5572
|
+
|
|
5573
|
+
ASSERT_OK(dbfull()->WaitForCompact());
|
|
5574
|
+
ASSERT_OK(dbfull()->EnableAutoCompaction({dbfull()->DefaultColumnFamily()}));
|
|
5575
|
+
TEST_SYNC_POINT("DBCompactionTest::RoundRobinWithoutAdditionalResources:0");
|
|
5576
|
+
|
|
5577
|
+
ASSERT_OK(dbfull()->WaitForCompact());
|
|
5578
|
+
ASSERT_TRUE(num_planned_subcompactions_verified);
|
|
5579
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
5580
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
5581
|
+
}
|
|
5582
|
+
|
|
5514
5583
|
TEST_F(DBCompactionTest, RoundRobinCutOutputAtCompactCursor) {
|
|
5515
5584
|
Options options = CurrentOptions();
|
|
5516
5585
|
options.num_levels = 3;
|
|
@@ -1674,9 +1674,16 @@ void DBImpl::BackgroundCallPurge() {
|
|
|
1674
1674
|
}
|
|
1675
1675
|
|
|
1676
1676
|
namespace {
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1677
|
+
|
|
1678
|
+
// A `SuperVersionHandle` holds a non-null `SuperVersion*` pointing at a
|
|
1679
|
+
// `SuperVersion` referenced once for this object. It also contains the state
|
|
1680
|
+
// needed to clean up the `SuperVersion` reference from outside of `DBImpl`
|
|
1681
|
+
// using `CleanupSuperVersionHandle()`.
|
|
1682
|
+
struct SuperVersionHandle {
|
|
1683
|
+
// `_super_version` must be non-nullptr and `Ref()`'d once as long as the
|
|
1684
|
+
// `SuperVersionHandle` may use it.
|
|
1685
|
+
SuperVersionHandle(DBImpl* _db, InstrumentedMutex* _mu,
|
|
1686
|
+
SuperVersion* _super_version, bool _background_purge)
|
|
1680
1687
|
: db(_db),
|
|
1681
1688
|
mu(_mu),
|
|
1682
1689
|
super_version(_super_version),
|
|
@@ -1688,35 +1695,49 @@ struct IterState {
|
|
|
1688
1695
|
bool background_purge;
|
|
1689
1696
|
};
|
|
1690
1697
|
|
|
1691
|
-
static void
|
|
1692
|
-
|
|
1698
|
+
static void CleanupSuperVersionHandle(void* arg1, void* /*arg2*/) {
|
|
1699
|
+
SuperVersionHandle* sv_handle = reinterpret_cast<SuperVersionHandle*>(arg1);
|
|
1693
1700
|
|
|
1694
|
-
if (
|
|
1701
|
+
if (sv_handle->super_version->Unref()) {
|
|
1695
1702
|
// Job id == 0 means that this is not our background process, but rather
|
|
1696
1703
|
// user thread
|
|
1697
1704
|
JobContext job_context(0);
|
|
1698
1705
|
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
if (
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
+
sv_handle->mu->Lock();
|
|
1707
|
+
sv_handle->super_version->Cleanup();
|
|
1708
|
+
sv_handle->db->FindObsoleteFiles(&job_context, false, true);
|
|
1709
|
+
if (sv_handle->background_purge) {
|
|
1710
|
+
sv_handle->db->ScheduleBgLogWriterClose(&job_context);
|
|
1711
|
+
sv_handle->db->AddSuperVersionsToFreeQueue(sv_handle->super_version);
|
|
1712
|
+
sv_handle->db->SchedulePurge();
|
|
1706
1713
|
}
|
|
1707
|
-
|
|
1714
|
+
sv_handle->mu->Unlock();
|
|
1708
1715
|
|
|
1709
|
-
if (!
|
|
1710
|
-
delete
|
|
1716
|
+
if (!sv_handle->background_purge) {
|
|
1717
|
+
delete sv_handle->super_version;
|
|
1711
1718
|
}
|
|
1712
1719
|
if (job_context.HaveSomethingToDelete()) {
|
|
1713
|
-
|
|
1720
|
+
sv_handle->db->PurgeObsoleteFiles(job_context,
|
|
1721
|
+
sv_handle->background_purge);
|
|
1714
1722
|
}
|
|
1715
1723
|
job_context.Clean();
|
|
1716
1724
|
}
|
|
1717
1725
|
|
|
1726
|
+
delete sv_handle;
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
struct GetMergeOperandsState {
|
|
1730
|
+
MergeContext merge_context;
|
|
1731
|
+
PinnedIteratorsManager pinned_iters_mgr;
|
|
1732
|
+
SuperVersionHandle* sv_handle;
|
|
1733
|
+
};
|
|
1734
|
+
|
|
1735
|
+
static void CleanupGetMergeOperandsState(void* arg1, void* /*arg2*/) {
|
|
1736
|
+
GetMergeOperandsState* state = static_cast<GetMergeOperandsState*>(arg1);
|
|
1737
|
+
CleanupSuperVersionHandle(state->sv_handle /* arg1 */, nullptr /* arg2 */);
|
|
1718
1738
|
delete state;
|
|
1719
1739
|
}
|
|
1740
|
+
|
|
1720
1741
|
} // namespace
|
|
1721
1742
|
|
|
1722
1743
|
InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
|
|
@@ -1740,8 +1761,8 @@ InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
|
|
|
1740
1761
|
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter;
|
|
1741
1762
|
Status s;
|
|
1742
1763
|
if (!read_options.ignore_range_deletions) {
|
|
1743
|
-
range_del_iter.reset(
|
|
1744
|
-
|
|
1764
|
+
range_del_iter.reset(super_version->mem->NewRangeTombstoneIterator(
|
|
1765
|
+
read_options, sequence, false /* immutable_memtable */));
|
|
1745
1766
|
range_del_agg->AddTombstones(std::move(range_del_iter));
|
|
1746
1767
|
}
|
|
1747
1768
|
// Collect all needed child iterators for immutable memtables
|
|
@@ -1761,11 +1782,11 @@ InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
|
|
|
1761
1782
|
allow_unprepared_value);
|
|
1762
1783
|
}
|
|
1763
1784
|
internal_iter = merge_iter_builder.Finish();
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
internal_iter->RegisterCleanup(
|
|
1785
|
+
SuperVersionHandle* cleanup = new SuperVersionHandle(
|
|
1786
|
+
this, &mutex_, super_version,
|
|
1787
|
+
read_options.background_purge_on_iterator_cleanup ||
|
|
1788
|
+
immutable_db_options_.avoid_unnecessary_blocking_io);
|
|
1789
|
+
internal_iter->RegisterCleanup(CleanupSuperVersionHandle, cleanup, nullptr);
|
|
1769
1790
|
|
|
1770
1791
|
return internal_iter;
|
|
1771
1792
|
} else {
|
|
@@ -1801,6 +1822,34 @@ Status DBImpl::Get(const ReadOptions& read_options,
|
|
|
1801
1822
|
return s;
|
|
1802
1823
|
}
|
|
1803
1824
|
|
|
1825
|
+
bool DBImpl::ShouldReferenceSuperVersion(const MergeContext& merge_context) {
|
|
1826
|
+
// If both thresholds are reached, a function returning merge operands as
|
|
1827
|
+
// `PinnableSlice`s should reference the `SuperVersion` to avoid large and/or
|
|
1828
|
+
// numerous `memcpy()`s.
|
|
1829
|
+
//
|
|
1830
|
+
// The below constants enable the optimization conservatively. They are
|
|
1831
|
+
// verified to not regress `GetMergeOperands()` latency in the following
|
|
1832
|
+
// scenarios.
|
|
1833
|
+
//
|
|
1834
|
+
// - CPU: two socket Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
|
|
1835
|
+
// - `GetMergeOperands()` threads: 1 - 32
|
|
1836
|
+
// - Entry size: 32 bytes - 4KB
|
|
1837
|
+
// - Merges per key: 1 - 16K
|
|
1838
|
+
// - LSM component: memtable
|
|
1839
|
+
//
|
|
1840
|
+
// TODO(ajkr): expand measurement to SST files.
|
|
1841
|
+
static const size_t kNumBytesForSvRef = 32768;
|
|
1842
|
+
static const size_t kLog2AvgBytesForSvRef = 8; // 256 bytes
|
|
1843
|
+
|
|
1844
|
+
size_t num_bytes = 0;
|
|
1845
|
+
for (const Slice& sl : merge_context.GetOperands()) {
|
|
1846
|
+
num_bytes += sl.size();
|
|
1847
|
+
}
|
|
1848
|
+
return num_bytes >= kNumBytesForSvRef &&
|
|
1849
|
+
(num_bytes >> kLog2AvgBytesForSvRef) >=
|
|
1850
|
+
merge_context.GetOperands().size();
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1804
1853
|
Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
|
|
1805
1854
|
GetImplOptions& get_impl_options) {
|
|
1806
1855
|
assert(get_impl_options.value != nullptr ||
|
|
@@ -1848,6 +1897,14 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
|
|
|
1848
1897
|
}
|
|
1849
1898
|
}
|
|
1850
1899
|
|
|
1900
|
+
if (get_impl_options.get_merge_operands_options != nullptr) {
|
|
1901
|
+
for (int i = 0; i < get_impl_options.get_merge_operands_options
|
|
1902
|
+
->expected_max_number_of_operands;
|
|
1903
|
+
++i) {
|
|
1904
|
+
get_impl_options.merge_operands[i].Reset();
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1851
1908
|
// Acquire SuperVersion
|
|
1852
1909
|
SuperVersion* sv = GetAndRefSuperVersion(cfd);
|
|
1853
1910
|
|
|
@@ -1925,7 +1982,8 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
|
|
|
1925
1982
|
if (get_impl_options.get_value) {
|
|
1926
1983
|
if (sv->mem->Get(lkey, get_impl_options.value->GetSelf(), timestamp, &s,
|
|
1927
1984
|
&merge_context, &max_covering_tombstone_seq,
|
|
1928
|
-
read_options,
|
|
1985
|
+
read_options, false /* immutable_memtable */,
|
|
1986
|
+
get_impl_options.callback,
|
|
1929
1987
|
get_impl_options.is_blob_index)) {
|
|
1930
1988
|
done = true;
|
|
1931
1989
|
get_impl_options.value->PinSelf();
|
|
@@ -1945,7 +2003,8 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
|
|
|
1945
2003
|
// merged and raw values should be returned to the user.
|
|
1946
2004
|
if (sv->mem->Get(lkey, /*value*/ nullptr, /*timestamp=*/nullptr, &s,
|
|
1947
2005
|
&merge_context, &max_covering_tombstone_seq,
|
|
1948
|
-
read_options,
|
|
2006
|
+
read_options, false /* immutable_memtable */, nullptr,
|
|
2007
|
+
nullptr, false)) {
|
|
1949
2008
|
done = true;
|
|
1950
2009
|
RecordTick(stats_, MEMTABLE_HIT);
|
|
1951
2010
|
} else if ((s.ok() || s.IsMergeInProgress()) &&
|
|
@@ -1995,19 +2054,68 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
|
|
|
1995
2054
|
s = Status::Incomplete(
|
|
1996
2055
|
Status::SubCode::KMergeOperandsInsufficientCapacity);
|
|
1997
2056
|
} else {
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2057
|
+
// Each operand depends on one of the following resources: `sv`,
|
|
2058
|
+
// `pinned_iters_mgr`, or `merge_context`. It would be crazy expensive
|
|
2059
|
+
// to reference `sv` for each operand relying on it because `sv` is
|
|
2060
|
+
// (un)ref'd in all threads using the DB. Furthermore, we do not track
|
|
2061
|
+
// on which resource each operand depends.
|
|
2062
|
+
//
|
|
2063
|
+
// To solve this, we bundle the resources in a `GetMergeOperandsState`
|
|
2064
|
+
// and manage them with a `SharedCleanablePtr` shared among the
|
|
2065
|
+
// `PinnableSlice`s we return. This bundle includes one `sv` reference
|
|
2066
|
+
// and ownership of the `merge_context` and `pinned_iters_mgr`
|
|
2067
|
+
// objects.
|
|
2068
|
+
bool ref_sv = ShouldReferenceSuperVersion(merge_context);
|
|
2069
|
+
if (ref_sv) {
|
|
2070
|
+
assert(!merge_context.GetOperands().empty());
|
|
2071
|
+
SharedCleanablePtr shared_cleanable;
|
|
2072
|
+
GetMergeOperandsState* state = nullptr;
|
|
2073
|
+
state = new GetMergeOperandsState();
|
|
2074
|
+
state->merge_context = std::move(merge_context);
|
|
2075
|
+
state->pinned_iters_mgr = std::move(pinned_iters_mgr);
|
|
2076
|
+
|
|
2077
|
+
sv->Ref();
|
|
2078
|
+
|
|
2079
|
+
state->sv_handle = new SuperVersionHandle(
|
|
2080
|
+
this, &mutex_, sv,
|
|
2081
|
+
immutable_db_options_.avoid_unnecessary_blocking_io);
|
|
2082
|
+
|
|
2083
|
+
shared_cleanable.Allocate();
|
|
2084
|
+
shared_cleanable->RegisterCleanup(CleanupGetMergeOperandsState,
|
|
2085
|
+
state /* arg1 */,
|
|
2086
|
+
nullptr /* arg2 */);
|
|
2087
|
+
for (size_t i = 0; i < state->merge_context.GetOperands().size();
|
|
2088
|
+
++i) {
|
|
2089
|
+
const Slice& sl = state->merge_context.GetOperands()[i];
|
|
2090
|
+
size += sl.size();
|
|
2091
|
+
|
|
2092
|
+
get_impl_options.merge_operands->PinSlice(
|
|
2093
|
+
sl, nullptr /* cleanable */);
|
|
2094
|
+
if (i == state->merge_context.GetOperands().size() - 1) {
|
|
2095
|
+
shared_cleanable.MoveAsCleanupTo(
|
|
2096
|
+
get_impl_options.merge_operands);
|
|
2097
|
+
} else {
|
|
2098
|
+
shared_cleanable.RegisterCopyWith(
|
|
2099
|
+
get_impl_options.merge_operands);
|
|
2100
|
+
}
|
|
2101
|
+
get_impl_options.merge_operands++;
|
|
2102
|
+
}
|
|
2103
|
+
} else {
|
|
2104
|
+
for (const Slice& sl : merge_context.GetOperands()) {
|
|
2105
|
+
size += sl.size();
|
|
2106
|
+
get_impl_options.merge_operands->PinSelf(sl);
|
|
2107
|
+
get_impl_options.merge_operands++;
|
|
2108
|
+
}
|
|
2002
2109
|
}
|
|
2003
2110
|
}
|
|
2004
2111
|
}
|
|
2005
2112
|
RecordTick(stats_, BYTES_READ, size);
|
|
2006
2113
|
PERF_COUNTER_ADD(get_read_bytes, size);
|
|
2007
2114
|
}
|
|
2008
|
-
RecordInHistogram(stats_, BYTES_PER_READ, size);
|
|
2009
2115
|
|
|
2010
2116
|
ReturnAndCleanupSuperVersion(cfd, sv);
|
|
2117
|
+
|
|
2118
|
+
RecordInHistogram(stats_, BYTES_PER_READ, size);
|
|
2011
2119
|
}
|
|
2012
2120
|
return s;
|
|
2013
2121
|
}
|
|
@@ -2146,6 +2254,7 @@ std::vector<Status> DBImpl::MultiGet(
|
|
|
2146
2254
|
if (!skip_memtable) {
|
|
2147
2255
|
if (super_version->mem->Get(lkey, value, timestamp, &s, &merge_context,
|
|
2148
2256
|
&max_covering_tombstone_seq, read_options,
|
|
2257
|
+
false /* immutable_memtable */,
|
|
2149
2258
|
read_callback)) {
|
|
2150
2259
|
done = true;
|
|
2151
2260
|
RecordTick(stats_, MEMTABLE_HIT);
|
|
@@ -2682,7 +2791,8 @@ Status DBImpl::MultiGetImpl(
|
|
|
2682
2791
|
(read_options.read_tier == kPersistedTier &&
|
|
2683
2792
|
has_unpersisted_data_.load(std::memory_order_relaxed));
|
|
2684
2793
|
if (!skip_memtable) {
|
|
2685
|
-
super_version->mem->MultiGet(read_options, &range, callback
|
|
2794
|
+
super_version->mem->MultiGet(read_options, &range, callback,
|
|
2795
|
+
false /* immutable_memtable */);
|
|
2686
2796
|
if (!range.empty()) {
|
|
2687
2797
|
super_version->imm->MultiGet(read_options, &range, callback);
|
|
2688
2798
|
}
|
|
@@ -4753,7 +4863,8 @@ Status DBImpl::GetLatestSequenceForKey(
|
|
|
4753
4863
|
// Check if there is a record for this key in the latest memtable
|
|
4754
4864
|
sv->mem->Get(lkey, /*value=*/nullptr, timestamp, &s, &merge_context,
|
|
4755
4865
|
&max_covering_tombstone_seq, seq, read_options,
|
|
4756
|
-
nullptr /*read_callback*/,
|
|
4866
|
+
false /* immutable_memtable */, nullptr /*read_callback*/,
|
|
4867
|
+
is_blob_index);
|
|
4757
4868
|
|
|
4758
4869
|
if (!(s.ok() || s.IsNotFound() || s.IsMergeInProgress())) {
|
|
4759
4870
|
// unexpected error reading memtable.
|
|
@@ -118,7 +118,6 @@ class Directories {
|
|
|
118
118
|
IOStatus Close(const IOOptions& options, IODebugContext* dbg) {
|
|
119
119
|
// close all directories for all database paths
|
|
120
120
|
IOStatus s = IOStatus::OK();
|
|
121
|
-
IOStatus temp_s = IOStatus::OK();
|
|
122
121
|
|
|
123
122
|
// The default implementation for Close() in Directory/FSDirectory class
|
|
124
123
|
// "NotSupported" status, the upper level interface should be able to
|
|
@@ -127,53 +126,35 @@ class Directories {
|
|
|
127
126
|
// `FSDirectory::Close()` yet
|
|
128
127
|
|
|
129
128
|
if (db_dir_) {
|
|
130
|
-
temp_s = db_dir_->Close(options, dbg);
|
|
131
|
-
if (!temp_s.ok()) {
|
|
132
|
-
|
|
133
|
-
temp_s.PermitUncheckedError();
|
|
134
|
-
} else {
|
|
135
|
-
s = temp_s;
|
|
136
|
-
}
|
|
129
|
+
IOStatus temp_s = db_dir_->Close(options, dbg);
|
|
130
|
+
if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
|
|
131
|
+
s = std::move(temp_s);
|
|
137
132
|
}
|
|
138
133
|
}
|
|
139
134
|
|
|
140
|
-
if
|
|
141
|
-
|
|
142
|
-
}
|
|
135
|
+
// Attempt to close everything even if one fails
|
|
136
|
+
s.PermitUncheckedError();
|
|
143
137
|
|
|
144
138
|
if (wal_dir_) {
|
|
145
|
-
|
|
146
|
-
if (!temp_s.ok()) {
|
|
147
|
-
|
|
148
|
-
temp_s.PermitUncheckedError();
|
|
149
|
-
} else {
|
|
150
|
-
s = temp_s;
|
|
151
|
-
}
|
|
139
|
+
IOStatus temp_s = wal_dir_->Close(options, dbg);
|
|
140
|
+
if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
|
|
141
|
+
s = std::move(temp_s);
|
|
152
142
|
}
|
|
153
143
|
}
|
|
154
144
|
|
|
155
|
-
|
|
156
|
-
return s;
|
|
157
|
-
}
|
|
145
|
+
s.PermitUncheckedError();
|
|
158
146
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (temp_s.IsNotSupported()) {
|
|
165
|
-
temp_s.PermitUncheckedError();
|
|
166
|
-
} else {
|
|
167
|
-
return temp_s;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
147
|
+
for (auto& data_dir_ptr : data_dirs_) {
|
|
148
|
+
if (data_dir_ptr) {
|
|
149
|
+
IOStatus temp_s = data_dir_ptr->Close(options, dbg);
|
|
150
|
+
if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
|
|
151
|
+
s = std::move(temp_s);
|
|
170
152
|
}
|
|
171
153
|
}
|
|
172
154
|
}
|
|
173
155
|
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
temp_s.PermitUncheckedError();
|
|
156
|
+
// Ready for caller
|
|
157
|
+
s.MustCheck();
|
|
177
158
|
return s;
|
|
178
159
|
}
|
|
179
160
|
|
|
@@ -2279,6 +2260,8 @@ class DBImpl : public DB {
|
|
|
2279
2260
|
Status IncreaseFullHistoryTsLowImpl(ColumnFamilyData* cfd,
|
|
2280
2261
|
std::string ts_low);
|
|
2281
2262
|
|
|
2263
|
+
bool ShouldReferenceSuperVersion(const MergeContext& merge_context);
|
|
2264
|
+
|
|
2282
2265
|
// Lock over the persistent DB state. Non-nullptr iff successfully acquired.
|
|
2283
2266
|
FileLock* db_lock_;
|
|
2284
2267
|
|
|
@@ -109,12 +109,18 @@ IOStatus DBImpl::SyncClosedLogs(JobContext* job_context,
|
|
|
109
109
|
ROCKS_LOG_INFO(immutable_db_options_.info_log,
|
|
110
110
|
"[JOB %d] Syncing log #%" PRIu64, job_context->job_id,
|
|
111
111
|
log->get_log_number());
|
|
112
|
+
if (error_handler_.IsRecoveryInProgress()) {
|
|
113
|
+
log->file()->reset_seen_error();
|
|
114
|
+
}
|
|
112
115
|
io_s = log->file()->Sync(immutable_db_options_.use_fsync);
|
|
113
116
|
if (!io_s.ok()) {
|
|
114
117
|
break;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
if (immutable_db_options_.recycle_log_file_num > 0) {
|
|
121
|
+
if (error_handler_.IsRecoveryInProgress()) {
|
|
122
|
+
log->file()->reset_seen_error();
|
|
123
|
+
}
|
|
118
124
|
io_s = log->Close();
|
|
119
125
|
if (!io_s.ok()) {
|
|
120
126
|
break;
|
|
@@ -229,6 +235,8 @@ Status DBImpl::FlushMemTableToOutputFile(
|
|
|
229
235
|
mutex_.Lock();
|
|
230
236
|
if (log_io_s.ok() && synced_wals.IsWalAddition()) {
|
|
231
237
|
log_io_s = status_to_io_status(ApplyWALToManifest(&synced_wals));
|
|
238
|
+
TEST_SYNC_POINT_CALLBACK("DBImpl::FlushMemTableToOutputFile:CommitWal:1",
|
|
239
|
+
nullptr);
|
|
232
240
|
}
|
|
233
241
|
|
|
234
242
|
if (!log_io_s.ok() && !log_io_s.IsShutdownInProgress() &&
|
|
@@ -1686,8 +1694,7 @@ Status DBImpl::ReFitLevel(ColumnFamilyData* cfd, int level, int target_level) {
|
|
|
1686
1694
|
f->smallest, f->largest, f->fd.smallest_seqno, f->fd.largest_seqno,
|
|
1687
1695
|
f->marked_for_compaction, f->temperature, f->oldest_blob_file_number,
|
|
1688
1696
|
f->oldest_ancester_time, f->file_creation_time, f->file_checksum,
|
|
1689
|
-
f->file_checksum_func_name, f->
|
|
1690
|
-
f->unique_id);
|
|
1697
|
+
f->file_checksum_func_name, f->unique_id);
|
|
1691
1698
|
}
|
|
1692
1699
|
ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
|
|
1693
1700
|
"[%s] Apply version edit:\n%s", cfd->GetName().c_str(),
|
|
@@ -1853,8 +1860,7 @@ Status DBImpl::RunManualCompaction(
|
|
|
1853
1860
|
// jobs drops to zero. This used to be needed to ensure that this manual
|
|
1854
1861
|
// compaction can compact any range of keys/files. Now it is optional
|
|
1855
1862
|
// (see `CompactRangeOptions::exclusive_manual_compaction`). The use case for
|
|
1856
|
-
// `exclusive_manual_compaction=true`
|
|
1857
|
-
// trusting the new code.
|
|
1863
|
+
// `exclusive_manual_compaction=true` is unclear beyond not trusting the code.
|
|
1858
1864
|
//
|
|
1859
1865
|
// HasPendingManualCompaction() is true when at least one thread is inside
|
|
1860
1866
|
// RunManualCompaction(), i.e. during that time no other compaction will
|
|
@@ -3314,7 +3320,7 @@ Status DBImpl::BackgroundCompaction(bool* made_progress,
|
|
|
3314
3320
|
f->fd.largest_seqno, f->marked_for_compaction, f->temperature,
|
|
3315
3321
|
f->oldest_blob_file_number, f->oldest_ancester_time,
|
|
3316
3322
|
f->file_creation_time, f->file_checksum, f->file_checksum_func_name,
|
|
3317
|
-
f->
|
|
3323
|
+
f->unique_id);
|
|
3318
3324
|
|
|
3319
3325
|
ROCKS_LOG_BUFFER(
|
|
3320
3326
|
log_buffer,
|