Skip to content

Commit 25d4a1e

Browse files
committed
add handle class
1 parent 9b834dc commit 25d4a1e

27 files changed

+182
-120
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace NKikimr {
3737
SetRacingGroupInfo(record, Result->Record, GroupInfo);
3838
LOG_DEBUG(ctx, BS_VDISK_OTHER, VDISKP(VCtx->VDiskLogPrefix, "TEvVStatusResult Request# {%s} Response# {%s}",
3939
SingleLineProto(record).data(), SingleLineProto(Result->Record).data()));
40-
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, Ev->GetChannel(), VCtx);
40+
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, Ev->GetChannel(), VCtx, {});
4141
Die(ctx);
4242
return;
4343
}
@@ -73,7 +73,7 @@ namespace NKikimr {
7373
ctx.Send(NotifyId, new TEvents::TEvActorDied());
7474
LOG_DEBUG(ctx, BS_VDISK_GET,
7575
VDISKP(VCtx->VDiskLogPrefix, "TEvVStatusResult"));
76-
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, Ev->GetChannel(), VCtx);
76+
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, Ev->GetChannel(), VCtx, {});
7777
Die(ctx);
7878
}
7979
}

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

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -672,43 +672,51 @@ public:
672672
public:
673673
GROUP_CONSTRUCTOR(THandleClassGroup)
674674
{
675-
COUNTER_INIT(VGetDiscover, true);
676-
COUNTER_INIT(VGetFast, true);
677-
COUNTER_INIT(VGetAsync, true);
678-
COUNTER_INIT(VGetLow, true);
679-
COUNTER_INIT(VPutTabletLog, true);
680-
COUNTER_INIT(VPutUserData, true);
681-
COUNTER_INIT(VPutAsyncBlob, true);
675+
COUNTER_INIT(Undefined, true);
676+
COUNTER_INIT(GetDiscover, true);
677+
COUNTER_INIT(GetFast, true);
678+
COUNTER_INIT(GetAsync, true);
679+
COUNTER_INIT(GetLow, true);
680+
COUNTER_INIT(PutTabletLog, true);
681+
COUNTER_INIT(PutUserData, true);
682+
COUNTER_INIT(PutAsyncBlob, true);
682683
}
683684

684-
COUNTER_DEF(VGetDiscover);
685-
COUNTER_DEF(VGetFast);
686-
COUNTER_DEF(VGetAsync);
687-
COUNTER_DEF(VGetLow);
688-
COUNTER_DEF(VPutTabletLog);
689-
COUNTER_DEF(VPutUserData);
690-
COUNTER_DEF(VPutAsyncBlob);
685+
COUNTER_DEF(Undefined);
686+
COUNTER_DEF(GetDiscover);
687+
COUNTER_DEF(GetFast);
688+
COUNTER_DEF(GetAsync);
689+
COUNTER_DEF(GetLow);
690+
COUNTER_DEF(PutTabletLog);
691+
COUNTER_DEF(PutUserData);
692+
COUNTER_DEF(PutAsyncBlob);
691693

692-
const ::NMonitoring::TDeprecatedCounter &GetCounter(NKikimrBlobStorage::EGetHandleClass handleClass) const {
693-
switch (handleClass) {
694+
::NMonitoring::TDeprecatedCounter &GetCounter(const std::optional<NKikimrBlobStorage::EGetHandleClass>& handleClass = std::nullopt) {
695+
if (!handleClass) {
696+
return Undefined();
697+
}
698+
switch (*handleClass) {
694699
case NKikimrBlobStorage::AsyncRead:
695-
return VGetAsync();
700+
return GetAsync();
696701
case NKikimrBlobStorage::FastRead:
697-
return VGetFast();
702+
return GetFast();
698703
case NKikimrBlobStorage::Discover:
699-
return VGetDiscover();
704+
return GetDiscover();
700705
case NKikimrBlobStorage::LowRead:
701-
return VGetLow();
706+
return GetLow();
702707
}
703708
}
704-
const ::NMonitoring::TDeprecatedCounter &GetCounter(NKikimrBlobStorage::EPutHandleClass handleClass) const {
705-
switch (handleClass) {
709+
::NMonitoring::TDeprecatedCounter &GetCounter(const std::optional<NKikimrBlobStorage::EPutHandleClass>& handleClass = std::nullopt) {
710+
if (!handleClass) {
711+
return Undefined();
712+
}
713+
switch (*handleClass) {
706714
case NKikimrBlobStorage::TabletLog:
707-
return VPutTabletLog();
715+
return PutTabletLog();
708716
case NKikimrBlobStorage::AsyncBlob:
709-
return VPutAsyncBlob();
717+
return PutAsyncBlob();
710718
case NKikimrBlobStorage::UserData:
711-
return VPutUserData();
719+
return PutUserData();
712720
}
713721
}
714722
};
@@ -720,6 +728,7 @@ public:
720728
public:
721729
TIntrusivePtr<::NMonitoring::TDynamicCounters> Group;
722730

731+
THandleClassGroup Undefined;
723732
THandleClassGroup ResponsesWithStatusError;
724733
THandleClassGroup ResponsesWithStatusRace;
725734
THandleClassGroup ResponsesWithStatusBlocked;
@@ -730,6 +739,7 @@ public:
730739

731740
TResponseStatusGroup(const TIntrusivePtr<::NMonitoring::TDynamicCounters>& counters)
732741
: Group(counters->GetSubgroup("subsystem", "statuses"))
742+
, Undefined(Group, "status", "UNDEFINED")
733743
, ResponsesWithStatusError(Group, "status", "ERROR")
734744
, ResponsesWithStatusRace(Group, "status", "RACE")
735745
, ResponsesWithStatusBlocked(Group, "status", "BLOCKED")
@@ -740,7 +750,7 @@ public:
740750
{}
741751

742752
template <typename THandleClassType>
743-
const ::NMonitoring::TDeprecatedCounter &GetCounter(NKikimrProto::EReplyStatus status, THandleClassType handleClass) const {
753+
::NMonitoring::TDeprecatedCounter &GetCounter(NKikimrProto::EReplyStatus status, const std::optional<THandleClassType>& handleClass = std::nullopt) {
744754
switch (status) {
745755
case NKikimrProto::ERROR:
746756
return ResponsesWithStatusError.GetCounter(handleClass);
@@ -756,9 +766,13 @@ public:
756766
return ResponsesWithStatusNotReady.GetCounter(handleClass);
757767
case NKikimrProto::VDISK_ERROR_STATE:
758768
return ResponsesWithStatusVdiskErrorState.GetCounter(handleClass);
759-
default: break;
769+
default: return Undefined.GetCounter(handleClass);
760770
}
761771
}
772+
773+
::NMonitoring::TDeprecatedCounter &GetCounter(NKikimrProto::EReplyStatus status) {
774+
return GetCounter(status, std::optional<NKikimrBlobStorage::EPutHandleClass>{});
775+
}
762776
};
763777

764778
///////////////////////////////////////////////////////////////////////////////////

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

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,27 @@
77
namespace NKikimr {
88

99
template <class TRecord>
10-
void ReportResponse(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx);
10+
void ReportResponse(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx);
1111
void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags);
1212
void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpaceGroup>& monGroup);
13-
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, HandleClassType handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
13+
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const TCommonHandleClass& handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup);
1414

15-
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) {
1616
ui32 channel = TInterconnectChannels::IC_BLOBSTORAGE;
1717
if (TEvVResultBase *base = dynamic_cast<TEvVResultBase *>(ev)) {
1818
channel = base->GetChannelToSend();
1919
}
20-
SendVDiskResponse(ctx, recipient, ev, cookie, channel, vCtx);
20+
SendVDiskResponse(ctx, recipient, ev, cookie, channel, vCtx, handleClass);
2121
}
2222

23-
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) {
2424
if (vCtx) {
2525
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; \
26+
#define HANDLE_EVENT(T) \
27+
case T::EventType: { \
28+
T *event = static_cast<T *>(ev); \
29+
ReportResponse(event->Record, handleClass, vCtx); \
30+
break; \
3131
}
3232

3333
HANDLE_EVENT(TEvBlobStorage::TEvVPutResult)
@@ -84,13 +84,13 @@ struct TReportingOSStatus {
8484
NKikimrBlobStorage::TEvVMultiPutResult>;
8585

8686
template <typename TRecord>
87-
static void Report(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
87+
static void Report(const TRecord& record, const TCommonHandleClass&, const TIntrusivePtr<TVDiskContext>& vCtx) {
8888
LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(record.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
8989
UpdateMonOOSStatus(record.GetStatusFlags(), vCtx->OOSMonGroup);
9090
}
9191

9292
template<>
93-
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
93+
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TCommonHandleClass&, const TIntrusivePtr<TVDiskContext>& vCtx) {
9494
if (record.ItemsSize() > 0) {
9595
const auto& item = record.GetItems(0);
9696
LogOOSStatus(record.GetStatusFlags(), LogoBlobIDFromLogoBlobID(item.GetBlobID()), vCtx->VDiskLogPrefix, vCtx->CurrentOOSStatusFlag);
@@ -108,37 +108,37 @@ struct TReportingResponseStatus {
108108
NKikimrBlobStorage::TEvVCollectGarbageResult>;
109109

110110
template <typename TRecord>
111-
static void Report(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
112-
UpdateMonResponseStatus(record.GetStatus(), record.GetHandleClass(), vCtx->ResponseStatusMonGroup);
111+
static void Report(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) {
112+
UpdateMonResponseStatus(record.GetStatus(), handleClass, vCtx->ResponseStatusMonGroup);
113113
}
114114

115115
template<>
116-
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
116+
void Report(const NKikimrBlobStorage::TEvVMultiPutResult& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) {
117117
for (const auto& item : record.GetItems()) {
118-
UpdateMonResponseStatus(item.GetStatus(), record.GetHandleClass(), vCtx->ResponseStatusMonGroup);
118+
UpdateMonResponseStatus(item.GetStatus(), handleClass, vCtx->ResponseStatusMonGroup);
119119
}
120120
}
121121
};
122122

123123
#define DEFUNE_REPORT(NAME) \
124124
template <typename TRecord> \
125125
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); \
126+
const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) { \
127+
TReporting##NAME::Report(record, handleClass, vCtx); \
128128
} \
129129
\
130130
template <typename TRecord> \
131131
typename std::enable_if<!IsInTypes<TRecord, TReporting##NAME::EnableFor>::value>::type Report##NAME( \
132-
const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {}
132+
const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) {}
133133

134134
DEFUNE_REPORT(OSStatus)
135135
DEFUNE_REPORT(ResponseStatus)
136136
#undef DEFUNE_REPORT
137137

138138
template <class TRecord>
139-
void ReportResponse(const TRecord& record, const TIntrusivePtr<TVDiskContext>& vCtx) {
140-
ReportOSStatus(record, vCtx);
141-
ReportResponseStatus(record, vCtx);
139+
void ReportResponse(const TRecord& record, const TCommonHandleClass& handleClass, const TIntrusivePtr<TVDiskContext>& vCtx) {
140+
ReportOSStatus(record, handleClass, vCtx);
141+
ReportResponseStatus(record, handleClass, vCtx);
142142
}
143143

144144
void LogOOSStatus(ui32 flags, const TLogoBlobID& blobId, const TString& vDiskLogPrefix, std::atomic<ui32>& curFlags) {
@@ -183,13 +183,18 @@ void UpdateMonOOSStatus(ui32 flags, const std::shared_ptr<NMonGroup::TOutOfSpace
183183
}
184184
}
185185

186-
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, HandleClassType handleClass,
187-
const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) {
186+
void UpdateMonResponseStatus(NKikimrProto::EReplyStatus status, const TCommonHandleClass& handleClass, const std::shared_ptr<NMonGroup::TResponseStatusGroup>& monGroup) {
188187
if (!monGroup) {
189188
return;
190189
}
191190

192-
monGroup->GetCounter(status, handleClass).Inc();
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+
}
193198
}
194199

195200
} //NKikimr

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,43 @@
55

66
namespace NKikimr {
77

8-
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx);
8+
template <typename TEv, typename = void>
9+
struct THasGetHandleClass : std::false_type {};
10+
template <typename TEv>
11+
struct THasGetHandleClass<TEv, std::void_t<decltype(std::declval<TEv>().GetHandleClass())>> : std::true_type {};
912

10-
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx);
13+
template <typename TEv, typename = void>
14+
struct THasRecordWithGetHandleClass : std::false_type {};
15+
template <typename TEv>
16+
struct THasRecordWithGetHandleClass<TEv, std::void_t<decltype(std::declval<TEv>().Record.GetHandleClass())>> : std::true_type {};
17+
18+
struct TCommonHandleClass {
19+
TCommonHandleClass() = default;
20+
21+
template <typename TEv>
22+
TCommonHandleClass(const TEv& ev) {
23+
if constexpr (THasRecordWithGetHandleClass<TEv>::value) {
24+
TCommonHandleClass(ev.Record.GetHandleClass());
25+
} else if constexpr (THasGetHandleClass<TEv>::value) {
26+
TCommonHandleClass(ev.GetHandleClass());
27+
}
28+
}
29+
template <>
30+
TCommonHandleClass(NKikimrBlobStorage::EPutHandleClass putHandleClass) {
31+
PutHandleClass = putHandleClass;
32+
}
33+
template <>
34+
TCommonHandleClass(NKikimrBlobStorage::EGetHandleClass getHandleClass) {
35+
GetHandleClass = getHandleClass;
36+
}
37+
38+
39+
std::optional<NKikimrBlobStorage::EPutHandleClass> PutHandleClass;
40+
std::optional<NKikimrBlobStorage::EGetHandleClass> GetHandleClass;
41+
};
42+
43+
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, const TIntrusivePtr<TVDiskContext>& vCtx, const TCommonHandleClass& handleClass);
44+
45+
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel, const TIntrusivePtr<TVDiskContext>& vCtx, const TCommonHandleClass& handleClass);
1146

1247
}//NKikimr

ydb/core/blobstorage/vdisk/huge/blobstorage_hullhuge.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ LWTRACE_USING(BLOBSTORAGE_PROVIDER);
231231
CHECK_PDISK_RESPONSE(HugeKeeperCtx->VCtx, ev, ctx);
232232
ctx.Send(NotifyID, new TEvHullHugeWritten(HugeSlot));
233233
ctx.Send(HugeKeeperCtx->SkeletonId, new TEvHullLogHugeBlob(WriteId, Item->LogoBlobId, Item->Ingress, DiskAddr,
234-
Item->IgnoreBlock, Item->SenderId, Item->Cookie, std::move(Item->Result), &Item->ExtraBlockChecks), 0, 0,
234+
Item->IgnoreBlock, Item->SenderId, Item->Cookie, Item->HandleClass, std::move(Item->Result), &Item->ExtraBlockChecks), 0, 0,
235235
Span.GetTraceId());
236236
LOG_DEBUG(ctx, BS_HULLHUGE,
237237
VDISKP(HugeKeeperCtx->VCtx->VDiskLogPrefix,

ydb/core/blobstorage/vdisk/huge/blobstorage_hullhuge.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ namespace NKikimr {
7272
const bool IgnoreBlock;
7373
const TActorId OrigClient;
7474
const ui64 OrigCookie;
75+
const NKikimrBlobStorage::EPutHandleClass HandleClass;
7576
std::unique_ptr<TEvBlobStorage::TEvVPutResult> Result;
7677
NProtoBuf::RepeatedPtrField<NKikimrBlobStorage::TEvVPut::TExtraBlockCheck> ExtraBlockChecks;
7778

@@ -82,6 +83,7 @@ namespace NKikimr {
8283
bool ignoreBlock,
8384
const TActorId &origClient,
8485
ui64 origCookie,
86+
NKikimrBlobStorage::EPutHandleClass handleClass,
8587
std::unique_ptr<TEvBlobStorage::TEvVPutResult> result,
8688
NProtoBuf::RepeatedPtrField<NKikimrBlobStorage::TEvVPut::TExtraBlockCheck> *extraBlockChecks)
8789
: WriteId(writeId)
@@ -91,6 +93,7 @@ namespace NKikimr {
9193
, IgnoreBlock(ignoreBlock)
9294
, OrigClient(origClient)
9395
, OrigCookie(origCookie)
96+
, HandleClass(handleClass)
9497
, Result(std::move(result))
9598
{
9699
if (extraBlockChecks) {

ydb/core/blobstorage/vdisk/query/query_barrier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace NKikimr {
3333
LOG_DEBUG(ctx, BS_VDISK_GC,
3434
VDISKP(HullCtx->VCtx->VDiskLogPrefix,
3535
"TEvVGetBarrierResult: %s", Result->ToString().data()));
36-
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, HullCtx->VCtx);
36+
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, HullCtx->VCtx, {});
3737
ctx.Send(ParentId, new TEvents::TEvActorDied);
3838
Die(ctx);
3939
}

ydb/core/blobstorage/vdisk/query/query_base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ namespace NKikimr {
121121
ctx.Send(ReplSchedulerId, new TEvBlobStorage::TEvEnrichNotYet(BatcherCtx->OrigEv, std::move(Result)));
122122
} else {
123123
// send reply event to sender
124-
SendVDiskResponse(ctx, BatcherCtx->OrigEv->Sender, Result.release(), BatcherCtx->OrigEv->Cookie, QueryCtx->HullCtx->VCtx);
124+
SendVDiskResponse(ctx, BatcherCtx->OrigEv->Sender, Result.release(), BatcherCtx->OrigEv->Cookie, QueryCtx->HullCtx->VCtx, Record.GetHandleClass());
125125
}
126126

127127
ctx.Send(ParentId, new TEvents::TEvActorDied);

ydb/core/blobstorage/vdisk/query/query_dumpdb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace NKikimr {
4747

4848
// send result
4949
Result->SetResult(str.Str());
50-
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, HullCtx->VCtx);
50+
SendVDiskResponse(ctx, Ev->Sender, Result.release(), Ev->Cookie, HullCtx->VCtx, {});
5151
TThis::Die(ctx);
5252
}
5353

ydb/core/blobstorage/vdisk/query/query_public.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ namespace NKikimr {
158158
LOG_DEBUG(ctx, NKikimrServices::BS_VDISK_OTHER,
159159
VDISKP(vctx->VDiskLogPrefix,
160160
"TEvVDbStatResult: %s", result->ToString().data()));
161-
SendVDiskResponse(ctx, ev->Sender, result.release(), ev->Cookie, vctx);
161+
SendVDiskResponse(ctx, ev->Sender, result.release(), ev->Cookie, vctx, {});
162162
}
163163

164164
template <class TKey, class TMemRec>

0 commit comments

Comments
 (0)