77namespace NKikimr {
88
99template <class TRecord >
10- void ReportResponse (TRecord record, const TLogoBlobID& blobId, const TIntrusivePtr<TVDiskContext>& vCtx);
11-
12- template <class TRecord >
13- void ReportOSStatus (TRecord record, const TLogoBlobID& blobId, const TIntrusivePtr<TVDiskContext>& vCtx);
10+ void ReportResponse (const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx);
1411void LogOOSStatus (ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags);
1512void UpdateMonOOSStatus (ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpaceGroup>& monGroup);
16-
17- template <class TRecord >
18- void ReportResponseStatus (TRecord record, const TLogoBlobID& blobId, const TIntrusivePtr<TVDiskContext>& vCtx);
19- void UpdateMonResponseStatus (NKikimrProto::EReplyStatus status, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
13+ void UpdateMonResponseStatus (NKikimrProto::EReplyStatus status, HandleClassType handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
2014
2115void SendVDiskResponse (const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx) {
2216 ui32 channel = TInterconnectChannels::IC_BLOBSTORAGE;
@@ -28,20 +22,20 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
2822
2923void SendVDiskResponse (const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx) {
3024 if (vCtx) {
31- switch (ev->Type ()) {
32- case TEvBlobStorage::TEvVPutResult::EventType: {
33- TEvBlobStorage::TEvVPutResult* event = static_cast <TEvBlobStorage::TEvVPutResult *>(ev);
34- ReportResponse (event->Record , LogoBlobIDFromLogoBlobID (event->Record .GetBlobID ()), vCtx);
35- break ;
36- }
37- case TEvBlobStorage::TEvVMultiPutResult::EventType: {
38- TEvBlobStorage::TEvVMultiPutResult *event = static_cast <TEvBlobStorage::TEvVMultiPutResult *>(ev);
39- if (event->Record .ItemsSize () > 0 ) {
40- const auto & item = event->Record .GetItems (0 );
41- ReportResponse (event->Record , LogoBlobIDFromLogoBlobID (item.GetBlobID ()), vCtx);
42- }
43- 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 ; \
4431 }
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
4539 }
4640 }
4741
@@ -76,43 +70,75 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
7670 }
7771}
7872
79- template <class TRecord >
80- void ReportResponse (TRecord record, const TLogoBlobID& blobId, const TIntrusivePtr<TVDiskContext>& vCtx) {
81- ReportOSStatus (record, blobId, vCtx);
82- ReportResponseStatus (record, blobId, vCtx);
83- }
73+ template <typename T, typename Tuple>
74+ struct IsInTypes ;
8475
85- template <class TRecord >
86- void ReportResponseStatus (TRecord record, const TLogoBlobID& blobId, const TIntrusivePtr<TVDiskContext>& vCtx) {
87- UpdateMonResponseStatus (record. GetStatus (), vCtx-> ResponseStatusMonGroup );
88- }
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+ };
8980
90- void UpdateMonResponseStatus (NKikimrProto::EReplyStatus status, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) {
91- if (!monGroup) {
92- return ;
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 (), record.GetHandleClass (), vCtx->ResponseStatusMonGroup );
93113 }
94114
95- if (status == NKikimrProto::ERROR) {
96- monGroup->ResponsesWithStatusError ().Inc ();
97- } else if (status == NKikimrProto::RACE) {
98- monGroup->ResponsesWithStatusRace ().Inc ();
99- } else if (status == NKikimrProto::BLOCKED) {
100- monGroup->ResponsesWithStatusBlocked ().Inc ();
101- } else if (status == NKikimrProto::OUT_OF_SPACE) {
102- monGroup->ResponsesWithStatusOutOfSpace ().Inc ();
103- } else if (status == NKikimrProto::DEADLINE) {
104- monGroup->ResponsesWithStatusDeadline ().Inc ();
105- } else if (status == NKikimrProto::NOTREADY) {
106- monGroup->ResponsesWithStatusNotReady ().Inc ();
107- } else if (status == NKikimrProto::VDISK_ERROR_STATE) {
108- monGroup->ResponsesWithStatusVdiskErrorState ().Inc ();
115+ template <>
116+ void Report (const NKikimrBlobStorage::TEvVMultiPutResult& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
117+ for (const auto & item : record.GetItems ()) {
118+ UpdateMonResponseStatus (item.GetStatus (), record.GetHandleClass (), vCtx->ResponseStatusMonGroup );
109119 }
110120}
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
111137
112138template <class TRecord >
113- void ReportOSStatus (TRecord record, const TLogoBlobID& blobId , const TIntrusivePtr<TVDiskContext>& vCtx) {
114- LogOOSStatus (record. GetStatusFlags (), blobId, vCtx-> VDiskLogPrefix , vCtx-> CurrentOOSStatusFlag );
115- UpdateMonOOSStatus (record. GetStatusFlags () , vCtx-> OOSMonGroup );
139+ void ReportResponse ( const TRecord& record , const TIntrusivePtr<TVDiskContext>& vCtx) {
140+ ReportOSStatus (record, vCtx);
141+ ReportResponseStatus (record, vCtx);
116142}
117143
118144void LogOOSStatus (ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags) {
@@ -157,4 +183,13 @@ void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpace
157183 }
158184}
159185
186+ void UpdateMonResponseStatus (NKikimrProto::EReplyStatus status, HandleClassType handleClass,
187+ const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) {
188+ if (!monGroup) {
189+ return ;
190+ }
191+
192+ monGroup->GetCounter (status, handleClass).Inc ();
193+ }
194+
160195} // NKikimr
0 commit comments