summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Rutkovsky <[email protected]>2024-01-19 19:34:56 +0300
committerGitHub <[email protected]>2024-01-19 19:34:56 +0300
commit3c087a300d538f6485832bae240ba0b74629156d (patch)
tree19393b227dde173ed9c661ae12a88af8d5a9b059
parentb31d300c3d7eed658faac4ae008a6467da290c1e (diff)
Unittest for mirror-3-dc IndexRestoreGet (#1159)
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/mirror3dc.cpp72
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/ya.make1
2 files changed, 73 insertions, 0 deletions
diff --git a/ydb/core/blobstorage/ut_blobstorage/mirror3dc.cpp b/ydb/core/blobstorage/ut_blobstorage/mirror3dc.cpp
new file mode 100644
index 00000000000..9f3c3b34c60
--- /dev/null
+++ b/ydb/core/blobstorage/ut_blobstorage/mirror3dc.cpp
@@ -0,0 +1,72 @@
+#include <ydb/core/blobstorage/ut_blobstorage/lib/env.h>
+#include <ydb/core/blobstorage/ut_blobstorage/lib/common.h>
+
+Y_UNIT_TEST_SUITE(Mirror3dcRestore) {
+
+ Y_UNIT_TEST(TestRestore) {
+ TEnvironmentSetup env{{.Erasure = TBlobStorageGroupType::ErasureMirror3dc}};
+ env.CreateBoxAndPool();
+ env.Sim(TDuration::Minutes(1));
+ const auto& groups = env.GetGroups();
+ const ui32 groupId = *groups.begin();
+ auto info = env.GetGroupInfo(groupId);
+
+ ui32 index = 1;
+
+ for (ui32 diskMask = 1; diskMask < 512; ++diskMask) {
+ TLogoBlobID id(index++, 1, 1, 0, 1, 1);
+ TString data(id.BlobSize(), 'X');
+
+ TBlobStorageGroupInfo::TVDiskIds vdiskIds;
+ TBlobStorageGroupInfo::TServiceIds serviceIds;
+ info->PickSubgroup(id.Hash(), &vdiskIds, &serviceIds);
+
+ for (ui32 i = 0; i < 9; ++i) {
+ if (diskMask >> i & 1) {
+ env.PutBlob(vdiskIds[i], TLogoBlobID(id, 1 + i % 3), data);
+ }
+ }
+
+ const TActorId& edge = env.Runtime->AllocateEdgeActor(1);
+ env.Runtime->WrapInActorContext(edge, [&] {
+ auto ev = std::make_unique<TEvBlobStorage::TEvGet>(id, 0, 0, TInstant::Max(),
+ NKikimrBlobStorage::EGetHandleClass::FastRead, true /*mustRestoreFirst*/, true /*isIndexOnly*/);
+ SendToBSProxy(edge, groupId, ev.release());
+ });
+ auto res = env.WaitForEdgeActorEvent<TEvBlobStorage::TEvGetResult>(edge, false);
+ UNIT_ASSERT_VALUES_EQUAL(res->Get()->Status, NKikimrProto::OK);
+ UNIT_ASSERT_VALUES_EQUAL(res->Get()->ResponseSz, 1);
+ UNIT_ASSERT_VALUES_EQUAL(res->Get()->Responses[0].Status, NKikimrProto::OK);
+
+ std::map<ui32, ui32> domainsPerRealm;
+
+ for (ui32 i = 0; i < vdiskIds.size(); ++i) {
+ env.WithQueueId(vdiskIds[i], NKikimrBlobStorage::EVDiskQueueId::GetFastRead, [&](TActorId queueId) {
+ const TActorId& edge = env.Runtime->AllocateEdgeActor(queueId.NodeId(), __FILE__, __LINE__);
+ env.Runtime->Send(new IEventHandle(queueId, edge, TEvBlobStorage::TEvVGet::CreateExtremeDataQuery(vdiskIds[i],
+ TInstant::Max(), NKikimrBlobStorage::EGetHandleClass::FastRead, TEvBlobStorage::TEvVGet::EFlags::None,
+ Nothing(), {{id, 0u, ui32(data.size())}}).release()), queueId.NodeId());
+ auto r = env.WaitForEdgeActorEvent<TEvBlobStorage::TEvVGetResult>(edge, false);
+ auto& record = r->Get()->Record;
+ UNIT_ASSERT_VALUES_EQUAL(record.GetStatus(), NKikimrProto::OK);
+ UNIT_ASSERT_VALUES_EQUAL(record.ResultSize(), 1);
+ const auto& res = record.GetResult(0);
+ if (res.GetStatus() == NKikimrProto::OK) {
+ UNIT_ASSERT_VALUES_EQUAL(data, r->Get()->GetBlobData(res).ConvertToString());
+ const ui32 realm = i % 3;
+ ++domainsPerRealm[realm];
+ }
+ });
+ }
+
+ ui32 realms1plus = 0, realms2plus = 0;
+ for (const auto& [_, domains] : domainsPerRealm) {
+ realms1plus += domains >= 1;
+ realms2plus += domains >= 2;
+ }
+
+ UNIT_ASSERT(realms1plus >= 3 || realms2plus >= 2);
+ }
+ }
+
+}
diff --git a/ydb/core/blobstorage/ut_blobstorage/ya.make b/ydb/core/blobstorage/ut_blobstorage/ya.make
index ca53b4d87da..7fa92b4924b 100644
--- a/ydb/core/blobstorage/ut_blobstorage/ya.make
+++ b/ydb/core/blobstorage/ut_blobstorage/ya.make
@@ -24,6 +24,7 @@ SRCS(
incorrect_queries.cpp
index_restore_get.cpp
main.cpp
+ mirror3dc.cpp
mirror3of4.cpp
monitoring.cpp
recovery.cpp