@@ -163,12 +163,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
163
163
}
164
164
165
165
void AddVSlotsToSysViewResponse (NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr* ev, size_t groupCount,
166
- const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses) {
166
+ const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses, ui32 groupStartId = GROUP_START_ID ) {
167
167
auto & record = (*ev)->Get ()->Record ;
168
168
auto entrySample = record.entries (0 );
169
169
record.clear_entries ();
170
170
171
- auto groupId = GROUP_START_ID ;
171
+ auto groupId = groupStartId ;
172
172
const auto *descriptor = NKikimrBlobStorage::EVDiskStatus_descriptor ();
173
173
for (size_t i = 0 ; i < groupCount; ++i) {
174
174
auto vslotId = VCARD_START_ID;
@@ -252,13 +252,13 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
252
252
sPool ->set_name (STORAGE_POOL_NAME);
253
253
};
254
254
255
- void AddVSlotInVDiskStateResponse (TEvWhiteboard::TEvVDiskStateResponse::TPtr* ev, int groupCount, int vslotCount) {
255
+ void AddVSlotInVDiskStateResponse (TEvWhiteboard::TEvVDiskStateResponse::TPtr* ev, int groupCount, int vslotCount, ui32 groupStartId = GROUP_START_ID ) {
256
256
auto & pbRecord = (*ev)->Get ()->Record ;
257
257
258
258
auto sample = pbRecord.vdiskstateinfo (0 );
259
259
pbRecord.clear_vdiskstateinfo ();
260
260
261
- auto groupId = GROUP_START_ID ;
261
+ auto groupId = groupStartId ;
262
262
for (int i = 0 ; i < groupCount; i++) {
263
263
auto slotId = VCARD_START_ID;
264
264
for (int j = 0 ; j < vslotCount; j++) {
@@ -273,6 +273,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
273
273
}
274
274
}
275
275
276
+ void ChangeGroupStateResponse (NNodeWhiteboard::TEvWhiteboard::TEvBSGroupStateResponse::TPtr* ev) {
277
+ for (auto & groupInfo : *(*ev)->Get ()->Record .mutable_bsgroupstateinfo ()) {
278
+ groupInfo.set_erasurespecies (NHealthCheck::TSelfCheckRequest::BLOCK_4_2);
279
+ }
280
+ }
281
+
276
282
void SetLongHostValue (TEvInterconnect::TEvNodesInfo::TPtr* ev) {
277
283
TString host (1000000 , ' a' );
278
284
auto & pbRecord = (*ev)->Get ()->Nodes ;
@@ -383,7 +389,7 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
383
389
CheckHcResult (result, groupNumber, vdiscPerGroupNumber, isMergeRecords);
384
390
}
385
391
386
- Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses) {
392
+ Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses, bool forStaticGroup = false ) {
387
393
TPortManager tp;
388
394
ui16 port = tp.GetPort (2134 );
389
395
ui16 grpcPort = tp.GetPort (2135 );
@@ -418,7 +424,11 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
418
424
}
419
425
case NSysView::TEvSysView::EvGetVSlotsResponse: {
420
426
auto * x = reinterpret_cast <NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr*>(&ev);
421
- AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses);
427
+ if (forStaticGroup) {
428
+ AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses, 0 );
429
+ } else {
430
+ AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses);
431
+ }
422
432
break ;
423
433
}
424
434
case NSysView::TEvSysView::EvGetGroupsResponse: {
@@ -431,6 +441,19 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
431
441
AddStoragePoolsToSysViewResponse (x);
432
442
break ;
433
443
}
444
+ case NNodeWhiteboard::TEvWhiteboard::EvVDiskStateResponse: {
445
+ auto *x = reinterpret_cast <NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr*>(&ev);
446
+ if (forStaticGroup) {
447
+ AddVSlotInVDiskStateResponse (x, 1 , vdiskStatuses.size (), 0 );
448
+ } else {
449
+ AddVSlotInVDiskStateResponse (x, 1 , vdiskStatuses.size ());
450
+ }
451
+ break ;
452
+ }
453
+ case NNodeWhiteboard::TEvWhiteboard::EvBSGroupStateResponse: {
454
+ auto * x = reinterpret_cast <NNodeWhiteboard::TEvWhiteboard::TEvBSGroupStateResponse::TPtr*>(&ev);
455
+ ChangeGroupStateResponse (x);
456
+ }
434
457
}
435
458
436
459
return TTestActorRuntime::EEventAction::PROCESS;
@@ -444,10 +467,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
444
467
return runtime.GrabEdgeEvent <NHealthCheck::TEvSelfCheckResult>(handle)->Result ;
445
468
}
446
469
447
- void CheckHcResultHasIssuesWithStatus (Ydb::Monitoring::SelfCheckResult& result, const TString& type, const Ydb::Monitoring::StatusFlag::Status expectingStatus, ui32 total) {
470
+ void CheckHcResultHasIssuesWithStatus (Ydb::Monitoring::SelfCheckResult& result, const TString& type,
471
+ const Ydb::Monitoring::StatusFlag::Status expectingStatus, ui32 total,
472
+ std::string_view pool = " /Root:test" ) {
448
473
int issuesCount = 0 ;
449
474
for (const auto & issue_log : result.Getissue_log ()) {
450
- if (issue_log.type () == type && issue_log.location ().storage ().pool ().name () == " /Root:test " && issue_log.status () == expectingStatus) {
475
+ if (issue_log.type () == type && issue_log.location ().storage ().pool ().name () == pool && issue_log.status () == expectingStatus) {
451
476
issuesCount++;
452
477
}
453
478
}
@@ -589,6 +614,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
589
614
CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::RED, 1 );
590
615
}
591
616
617
+ Y_UNIT_TEST (StaticGroupIssue) {
618
+ auto result = RequestHcWithVdisks (NKikimrBlobStorage::TGroupStatus::PARTIAL, {NKikimrBlobStorage::ERROR}, /* forStatic*/ true );
619
+ Cerr << result.ShortDebugString () << Endl;
620
+ CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::YELLOW, 1 , " static" );
621
+ }
622
+
592
623
/* HC currently infers group status on its own, so it's never unknown
593
624
Y_UNIT_TEST(RedGroupIssueWhenUnknownGroupStatus) {
594
625
auto result = RequestHcWithVdisks(NKikimrBlobStorage::TGroupStatus::UNKNOWN, {});
0 commit comments