|
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,82 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
|
69 | 70 | }
|
70 | 71 | }
|
71 | 72 |
|
| 73 | +template <typename... Types> |
| 74 | +struct TypesList {}; |
| 75 | + |
| 76 | +template <typename T, typename TapesList> |
| 77 | +struct IsInTypesList; |
| 78 | + |
| 79 | +template <typename T, typename... Types> |
| 80 | +struct IsInTypesList<T, TypesList<Types...>> { |
| 81 | + static constexpr bool value = (std::is_same_v<T, Types> || ...); |
| 82 | +}; |
| 83 | + |
| 84 | +struct TReportingOSStatus { |
| 85 | + using EnableFor = TypesList< |
| 86 | + NKikimrBlobStorage::TEvVPutResult, |
| 87 | + NKikimrBlobStorage::TEvVMultiPutResult>; |
| 88 | + |
| 89 | + template <typename TRecord> |
| 90 | + static void Report(const TRecord& record, const TCommonHandleClass&, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 91 | + LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(record.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag); |
| 92 | + UpdateMonOOSStatus(record.GetStatusFlags(), vCtx->OOSMonGroup); |
| 93 | + } |
| 94 | + |
| 95 | + template<> |
| 96 | + void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TCommonHandleClass&, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 97 | + if (record.ItemsSize() > 0) { |
| 98 | + const auto& item = record.GetItems(0); |
| 99 | + LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(item.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag); |
| 100 | + UpdateMonOOSStatus(record.GetStatusFlags(), vCtx->OOSMonGroup); |
| 101 | + } |
| 102 | + } |
| 103 | +}; |
| 104 | + |
| 105 | +struct TReportingResponseStatus { |
| 106 | + using EnableFor = TypesList< |
| 107 | + NKikimrBlobStorage::TEvVPutResult, |
| 108 | + NKikimrBlobStorage::TEvVMultiPutResult, |
| 109 | + NKikimrBlobStorage::TEvVGetResult, |
| 110 | + NKikimrBlobStorage::TEvVGetBlockResult, |
| 111 | + NKikimrBlobStorage::TEvVCollectGarbageResult>; |
| 112 | + |
| 113 | + template <typename TRecord> |
| 114 | + static void Report(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 115 | + UpdateMonResponseStatus(record.GetStatus(), handleClass, vCtx->ResponseStatusMonGroup); |
| 116 | + } |
| 117 | + |
| 118 | + template<> |
| 119 | + void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 120 | + for (const auto& item : record.GetItems()) { |
| 121 | + UpdateMonResponseStatus(item.GetStatus(), handleClass, vCtx->ResponseStatusMonGroup); |
| 122 | + } |
| 123 | + } |
| 124 | +}; |
| 125 | + |
| 126 | +#define DEFUNE_REPORT(NAME) \ |
| 127 | + template <typename TRecord> \ |
| 128 | + constexpr bool Is##NAME##Enabled = IsInTypesList<TRecord, TReporting##NAME::EnableFor>::value; \ |
| 129 | + template <typename TRecord> \ |
| 130 | + typename std::enable_if<IsInTypesList<TRecord, TReporting##NAME::EnableFor>::value>::type Report##NAME( \ |
| 131 | + const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { \ |
| 132 | + TReporting##NAME::Report(record, handleClass, vCtx); \ |
| 133 | + } \ |
| 134 | + \ |
| 135 | + template <typename TRecord> \ |
| 136 | + typename std::enable_if<!IsInTypesList<TRecord, TReporting##NAME::EnableFor>::value>::type Report##NAME( \ |
| 137 | + const TRecord&, const TCommonHandleClass&, const TIntrusivePtr<TVDiskContext>&) {} |
| 138 | + |
| 139 | + DEFUNE_REPORT(OSStatus) |
| 140 | + DEFUNE_REPORT(ResponseStatus) |
| 141 | +#undef DEFUNE_REPORT |
| 142 | + |
| 143 | +template <class TRecord> |
| 144 | +void ReportResponse(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { |
| 145 | + ReportOSStatus(record, handleClass, vCtx); |
| 146 | + ReportResponseStatus(record, handleClass, vCtx); |
| 147 | +} |
| 148 | + |
72 | 149 | void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags) {
|
73 | 150 | if (!TlsActivationContext) {
|
74 | 151 | return;
|
@@ -111,4 +188,18 @@ void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpace
|
111 | 188 | }
|
112 | 189 | }
|
113 | 190 |
|
114 |
| -}//NKikimr |
| 191 | +void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const TCommonHandleClass& handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) { |
| 192 | + if (!monGroup) { |
| 193 | + return; |
| 194 | + } |
| 195 | + |
| 196 | + if (std::holds_alternative<NKikimrBlobStorage::EPutHandleClass>(handleClass.HandleClass)) { |
| 197 | + monGroup->GetCounter(status, std::get<NKikimrBlobStorage::EPutHandleClass>(handleClass.HandleClass)).Inc(); |
| 198 | + } else if (std::holds_alternative<NKikimrBlobStorage::EGetHandleClass>(handleClass.HandleClass)) { |
| 199 | + monGroup->GetCounter(status, std::get<NKikimrBlobStorage::EGetHandleClass>(handleClass.HandleClass)).Inc(); |
| 200 | + } else { |
| 201 | + monGroup->GetCounter(status).Inc(); |
| 202 | + } |
| 203 | +} |
| 204 | + |
| 205 | +} //NKikimr |
0 commit comments