Skip to content

Commit cd33dba

Browse files
authored
Merge 8f9f617 into 47dde79
2 parents 47dde79 + 8f9f617 commit cd33dba

File tree

4 files changed

+139
-16
lines changed

4 files changed

+139
-16
lines changed

ydb/core/blobstorage/vdisk/common/vdisk_context.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ namespace NKikimr {
6161
, ReplNodeResponseQuoter(std::move(replNodeResponseQuoter))
6262
, CostTracker()
6363
, OOSMonGroup(std::make_shared<NMonGroup::TOutOfSpaceGroup>(VDiskCounters, "subsystem", "oos"))
64+
, ResponseStatusMonGroup(std::make_shared<NMonGroup::TResponseStatusGroup>(VDiskCounters, "subsystem", "status"))
6465
, OutOfSpaceState(Top->GetTotalVDisksNum(), Top->GetOrderNumber(ShortSelfVDisk))
6566
, CostMonGroup(vdiskCounters, "subsystem", "cost")
6667
, Logger(as ? ActorSystemLogger(as) : DevNullLogger())

ydb/core/blobstorage/vdisk/common/vdisk_context.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ namespace NKikimr {
7777
std::atomic<ui32> CurrentOOSStatusFlag = NKikimrBlobStorage::StatusIsValid;
7878
std::shared_ptr<NMonGroup::TOutOfSpaceGroup> OOSMonGroup;
7979

80+
// response status
81+
std::shared_ptr<NMonGroup::TResponseStatusGroup> ResponseStatusMonGroup;
82+
8083
private:
8184
// Managing disk space
8285
TOutOfSpaceState OutOfSpaceState;

ydb/core/blobstorage/vdisk/common/vdisk_mongroups.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,31 @@ public:
664664
COUNTER_DEF(ResponsesWithDiskSpaceLightYellowMove);
665665
};
666666

667+
///////////////////////////////////////////////////////////////////////////////////
668+
// TResponseStatusGroup
669+
///////////////////////////////////////////////////////////////////////////////////
670+
class TResponseStatusGroup : public TBase {
671+
public:
672+
GROUP_CONSTRUCTOR(TResponseStatusGroup)
673+
{
674+
COUNTER_INIT(ResponsesWithStatusError, true);
675+
COUNTER_INIT(ResponsesWithStatusRace, true);
676+
COUNTER_INIT(ResponsesWithStatusBlocked, true);
677+
COUNTER_INIT(ResponsesWithStatusOutOfSpace, true);
678+
COUNTER_INIT(ResponsesWithStatusDeadline, true);
679+
COUNTER_INIT(ResponsesWithStatusNotReady, true);
680+
COUNTER_INIT(ResponsesWithStatusVdiskErrorState, true);
681+
}
682+
683+
COUNTER_DEF(ResponsesWithStatusError);
684+
COUNTER_DEF(ResponsesWithStatusRace);
685+
COUNTER_DEF(ResponsesWithStatusBlocked);
686+
COUNTER_DEF(ResponsesWithStatusOutOfSpace);
687+
COUNTER_DEF(ResponsesWithStatusDeadline);
688+
COUNTER_DEF(ResponsesWithStatusNotReady);
689+
COUNTER_DEF(ResponsesWithStatusVdiskErrorState);
690+
};
691+
667692
///////////////////////////////////////////////////////////////////////////////////
668693
// TCostTrackerGroup
669694
///////////////////////////////////////////////////////////////////////////////////

ydb/core/blobstorage/vdisk/common/vdisk_response.cpp

Lines changed: 110 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66

77
namespace NKikimr {
88

9+
template <class TRecord>
10+
void ReportResponse(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx);
911
void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags);
1012
void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpaceGroup>& monGroup);
13+
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
1114

1215
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx) {
1316
ui32 channel = TInterconnectChannels::IC_BLOBSTORAGE;
@@ -19,22 +22,20 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
1922

2023
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx) {
2124
if (vCtx) {
22-
switch(ev->Type()) {
23-
case TEvBlobStorage::TEvVPutResult::EventType: {
24-
TEvBlobStorage::TEvVPutResult* event = static_cast<TEvBlobStorage::TEvVPutResult *>(ev);
25-
LogOOSStatus(event->Record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(event->Record.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
26-
UpdateMonOOSStatus(event->Record.GetStatusFlags(), vCtx->OOSMonGroup);
27-
break;
28-
}
29-
case TEvBlobStorage::TEvVMultiPutResult::EventType: {
30-
TEvBlobStorage::TEvVMultiPutResult *event = static_cast<TEvBlobStorage::TEvVMultiPutResult *>(ev);
31-
if (event->Record.ItemsSize() > 0) {
32-
const auto& item = event->Record.GetItems(0);
33-
LogOOSStatus(event->Record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(item.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
34-
UpdateMonOOSStatus(event->Record.GetStatusFlags(), vCtx->OOSMonGroup);
35-
}
36-
break;
25+
switch (ev->Type()) {
26+
#define HANDLE_EVENT(T) \
27+
case T::EventType: { \
28+
T *event = static_cast<T *>(ev); \
29+
ReportResponse(event->Record, vCtx); \
30+
break; \
3731
}
32+
33+
HANDLE_EVENT(TEvBlobStorage::TEvVPutResult)
34+
HANDLE_EVENT(TEvBlobStorage::TEvVMultiPutResult)
35+
HANDLE_EVENT(TEvBlobStorage::TEvVGetResult)
36+
HANDLE_EVENT(TEvBlobStorage::TEvVGetBlockResult)
37+
HANDLE_EVENT(TEvBlobStorage::TEvVCollectGarbageResult)
38+
#undef HANDLE_EVENT
3839
}
3940
}
4041

@@ -69,6 +70,77 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
6970
}
7071
}
7172

73+
template <typename T, typename Tuple>
74+
struct IsInTypes;
75+
76+
template <typename T, typename... Types>
77+
struct IsInTypes<T, std::tuple<Types...>> {
78+
static constexpr bool value = (std::is_same_v<T, Types> || ...);
79+
};
80+
81+
struct TReportingOSStatus {
82+
using EnableFor = std::tuple<
83+
NKikimrBlobStorage::TEvVPutResult,
84+
NKikimrBlobStorage::TEvVMultiPutResult>;
85+
86+
template <typename TRecord>
87+
static void Report(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
88+
LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(record.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
89+
UpdateMonOOSStatus(record.GetStatusFlags(), vCtx->OOSMonGroup);
90+
}
91+
92+
template<>
93+
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
94+
if (record.ItemsSize() > 0) {
95+
const auto& item = record.GetItems(0);
96+
LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(item.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
97+
UpdateMonOOSStatus(record.GetStatusFlags(), vCtx->OOSMonGroup);
98+
}
99+
}
100+
};
101+
102+
struct TReportingResponseStatus {
103+
using EnableFor = std::tuple<
104+
NKikimrBlobStorage::TEvVPutResult,
105+
NKikimrBlobStorage::TEvVMultiPutResult,
106+
NKikimrBlobStorage::TEvVGetResult,
107+
NKikimrBlobStorage::TEvVGetBlockResult,
108+
NKikimrBlobStorage::TEvVCollectGarbageResult>;
109+
110+
template <typename TRecord>
111+
static void Report(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
112+
UpdateMonResponseStatus(record.GetStatus(), vCtx->ResponseStatusMonGroup);
113+
}
114+
115+
template<>
116+
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
117+
for (const auto& item : record.GetItems()) {
118+
UpdateMonResponseStatus(item.GetStatus(), vCtx->ResponseStatusMonGroup);
119+
}
120+
}
121+
};
122+
123+
#define DEFUNE_REPORT(NAME) \
124+
template <typename TRecord> \
125+
typename std::enable_if<IsInTypes<TRecord, TReporting##NAME::EnableFor>::value>::type Report##NAME( \
126+
const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) { \
127+
TReporting##NAME::Report(record, vCtx); \
128+
} \
129+
\
130+
template <typename TRecord> \
131+
typename std::enable_if<!IsInTypes<TRecord, TReporting##NAME::EnableFor>::value>::type Report##NAME( \
132+
const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {}
133+
134+
DEFUNE_REPORT(OSStatus)
135+
DEFUNE_REPORT(ResponseStatus)
136+
#undef DEFUNE_REPORT
137+
138+
template <class TRecord>
139+
void ReportResponse(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
140+
ReportOSStatus(record, vCtx);
141+
ReportResponseStatus(record, vCtx);
142+
}
143+
72144
void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags) {
73145
if (!TlsActivationContext) {
74146
return;
@@ -111,4 +183,26 @@ void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpace
111183
}
112184
}
113185

114-
}//NKikimr
186+
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) {
187+
if (!monGroup) {
188+
return;
189+
}
190+
191+
if (status == NKikimrProto::ERROR) {
192+
monGroup->ResponsesWithStatusError().Inc();
193+
} else if (status == NKikimrProto::RACE) {
194+
monGroup->ResponsesWithStatusRace().Inc();
195+
} else if (status == NKikimrProto::BLOCKED) {
196+
monGroup->ResponsesWithStatusBlocked().Inc();
197+
} else if (status == NKikimrProto::OUT_OF_SPACE) {
198+
monGroup->ResponsesWithStatusOutOfSpace().Inc();
199+
} else if (status == NKikimrProto::DEADLINE) {
200+
monGroup->ResponsesWithStatusDeadline().Inc();
201+
} else if (status == NKikimrProto::NOTREADY) {
202+
monGroup->ResponsesWithStatusNotReady().Inc();
203+
} else if (status == NKikimrProto::VDISK_ERROR_STATE) {
204+
monGroup->ResponsesWithStatusVdiskErrorState().Inc();
205+
}
206+
}
207+
208+
} //NKikimr

0 commit comments

Comments
 (0)