|
6 | 6 |
|
7 | 7 | namespace NKikimr { |
8 | 8 |
|
| 9 | +template <class TRecord> |
| 10 | +void ReportResponse(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx); |
9 | 11 | void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags); |
10 | 12 | void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpaceGroup>& monGroup); |
| 13 | +void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const TCommonHandleClass& handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup); |
11 | 14 |
|
12 | | -void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 15 | +void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx, const TCommonHandleClass& handleClass) { |
13 | 16 | ui32 channel = TInterconnectChannels::IC_BLOBSTORAGE; |
14 | 17 | if (TEvVResultBase *base = dynamic_cast<TEvVResultBase *>(ev)) { |
15 | 18 | channel = base->GetChannelToSend(); |
16 | 19 | } |
17 | | - SendVDiskResponse(ctx, recipient, ev, cookie, channel, vCtx); |
| 20 | + SendVDiskResponse(ctx, recipient, ev, cookie, channel, vCtx, handleClass); |
18 | 21 | } |
19 | 22 |
|
20 | | -void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 23 | +void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx, const TCommonHandleClass& handleClass) { |
21 | 24 | 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, handleClass, vCtx); \ |
| 30 | + break; \ |
37 | 31 | } |
| 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 |
38 | 39 | } |
39 | 40 | } |
40 | 41 |
|
@@ -69,6 +70,77 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve |
69 | 70 | } |
70 | 71 | } |
71 | 72 |
|
| 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 TCommonHandleClass&, 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 TCommonHandleClass&, 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 TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 112 | + UpdateMonResponseStatus(record.GetStatus(), handleClass, vCtx->ResponseStatusMonGroup); |
| 113 | + } |
| 114 | + |
| 115 | + template<> |
| 116 | + void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 117 | + for (const auto& item : record.GetItems()) { |
| 118 | + UpdateMonResponseStatus(item.GetStatus(), handleClass, 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 TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { \ |
| 127 | + TReporting##NAME::Report(record, handleClass, 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 TCommonHandleClass& handleClass, 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 TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 140 | + ReportOSStatus(record, handleClass, vCtx); |
| 141 | + ReportResponseStatus(record, handleClass, vCtx); |
| 142 | +} |
| 143 | + |
72 | 144 | void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags) { |
73 | 145 | if (!TlsActivationContext) { |
74 | 146 | return; |
@@ -111,4 +183,18 @@ void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpace |
111 | 183 | } |
112 | 184 | } |
113 | 185 |
|
114 | | -}//NKikimr |
| 186 | +void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const TCommonHandleClass& handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) { |
| 187 | + if (!monGroup) { |
| 188 | + return; |
| 189 | + } |
| 190 | + |
| 191 | + if (handleClass.PutHandleClass) { |
| 192 | + monGroup->GetCounter(status, handleClass.PutHandleClass).Inc(); |
| 193 | + } else if (handleClass.GetHandleClass) { |
| 194 | + monGroup->GetCounter(status, handleClass.GetHandleClass).Inc(); |
| 195 | + } else { |
| 196 | + monGroup->GetCounter(status).Inc(); |
| 197 | + } |
| 198 | +} |
| 199 | + |
| 200 | +} //NKikimr |
0 commit comments