From 56c8c756289cd5bddf23d46328ddcadb2ef48856 Mon Sep 17 00:00:00 2001 From: Alexander Rutkovsky Date: Mon, 8 Jul 2024 18:06:12 +0300 Subject: [PATCH 1/2] Handle empty GC commands correctly (#6398) --- ydb/core/blobstorage/ut_blobstorage/gc.cpp | 22 +++++++++++++++++++ ydb/core/blobstorage/ut_blobstorage/ya.make | 1 + .../vdisk/hullop/blobstorage_hull.cpp | 7 ++++++ 3 files changed, 30 insertions(+) create mode 100644 ydb/core/blobstorage/ut_blobstorage/gc.cpp diff --git a/ydb/core/blobstorage/ut_blobstorage/gc.cpp b/ydb/core/blobstorage/ut_blobstorage/gc.cpp new file mode 100644 index 000000000000..80c779093259 --- /dev/null +++ b/ydb/core/blobstorage/ut_blobstorage/gc.cpp @@ -0,0 +1,22 @@ +#include + +Y_UNIT_TEST_SUITE(GarbageCollection) { + Y_UNIT_TEST(EmptyGcCmd) { + TEnvironmentSetup env({ + .Erasure = TBlobStorageGroupType::Erasure4Plus2Block, + }); + auto& runtime = env.Runtime; + + env.CreateBoxAndPool(1, 1); + auto info = env.GetGroupInfo(env.GetGroups().front()); + + auto ev = std::make_unique(1u, 1u, 1u, 0u, false, 0u, 0u, nullptr, nullptr, + TInstant::Max(), true); + const TActorId edge = runtime->AllocateEdgeActor(1, __FILE__, __LINE__); + runtime->WrapInActorContext(edge, [&] { + SendToBSProxy(edge, info->GroupID, ev.release()); + }); + auto res = env.WaitForEdgeActorEvent(edge); + UNIT_ASSERT_VALUES_EQUAL(res->Get()->Status, NKikimrProto::ERROR); + } +} diff --git a/ydb/core/blobstorage/ut_blobstorage/ya.make b/ydb/core/blobstorage/ut_blobstorage/ya.make index 0a23886ceb35..daefe3430ff6 100644 --- a/ydb/core/blobstorage/ut_blobstorage/ya.make +++ b/ydb/core/blobstorage/ut_blobstorage/ya.make @@ -19,6 +19,7 @@ SRCS( defrag.cpp encryption.cpp extra_block_checks.cpp + gc.cpp gc_quorum_3dc.cpp group_reconfiguration.cpp incorrect_queries.cpp diff --git a/ydb/core/blobstorage/vdisk/hullop/blobstorage_hull.cpp b/ydb/core/blobstorage/vdisk/hullop/blobstorage_hull.cpp index 27a80af6f3cb..45ea62ab138e 100644 --- a/ydb/core/blobstorage/vdisk/hullop/blobstorage_hull.cpp +++ b/ydb/core/blobstorage/vdisk/hullop/blobstorage_hull.cpp @@ -415,6 +415,13 @@ namespace NKikimr { if (!CheckGC(ctx, record)) return {NKikimrProto::ERROR, 0, false}; // record has duplicates + if (!collect && !record.KeepSize() && !record.DoNotKeepSize()) { + LOG_ERROR_S(ctx, NKikimrServices::BS_HULLRECS, HullDs->HullCtx->VCtx->VDiskLogPrefix + << "Db# Barriers ValidateGCCmd: empty garbage collection command" + << " TabletId# " << tabletID); + return {NKikimrProto::ERROR, "empty garbage collection command"}; + } + auto blockStatus = THullDbRecovery::IsBlocked(record); switch (blockStatus.Status) { case TBlocksCache::EStatus::OK: From 873405993e4844a501a37b8cc41c853020e89c6e Mon Sep 17 00:00:00 2001 From: Alexander Rutkovsky Date: Mon, 8 Jul 2024 18:07:28 +0300 Subject: [PATCH 2/2] Fix VDisk replication stuck sensor bug (#6405) --- ydb/core/blobstorage/vdisk/repl/blobstorage_repl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ydb/core/blobstorage/vdisk/repl/blobstorage_repl.cpp b/ydb/core/blobstorage/vdisk/repl/blobstorage_repl.cpp index 3c88c998a38c..47906cdd0963 100644 --- a/ydb/core/blobstorage/vdisk/repl/blobstorage_repl.cpp +++ b/ydb/core/blobstorage/vdisk/repl/blobstorage_repl.cpp @@ -409,8 +409,8 @@ namespace NKikimr { // no more blobs to replicate; replication will not resume State = Finished; ReplCtx->MonGroup.ReplUnreplicatedVDisks() = 0; - ReplCtx->MonGroup.ReplUnreplicatedPhantoms() = 1; - ReplCtx->MonGroup.ReplUnreplicatedNonPhantoms() = 1; + ReplCtx->MonGroup.ReplUnreplicatedPhantoms() = 0; + ReplCtx->MonGroup.ReplUnreplicatedNonPhantoms() = 0; ReplCtx->MonGroup.ReplWorkUnitsRemaining() = 0; ReplCtx->MonGroup.ReplWorkUnitsDone() = 0; ReplCtx->MonGroup.ReplItemsRemaining() = 0;