66
77namespace NKikimr {
88
9+ template <class TRecord >
10+ void ReportResponse (const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx);
911void LogOOSStatus (ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags);
1012void UpdateMonOOSStatus (ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpaceGroup>& monGroup);
13+ void UpdateMonResponseStatus (NKikimrProto::EReplyStatus status, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
1114
1215void 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
2023void 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+
72144void 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