Skip to content

Commit 480f9da

Browse files
authored
add test to dsproxy put (#10214)
1 parent d3eebb6 commit 480f9da

File tree

5 files changed

+213
-24
lines changed

5 files changed

+213
-24
lines changed

ydb/core/blobstorage/dsproxy/ut/dsproxy_env_mock_ut.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ struct TDSProxyEnv {
130130
.TimeStatsEnabled = Mon->TimeStats.IsEnabled(),
131131
.Stats = PerDiskStatsPtr,
132132
.EnableRequestMod3x3ForMinLatency = false,
133+
.LongRequestThreshold = TDuration::Seconds(1),
133134
}));
134135
}
135136

ydb/core/blobstorage/dsproxy/ut/dsproxy_get_ut.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void TestIntervalsAndCrcAllOk(TErasureType::EErasureSpecies erasureSpecies, bool
3636
const ui32 groupId = 0;
3737
const ui32 domainCount = groupType.BlobSubgroupSize();
3838

39-
TGroupMock group(groupId, erasureSpecies, domainCount, 1);
39+
TGroupMock group(groupId, erasureSpecies, domainCount, 1, 1);
4040
TIntrusivePtr<TGroupQueues> groupQueues = group.MakeGroupQueues();
4141

4242
const ui64 maxQueryCount = 32;
@@ -245,7 +245,7 @@ class TTestWipedAllOkStep {
245245
void Init() {
246246
SendVPuts.clear();
247247
Group.Clear();
248-
Group.ConstructInPlace(GroupId, ErasureSpecies, DomainCount, 1);
248+
Group.ConstructInPlace(GroupId, ErasureSpecies, DomainCount, 1, 1);
249249
GroupQueues = Group->MakeGroupQueues();
250250
BlobSet.Clear();
251251
BlobSet.ConstructInPlace();
@@ -423,7 +423,7 @@ class TGetSimulator {
423423

424424
TGetSimulator(ui32 groupId, TErasureType::EErasureSpecies erasureSpecies, ui32 failDomains,
425425
ui32 drivesPerFailDomain)
426-
: Group(groupId, erasureSpecies, failDomains, drivesPerFailDomain)
426+
: Group(groupId, erasureSpecies, failDomains, 1, drivesPerFailDomain)
427427
, GroupQueues(Group.MakeGroupQueues())
428428
{}
429429

@@ -532,7 +532,7 @@ Y_UNIT_TEST(TestBlock42VGetCountWithErasure) {
532532

533533
const ui32 isRestore = 0;
534534

535-
TGroupMock group(groupId, erasureSpecies, domainCount, 1);
535+
TGroupMock group(groupId, erasureSpecies, domainCount, 1, 1);
536536
TIntrusivePtr<TGroupQueues> groupQueues = group.MakeGroupQueues();
537537
TBlobTestSet blobSet;
538538
blobSet.AddBlobs(blobs);
@@ -672,7 +672,7 @@ Y_UNIT_TEST(TestBlock42WipedOneDiskAndErrorDurringGet) {
672672

673673
const ui32 isRestore = 0;
674674

675-
TGroupMock group(groupId, erasureSpecies, domainCount, 1);
675+
TGroupMock group(groupId, erasureSpecies, domainCount, 1, 1);
676676
TIntrusivePtr<TGroupQueues> groupQueues = group.MakeGroupQueues();
677677
TBlobTestSet blobSet;
678678
blobSet.AddBlobs(blobs);
@@ -939,7 +939,7 @@ void TestWipedErrorWithTwoBlobs(TErasureType::EErasureSpecies erasureSpecies, bo
939939

940940
for (ui64 it = 0; it < 100; ++it, ++seed) {
941941
SetRandomSeed(seed);
942-
TGroupMock group(groupId, erasureSpecies, domainCount, 1);
942+
TGroupMock group(groupId, erasureSpecies, domainCount, 1, 1);
943943
TIntrusivePtr<TGroupQueues> groupQueues = group.MakeGroupQueues();
944944
TBlobTestSet blobSet;
945945
blobSet.AddBlobs(blobs);
@@ -1207,7 +1207,7 @@ class TTestPossibleBlobLost {
12071207
, DomainCount(GroupType.BlobSubgroupSize())
12081208
, MaxQueryCount(maxQueryCount)
12091209
, BlobSize(blobSize)
1210-
, Group(0, ErasureSpecies, DomainCount, 1)
1210+
, Group(0, ErasureSpecies, DomainCount, 1, 1)
12111211
, ErroneousVDisks(Group.GetInfo()->Type.BlobSubgroupSize(), NKikimrProto::OK)
12121212
{
12131213
BlobSet.GenerateSet(0, MaxQueryCount, BlobSize);
@@ -1415,7 +1415,7 @@ class TTestNoDataRegression {
14151415
TTestNoDataRegression(EMode mode)
14161416
: GroupType(ErasureSpecies)
14171417
, DomainCount(GroupType.BlobSubgroupSize())
1418-
, Group(0, ErasureSpecies, DomainCount, 1)
1418+
, Group(0, ErasureSpecies, DomainCount, 1, 1)
14191419
, Mode(mode)
14201420
{
14211421
BlobSet.GenerateSet(0, MaxQueryCount, BlobSize);

ydb/core/blobstorage/dsproxy/ut/dsproxy_put_ut.cpp

Lines changed: 178 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
#include "defs.h"
2-
#include "dsproxy_vdisk_mock_ut.h"
32
#include "dsproxy_env_mock_ut.h"
3+
#include "dsproxy_test_state_ut.h"
44

55
#include <ydb/core/blobstorage/dsproxy/dsproxy_put_impl.h>
6+
#include <ydb/core/blobstorage/dsproxy/dsproxy_request_reporting.h>
67
#include <ydb/core/blobstorage/vdisk/common/vdisk_events.h>
78

89
#include <ydb/core/testlib/basics/runtime.h>
910
#include <ydb/core/testlib/actor_helpers.h>
1011

1112
#include <library/cpp/containers/stack_vector/stack_vec.h>
12-
#include <library/cpp/testing/unittest/registar.h>
1313

1414
namespace NKikimr {
1515
namespace NDSProxyPutTest {
@@ -35,7 +35,7 @@ void TestPutMaxPartCountOnHandoff(TErasureType::EErasureSpecies erasureSpecies)
3535
TBlobStorageGroupType groupType(erasureSpecies);
3636
const ui32 domainCount = groupType.BlobSubgroupSize();;
3737

38-
TGroupMock group(groupId, erasureSpecies, domainCount, 1);
38+
TGroupMock group(groupId, erasureSpecies, 1, domainCount, 1);
3939
TIntrusivePtr<TGroupQueues> groupQueues = group.MakeGroupQueues();
4040

4141
TIntrusivePtr<::NMonitoring::TDynamicCounters> counters(new ::NMonitoring::TDynamicCounters());
@@ -175,7 +175,7 @@ struct TTestPutAllOk {
175175

176176
TTestPutAllOk()
177177
: GroupType(ErasureSpecies)
178-
, Group(GroupId, ErasureSpecies, GroupType.BlobSubgroupSize(), 1)
178+
, Group(GroupId, ErasureSpecies, 1, GroupType.BlobSubgroupSize(), 1)
179179
, GroupQueues(Group.MakeGroupQueues())
180180
, BlobIds({TLogoBlobID(743284823, 10, 12345, 0, DataSize, 0), TLogoBlobID(743284823, 9, 12346, 0, DataSize, 0)})
181181
, Data(AlphaData(DataSize))
@@ -386,6 +386,180 @@ Y_UNIT_TEST(TestMirror3dcWith3x3MinLatencyMod) {
386386
}
387387
}
388388

389+
void TestPutResultWithVDiskResults(TBlobStorageGroupType type, TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses, uint expectedVdiskRequests, NKikimrProto::EReplyStatus resultStatus) {
390+
TTestBasicRuntime runtime(1, false);
391+
runtime.SetDispatchTimeout(TDuration::Seconds(1));
392+
runtime.SetLogPriority(NKikimrServices::BS_PROXY_PUT, NLog::PRI_DEBUG);
393+
SetupRuntime(runtime);
394+
TDSProxyEnv env;
395+
env.Configure(runtime, type, 0, 0);
396+
TTestState testState(runtime, type, env.Info);
397+
398+
TLogoBlobID blobId(72075186224047637, 1, 863, 1, 786, 24576);
399+
TStringBuilder dataBuilder;
400+
for (size_t i = 0; i < blobId.BlobSize(); ++i) {
401+
dataBuilder << 'a';
402+
}
403+
TBlobTestSet::TBlob blob(blobId, dataBuilder);
404+
405+
TGroupMock &groupMock = testState.GetGroupMock();
406+
for (const auto& status : vdiskStatuses) {
407+
groupMock.SetError(status.first, status.second);
408+
}
409+
410+
411+
TEvBlobStorage::TEvPut::ETactic tactic = TEvBlobStorage::TEvPut::TacticDefault;
412+
NKikimrBlobStorage::EPutHandleClass handleClass = NKikimrBlobStorage::TabletLog;
413+
414+
TEvBlobStorage::TEvPut::TPtr ev = testState.CreatePutRequest(blob, tactic, handleClass);
415+
auto putActor = env.CreatePutRequestActor(ev);
416+
runtime.Register(putActor.release());
417+
418+
auto reportActor = std::unique_ptr<IActor>(CreateRequestReportingThrottler(1));
419+
runtime.Register(reportActor.release());
420+
421+
for (ui64 idx = 0; idx < expectedVdiskRequests; ++idx) {
422+
TEvBlobStorage::TEvVPut::TPtr ev = testState.GrabEventPtr<TEvBlobStorage::TEvVPut>();
423+
TVDiskID vDiskId = VDiskIDFromVDiskID(ev->Get()->Record.GetVDiskID());
424+
NKikimrProto::EReplyStatus status = groupMock.OnVPut(*ev->Get());
425+
TEvBlobStorage::TEvVPutResult::TPtr result = testState.CreateEventResultPtr(ev, status, vDiskId);
426+
runtime.Send(result.Release());
427+
}
428+
429+
TMap<TLogoBlobID, NKikimrProto::EReplyStatus> expectedStatus {
430+
{blobId, resultStatus}
431+
};
432+
testState.ReceivePutResults(1, expectedStatus);
433+
}
434+
435+
Y_UNIT_TEST(TestBlock42PutStatusOkWith_0_0_VdiskErrors) {
436+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, {}, 6, NKikimrProto::OK);
437+
}
438+
439+
Y_UNIT_TEST(TestBlock42PutStatusOkWith_1_0_VdiskErrors) {
440+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
441+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
442+
};
443+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 7, NKikimrProto::OK);
444+
}
445+
446+
Y_UNIT_TEST(TestBlock42PutStatusOkWith_1_1_VdiskErrors) {
447+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
448+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
449+
{TVDiskID(0, 1, 0, 6, 0), NKikimrProto::ERROR},
450+
};
451+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 8, NKikimrProto::OK);
452+
}
453+
454+
Y_UNIT_TEST(TestBlock42PutStatusOkWith_2_0_VdiskErrors) {
455+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
456+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
457+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
458+
};
459+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 8, NKikimrProto::OK);
460+
}
461+
462+
Y_UNIT_TEST(TestBlock42PutStatusErrorWith_2_1_VdiskErrors) {
463+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
464+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
465+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
466+
{TVDiskID(0, 1, 0, 6, 0), NKikimrProto::ERROR},
467+
};
468+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 8, NKikimrProto::ERROR);
469+
}
470+
471+
Y_UNIT_TEST(TestBlock42PutStatusErrorWith_3_0_VdiskErrors) {
472+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
473+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
474+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
475+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
476+
};
477+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 6, NKikimrProto::ERROR);
478+
}
479+
480+
Y_UNIT_TEST(TestBlock42PutStatusErrorWith_1_2_VdiskErrors) {
481+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
482+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
483+
{TVDiskID(0, 1, 0, 6, 0), NKikimrProto::ERROR},
484+
{TVDiskID(0, 1, 0, 7, 0), NKikimrProto::ERROR},
485+
};
486+
TestPutResultWithVDiskResults({TErasureType::Erasure4Plus2Block}, vdiskStatuses, 8, NKikimrProto::ERROR);
487+
}
488+
489+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_0_0_0_VdiskErrors) {
490+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, {}, 3, NKikimrProto::OK);
491+
}
492+
493+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_1_0_0_VdiskErrors) {
494+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
495+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
496+
};
497+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 4, NKikimrProto::OK);
498+
}
499+
500+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_2_0_0_VdiskErrors) {
501+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
502+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
503+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
504+
};
505+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 5, NKikimrProto::OK);
506+
}
507+
508+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_3_0_0_VdiskErrors) {
509+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
510+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
511+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
512+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
513+
};
514+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 7, NKikimrProto::OK);
515+
}
516+
517+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_1_1_0_VdiskErrors) {
518+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
519+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
520+
{TVDiskID(0, 1, 1, 1, 0), NKikimrProto::ERROR},
521+
};
522+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 5, NKikimrProto::OK);
523+
}
524+
525+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_2_1_0_VdiskErrors) {
526+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
527+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
528+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
529+
{TVDiskID(0, 1, 1, 1, 0), NKikimrProto::ERROR},
530+
};
531+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 6, NKikimrProto::OK);
532+
}
533+
534+
Y_UNIT_TEST(TestMirror3dcPutStatusErrorWith_1_1_1_VdiskErrors) {
535+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
536+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
537+
{TVDiskID(0, 1, 1, 1, 0), NKikimrProto::ERROR},
538+
{TVDiskID(0, 1, 2, 1, 0), NKikimrProto::ERROR},
539+
};
540+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 3, NKikimrProto::ERROR);
541+
}
542+
543+
Y_UNIT_TEST(TestMirror3dcPutStatusErrorWith_2_2_0_VdiskErrors) {
544+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
545+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
546+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
547+
{TVDiskID(0, 1, 1, 1, 0), NKikimrProto::ERROR},
548+
{TVDiskID(0, 1, 1, 2, 0), NKikimrProto::ERROR},
549+
};
550+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 5, NKikimrProto::ERROR);
551+
}
552+
553+
Y_UNIT_TEST(TestMirror3dcPutStatusOkWith_3_1_0_VdiskErrors) {
554+
TMap<TVDiskID, NKikimrProto::EReplyStatus> vdiskStatuses {
555+
{TVDiskID(0, 1, 0, 0, 0), NKikimrProto::ERROR},
556+
{TVDiskID(0, 1, 0, 1, 0), NKikimrProto::ERROR},
557+
{TVDiskID(0, 1, 0, 2, 0), NKikimrProto::ERROR},
558+
{TVDiskID(0, 1, 1, 1, 0), NKikimrProto::ERROR},
559+
};
560+
TestPutResultWithVDiskResults({TErasureType::ErasureMirror3dc}, vdiskStatuses, 8, NKikimrProto::OK);
561+
}
562+
389563
} // Y_UNIT_TEST_SUITE TDSProxyPutTest
390564
} // namespace NDSProxyPutTest
391565
} // namespace NKikimr

ydb/core/blobstorage/dsproxy/ut/dsproxy_test_state_ut.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ struct TTestState {
2626
{
2727
}
2828

29-
TTestState(TTestActorRuntime &runtime, const TBlobStorageGroupType &type, ui64 nodeIndex = 0)
29+
TTestState(TTestActorRuntime &runtime, const TBlobStorageGroupType &type, ui64 nodeIndex = 0, ui32 failRealms = 1)
3030
: Runtime(runtime)
3131
, EdgeActor(runtime.AllocateEdgeActor(nodeIndex))
3232
, Type(type)
33-
, GroupMock(0, Type.GetErasure(), Type.BlobSubgroupSize(), 1)
33+
, GroupMock(0, Type.GetErasure(), failRealms, Type.BlobSubgroupSize(), 1)
3434
, Info(GroupMock.GetInfo())
3535
{
3636
}

ydb/core/blobstorage/dsproxy/ut/dsproxy_vdisk_mock_ut.h

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,11 @@ class TGroupMock {
305305
const ui32 GroupId;
306306
const TErasureType::EErasureSpecies ErasureSpecies;
307307
const ui32 FailDomains;
308+
const ui32 FailRealms;
308309
const ui32 DrivesPerFailDomain;
309310

310311
TVector<TVDiskMock> VDisks;
312+
THashMap<TVDiskID, ui32> VDisksIdxMap;
311313
TIntrusivePtr<TBlobStorageGroupInfo> Info;
312314

313315
TVDiskMock& GetVDisk(ui32 failDomainIdx, ui32 driveIdx) {
@@ -316,21 +318,28 @@ class TGroupMock {
316318
return VDisks[i];
317319
}
318320

321+
TVDiskMock& GetVDisk(TVDiskID vdiskId) {
322+
return VDisks[VDisksIdxMap[vdiskId]];
323+
}
324+
319325
void InitBsInfo() {
320326
for (auto& mock : VDisks) {
321327
mock.SetInfo(Info);
322328
}
323329
}
324330

325331
void InitVDisks() {
332+
for (ui64 realmIdx = 0; realmIdx < FailRealms; ++realmIdx) {
326333
for (ui64 domainIdx = 0; domainIdx < FailDomains; ++domainIdx) {
327-
for (ui64 driveIdx = 0; driveIdx < DrivesPerFailDomain; ++driveIdx) {
328-
// Node = domainIdx
329-
// PoolId = driveIdx
330-
// LocalId = index in VDisks
331-
TVDiskID vDiskId(GroupId, 1, 0, domainIdx, driveIdx);
332-
VDisks.emplace_back(vDiskId);
333-
}
334+
for (ui64 driveIdx = 0; driveIdx < DrivesPerFailDomain; ++driveIdx) {
335+
// Node = domainIdx
336+
// PoolId = driveIdx
337+
// LocalId = index in VDisks
338+
TVDiskID vDiskId(GroupId, 1, realmIdx, domainIdx, driveIdx);
339+
VDisks.emplace_back(vDiskId);
340+
VDisksIdxMap[vDiskId] = VDisks.size() - 1;
341+
}
342+
}
334343
}
335344
}
336345

@@ -340,6 +349,7 @@ class TGroupMock {
340349
: GroupId(groupId)
341350
, ErasureSpecies(erasureSpecies)
342351
, FailDomains(failDomains)
352+
, FailRealms(info->GetTopology().GetTotalFailRealmsNum())
343353
, DrivesPerFailDomain(drivesPerFailDomain)
344354
, Info(info)
345355
{
@@ -348,14 +358,14 @@ class TGroupMock {
348358
InitBsInfo();
349359
}
350360

351-
TGroupMock(ui32 groupId, TErasureType::EErasureSpecies erasureSpecies, ui32 failDomains, ui32 drivesPerFailDomain)
361+
TGroupMock(ui32 groupId, TErasureType::EErasureSpecies erasureSpecies, ui32 failDomains, ui32 failRealms, ui32 drivesPerFailDomain)
352362
: TGroupMock(groupId, erasureSpecies, failDomains, drivesPerFailDomain,
353-
new TBlobStorageGroupInfo(erasureSpecies, drivesPerFailDomain, failDomains))
363+
new TBlobStorageGroupInfo(erasureSpecies, drivesPerFailDomain, failDomains, failRealms))
354364
{
355365
}
356366

357367
ui32 VDiskIdx(const TVDiskID &id) {
358-
ui32 idx = (ui32)id.FailDomain * DrivesPerFailDomain + (ui32)id.VDisk;
368+
ui32 idx = (ui32)id.FailRealm * FailDomains * DrivesPerFailDomain + (ui32)id.FailDomain * DrivesPerFailDomain + (ui32)id.VDisk;
359369
return idx;
360370
}
361371

@@ -431,6 +441,10 @@ class TGroupMock {
431441
}
432442
}
433443

444+
void SetError(TVDiskID vdiskId, NKikimrProto::EReplyStatus status) {
445+
GetVDisk(vdiskId).SetError(status);
446+
}
447+
434448
void SetPredictedDelayNs(ui32 domainIdx, ui64 predictedDelayNs) {
435449
for (ui64 driveIdx = 0; driveIdx < DrivesPerFailDomain; ++driveIdx) {
436450
GetVDisk(domainIdx, driveIdx).SetPredictedDelayNs(predictedDelayNs);

0 commit comments

Comments
 (0)