aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkruall <kruall@ydb.tech>2023-04-05 14:57:16 +0300
committerkruall <kruall@ydb.tech>2023-04-05 14:57:16 +0300
commitbc30b652ffaa9eb08f5a2df8d4ff5cceada994d2 (patch)
tree26a8c13f65c2a06199b71b929083e6410de14f12
parentdcaefa0e49c162ddc69f7898b5f068900992c870 (diff)
downloadydb-bc30b652ffaa9eb08f5a2df8d4ff5cceada994d2.tar.gz
Fix histograms when VPatch is enable,
-rw-r--r--ydb/core/blobstorage/vdisk/common/vdisk_events.h14
-rw-r--r--ydb/core/blobstorage/vdisk/common/vdisk_response.cpp11
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeleton.cpp33
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonerr.h17
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp34
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.h5
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor_ut.cpp2
-rw-r--r--ydb/core/protos/blobstorage.proto6
8 files changed, 91 insertions, 31 deletions
diff --git a/ydb/core/blobstorage/vdisk/common/vdisk_events.h b/ydb/core/blobstorage/vdisk/common/vdisk_events.h
index ddd932d94d4..8c0560464fb 100644
--- a/ydb/core/blobstorage/vdisk/common/vdisk_events.h
+++ b/ydb/core/blobstorage/vdisk/common/vdisk_events.h
@@ -467,15 +467,19 @@ namespace NKikimr {
TEvVResultBaseWithQoSPB() = default;
template<typename TQueryRecord>
- static inline TInstant GetReceivedTimestamp(const TQueryRecord *queryRecord) {
- return TInstant::MicroSeconds(queryRecord->GetMsgQoS().GetExecTimeStats().GetReceivedTimestamp());
+ static inline TInstant GetReceivedTimestamp(const TQueryRecord *queryRecord, TInstant now) {
+
+ if (queryRecord && queryRecord->HasMsgQoS() && queryRecord->GetMsgQoS().HasExecTimeStats()) {
+ return TInstant::MicroSeconds(queryRecord->GetMsgQoS().GetExecTimeStats().GetReceivedTimestamp());
+ }
+ return now;
}
template<typename TQueryRecord>
TEvVResultBaseWithQoSPB(TInstant now, const ::NMonitoring::TDynamicCounters::TCounterPtr &counterPtr,
const NVDiskMon::TLtcHistoPtr &histoPtr, ui32 channel,
ui32 recByteSize, TQueryRecord *queryRecord, const TActorIDPtr &skeletonFrontIDPtr)
- : TBase(queryRecord ? GetReceivedTimestamp(queryRecord) : now, counterPtr, histoPtr, channel)
+ : TBase(GetReceivedTimestamp(queryRecord, now), counterPtr, histoPtr, channel)
, MsgCtx(queryRecord ? TVMsgContext(recByteSize, queryRecord->GetMsgQoS()) : TVMsgContext())
, SkeletonFrontIDPtr(skeletonFrontIDPtr)
{
@@ -552,6 +556,8 @@ namespace NKikimr {
// set to true in writes generated by defrag/scrub actor
bool RewriteBlob = false;
+ bool IsInternal = false;
+
TEvVPut()
{}
@@ -1077,6 +1083,8 @@ namespace NKikimr {
: TEventPB<TEvBlobStorage::TEvVGet, NKikimrBlobStorage::TEvVGet, TEvBlobStorage::EvVGet>
, TEventWithRelevanceTracker
{
+ bool IsInternal = false;
+
TEvVGet() = default;
enum class EFlags : ui32 {
diff --git a/ydb/core/blobstorage/vdisk/common/vdisk_response.cpp b/ydb/core/blobstorage/vdisk/common/vdisk_response.cpp
index df61982aa02..0f9a663938d 100644
--- a/ydb/core/blobstorage/vdisk/common/vdisk_response.cpp
+++ b/ydb/core/blobstorage/vdisk/common/vdisk_response.cpp
@@ -15,7 +15,7 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEventBase *ev, ui64 cookie, ui32 channel) {
switch (const ui32 type = ev->Type()) {
-#define HANDLE_EVENT(T, EV) \
+#define HANDLE_EVENT(T) \
case TEvBlobStorage::T::EventType: { \
TEvBlobStorage::T *event = static_cast<TEvBlobStorage::T *>(ev); \
const double usPerCycle = 1000000.0 / NHPTimer::GetCyclesPerSecond(); \
@@ -23,9 +23,12 @@ void SendVDiskResponse(const TActorContext &ctx, const TActorId &recipient, IEve
break; \
}
- HANDLE_EVENT(TEvVPutResult, EvVPutResultSent)
- HANDLE_EVENT(TEvVMultiPutResult, EvVMultiPutResultSent)
- HANDLE_EVENT(TEvVGetResult, EvVGetResultSent)
+ HANDLE_EVENT(TEvVPutResult)
+ HANDLE_EVENT(TEvVMultiPutResult)
+ HANDLE_EVENT(TEvVGetResult)
+ HANDLE_EVENT(TEvVPatchFoundParts)
+ HANDLE_EVENT(TEvVPatchXorDiffResult)
+ HANDLE_EVENT(TEvVPatchResult)
#undef HANDLE_EVENT
diff --git a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeleton.cpp b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeleton.cpp
index c9ef0602402..0044df9c53d 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeleton.cpp
+++ b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeleton.cpp
@@ -255,8 +255,9 @@ namespace NKikimr {
IFaceMonGroup->PatchStartMsgs()++;
UpdateVPatchCtx();
std::unique_ptr<IActor> actor{CreateSkeletonVPatchActor(SelfId(), GInfo->Type, ev, now, SkeletonFrontIDPtr,
- IFaceMonGroup->PatchFoundPartsMsgsPtr(), IFaceMonGroup->PatchResMsgsPtr(), VPatchCtx,
- VCtx->VDiskLogPrefix, Db->GetVDiskIncarnationGuid())};
+ IFaceMonGroup->PatchFoundPartsMsgsPtr(), IFaceMonGroup->PatchResMsgsPtr(),
+ VCtx->Histograms.GetHistogram(NKikimrBlobStorage::FastRead), VCtx->Histograms.GetHistogram(NKikimrBlobStorage::AsyncBlob),
+ VPatchCtx, VCtx->VDiskLogPrefix, Db->GetVDiskIncarnationGuid())};
TActorId vPatchActor = Register(actor.release());
VPatchActors.emplace(patchedBlobId, vPatchActor);
}
@@ -738,8 +739,14 @@ namespace NKikimr {
}
// no more errors (at least for for log writes)
- std::unique_ptr<TEvBlobStorage::TEvVPutResult> result = CreateResult(VCtx, NKikimrProto::OK, TString(), ev, now,
- SkeletonFrontIDPtr, SelfVDiskId, Db->GetVDiskIncarnationGuid());
+ std::unique_ptr<TEvBlobStorage::TEvVPutResult> result;
+ if (ev->Get()->IsInternal) {
+ result = CreateInternalResult(VCtx, NKikimrProto::OK, TString(), ev, now,
+ SelfVDiskId, Db->GetVDiskIncarnationGuid());
+ } else {
+ result = CreateResult(VCtx, NKikimrProto::OK, TString(), ev, now,
+ SkeletonFrontIDPtr, SelfVDiskId, Db->GetVDiskIncarnationGuid());
+ }
if (info.WrittenBeyondBarrier) {
result->Record.SetWrittenBeyondBarrier(true);
}
@@ -940,10 +947,19 @@ namespace NKikimr {
if (record.HasCookie())
cookie = record.GetCookie();
auto handleClass = ev->Get()->Record.GetHandleClass();
- auto result = std::make_unique<TEvBlobStorage::TEvVGetResult>(NKikimrProto::OK, SelfVDiskId, now,
- ev->Get()->GetCachedByteSize(), &record, ev->Get()->GetIsLocalMon() ? nullptr : SkeletonFrontIDPtr,
- IFaceMonGroup->GetResMsgsPtr(), VCtx->Histograms.GetHistogram(handleClass), cookie, ev->GetChannel(),
- Db->GetVDiskIncarnationGuid());
+
+ std::unique_ptr<TEvBlobStorage::TEvVGetResult> result;
+ if (ev->Get()->IsInternal) {
+ result.reset(new TEvBlobStorage::TEvVGetResult(NKikimrProto::OK, SelfVDiskId, now,
+ ev->Get()->GetCachedByteSize(), &record, nullptr, nullptr, nullptr, cookie, ev->GetChannel(),
+ Db->GetVDiskIncarnationGuid()));
+ } else {
+ result.reset(new TEvBlobStorage::TEvVGetResult(NKikimrProto::OK, SelfVDiskId, now,
+ ev->Get()->GetCachedByteSize(), &record, ev->Get()->GetIsLocalMon() ? nullptr : SkeletonFrontIDPtr,
+ IFaceMonGroup->GetResMsgsPtr(), VCtx->Histograms.GetHistogram(handleClass), cookie, ev->GetChannel(),
+ Db->GetVDiskIncarnationGuid()));
+ }
+
if (record.GetAcquireBlockedGeneration()) {
ui64 tabletId = record.GetTabletId();
if (tabletId) {
@@ -960,6 +976,7 @@ namespace NKikimr {
// create a query actor and pass read-only snapshot to it
IActor *actor = CreateLevelIndexQueryActor(QueryCtx, std::move(keepChecker), ctx,
std::move(*fullSnap), ctx.SelfID, ev, std::move(result), Db->ReplID);
+
if (actor) {
auto aid = ctx.Register(actor);
ActiveActors.Insert(aid);
diff --git a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonerr.h b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonerr.h
index 35925edc577..70638ce4bef 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonerr.h
+++ b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonerr.h
@@ -183,6 +183,23 @@ namespace NKikimr {
bufferSizeBytes, vdiskIncarnationGuid, errorReason);
}
+ static inline std::unique_ptr<TEvBlobStorage::TEvVPutResult>
+ CreateInternalResult(const TVDiskContextPtr &vctx, const NKikimrProto::EReplyStatus status, const TString& errorReason,
+ TEvBlobStorage::TEvVPut::TPtr &ev, const TInstant &now,
+ const TVDiskID &vdiskID, ui64 vdiskIncarnationGuid) {
+
+ NKikimrBlobStorage::TEvVPut &record = ev->Get()->Record;
+ const TLogoBlobID id = LogoBlobIDFromLogoBlobID(record.GetBlobID());
+ const ui64 bufferSizeBytes = ev->Get()->GetBufferBytes();
+ const ui64 vcookie = record.GetCookie();
+ const ui64 *cookie = record.HasCookie() ? &vcookie : nullptr;
+ const auto oosStatus = vctx->GetOutOfSpaceState().GetGlobalStatusFlags();
+
+ return std::make_unique<TEvBlobStorage::TEvVPutResult>(status, id, vdiskID, cookie, oosStatus, now,
+ ev->Get()->GetCachedByteSize(), &ev->Get()->Record, nullptr, nullptr, nullptr,
+ bufferSizeBytes, vdiskIncarnationGuid, errorReason);
+ }
+
static inline std::unique_ptr<TEvBlobStorage::TEvVBlockResult>
CreateResult(const TVDiskContextPtr &vctx, const NKikimrProto::EReplyStatus status, const TString& /*errorReason*/,
const TEvBlobStorage::TEvVBlockResult::TTabletActGen *actual,
diff --git a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
index 2c2e9aa803a..baffc82a010 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
+++ b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
@@ -89,6 +89,8 @@ namespace NKikimr::NPrivate {
TActorIDPtr SkeletonFrontIDPtr;
::NMonitoring::TDynamicCounters::TCounterPtr VPatchFoundPartsMsgsPtr;
::NMonitoring::TDynamicCounters::TCounterPtr VPatchResMsgsPtr;
+ const NVDiskMon::TLtcHistoPtr GetHistogram;
+ const NVDiskMon::TLtcHistoPtr PutHistogram;
const TIntrusivePtr<TVPatchCtx> VPatchCtx;
TString VDiskLogPrefix;
@@ -129,6 +131,7 @@ namespace NKikimr::NPrivate {
TEvBlobStorage::TEvVPatchStart::TPtr &ev, TInstant now, TActorIDPtr skeletonFrontIDPtr,
const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchFoundPartsMsgsPtr,
const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchResMsgsPtr,
+ const NVDiskMon::TLtcHistoPtr &getHistogram, const NVDiskMon::TLtcHistoPtr &putHistogram,
const TIntrusivePtr<TVPatchCtx> &vPatchCtx, const TString &vDiskLogPrefix, ui64 incarnationGuid)
: TActorBootstrapped()
, Sender(ev->Sender)
@@ -136,6 +139,8 @@ namespace NKikimr::NPrivate {
, SkeletonFrontIDPtr(skeletonFrontIDPtr)
, VPatchFoundPartsMsgsPtr(vPatchFoundPartsMsgsPtr)
, VPatchResMsgsPtr(vPatchResMsgsPtr)
+ , GetHistogram(getHistogram)
+ , PutHistogram(putHistogram)
, VPatchCtx(vPatchCtx)
, VDiskLogPrefix(vDiskLogPrefix)
, LeaderId(leaderId)
@@ -161,7 +166,7 @@ namespace NKikimr::NPrivate {
Y_VERIFY(record.HasCookie());
FoundPartsEvent = std::make_unique<TEvBlobStorage::TEvVPatchFoundParts>(
NKikimrProto::OK, OriginalBlobId, PatchedBlobId, VDiskId, record.GetCookie(), now, ErrorReason, &record,
- SkeletonFrontIDPtr, VPatchFoundPartsMsgsPtr, nullptr, IncarnationGuid);
+ SkeletonFrontIDPtr, VPatchFoundPartsMsgsPtr, getHistogram, IncarnationGuid);
if (CurrentEventTrace) {
CurrentEventTrace->AdditionalTrace = PatchActorTrace;
}
@@ -174,13 +179,6 @@ namespace NKikimr::NPrivate {
(OriginalBlobId, OriginalBlobId),
(Deadline, Deadline));
AddMark("TSkeletonVPatchActor bootstrapped");
- ui32 cookie = 0;
- std::unique_ptr<TEvBlobStorage::TEvVGet> msg = TEvBlobStorage::TEvVGet::CreateRangeIndexQuery(VDiskId, Deadline,
- NKikimrBlobStorage::EGetHandleClass::FastRead, TEvBlobStorage::TEvVGet::EFlags::None, cookie,
- TLogoBlobID(OriginalBlobId, 0), TLogoBlobID(OriginalBlobId, TLogoBlobID::MaxPartId),
- TLogoBlobID::MaxPartId, nullptr);
- Send(LeaderId, msg.release());
- AddMark("Send RangeIndexQuery");
TInstant now = TActivationContext::Now();
if (Deadline != TInstant::Zero() && Deadline < now) {
@@ -199,6 +197,14 @@ namespace NKikimr::NPrivate {
liveDuration = CommonLiveTime;
}
Schedule(liveDuration, new TKikimrEvents::TEvWakeup);
+
+ ui32 cookie = 0;
+ std::unique_ptr<TEvBlobStorage::TEvVGet> msg = TEvBlobStorage::TEvVGet::CreateRangeIndexQuery(VDiskId, Deadline,
+ NKikimrBlobStorage::EGetHandleClass::FastRead, TEvBlobStorage::TEvVGet::EFlags::None, cookie,
+ TLogoBlobID(OriginalBlobId, 0), TLogoBlobID(OriginalBlobId, TLogoBlobID::MaxPartId),
+ TLogoBlobID::MaxPartId);
+ Send(LeaderId, msg.release());
+ AddMark("Sent RangeIndexQuery");
}
void SendVPatchFoundParts(NKikimrProto::EReplyStatus status)
@@ -490,7 +496,7 @@ namespace NKikimr::NPrivate {
ResultEvent = std::make_unique<TEvBlobStorage::TEvVPatchResult>(
NKikimrProto::OK, TLogoBlobID(OriginalBlobId, OriginalPartId),
TLogoBlobID(PatchedBlobId, PatchedPartId), VDiskId, record.GetCookie(), now,
- &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, nullptr, IncarnationGuid);
+ &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, PutHistogram, IncarnationGuid);
Sender = ev->Sender;
Cookie = ev->Cookie;
CurrentEventTrace = ev->Get()->VDiskSkeletonTrace;
@@ -554,7 +560,7 @@ namespace NKikimr::NPrivate {
ResultEvent = std::make_unique<TEvBlobStorage::TEvVPatchResult>(
NKikimrProto::OK, originalPartBlobId, patchedPartBlobId, VDiskId, record.GetCookie(), now,
- &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, nullptr, IncarnationGuid);
+ &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, PutHistogram, IncarnationGuid);
Sender = ev->Sender;
Cookie = ev->Cookie;
@@ -619,7 +625,7 @@ namespace NKikimr::NPrivate {
NKikimrBlobStorage::TEvVPatchXorDiff &record = ev->Get()->Record;
TInstant now = TActivationContext::Now();
auto resultEvent = std::make_unique<TEvBlobStorage::TEvVPatchXorDiffResult>(
- NKikimrProto::ERROR, now, &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, nullptr);
+ NKikimrProto::ERROR, now, &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, PutHistogram);
AddMark("Error: HandleError TEvVPatchXorDiff");
if (ev->Get()->VDiskSkeletonTrace) {
ev->Get()->VDiskSkeletonTrace->AddMark("Error: HandleError TEvVPatchXorDiff");
@@ -650,7 +656,7 @@ namespace NKikimr::NPrivate {
TInstant now = TActivationContext::Now();
std::unique_ptr<TEvBlobStorage::TEvVPatchXorDiffResult> resultEvent = std::make_unique<TEvBlobStorage::TEvVPatchXorDiffResult>(
- NKikimrProto::OK, now, &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, nullptr);
+ NKikimrProto::OK, now, &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, PutHistogram);
AddMark("Send xor diff result");
if (ev->Get()->VDiskSkeletonTrace) {
ev->Get()->VDiskSkeletonTrace->AddMark("Send xor diff result");
@@ -786,10 +792,12 @@ namespace NKikimr {
TEvBlobStorage::TEvVPatchStart::TPtr &ev, TInstant now, TActorIDPtr skeletonFrontIDPtr,
const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchFoundPartsMsgsPtr,
const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchResMsgsPtr,
+ const NVDiskMon::TLtcHistoPtr &getHistogram, const NVDiskMon::TLtcHistoPtr &putHistogram,
const TIntrusivePtr<TVPatchCtx> &vPatchCtx, const TString &vDiskLogPrefix, ui64 incarnationGuid)
{
return new NPrivate::TSkeletonVPatchActor(leaderId, gType, ev, now, skeletonFrontIDPtr,
- vPatchFoundPartsMsgsPtr, vPatchResMsgsPtr, vPatchCtx, vDiskLogPrefix, incarnationGuid);
+ vPatchFoundPartsMsgsPtr, vPatchResMsgsPtr, getHistogram, putHistogram,
+ vPatchCtx, vDiskLogPrefix, incarnationGuid);
}
} // NKikimr
diff --git a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.h b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.h
index c56e846a47e..df561accb74 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.h
+++ b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.h
@@ -33,7 +33,8 @@ struct TVPatchCtx : public TThrRefBase, TNonCopyable {
IActor* CreateSkeletonVPatchActor(TActorId leaderId, const TBlobStorageGroupType &gType, TEvBlobStorage::TEvVPatchStart::TPtr &ev,
TInstant now, TActorIDPtr skeletonFrontIDPtr, const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchFoundPartsMsgsPtr,
- const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchResMsgsPtr, const TIntrusivePtr<TVPatchCtx> &vPatchCtx,
- const TString &vDiskLogPrefix, ui64 incarnationGuid);
+ const ::NMonitoring::TDynamicCounters::TCounterPtr &vPatchResMsgsPtr,
+ const NVDiskMon::TLtcHistoPtr &getHistogram, const NVDiskMon::TLtcHistoPtr &putHistogram,
+ const TIntrusivePtr<TVPatchCtx> &vPatchCtx, const TString &vDiskLogPrefix, ui64 incarnationGuid);
} // NKikimr
diff --git a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor_ut.cpp b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor_ut.cpp
index 6b7b2ea6e63..83cc3dbdb25 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor_ut.cpp
+++ b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor_ut.cpp
@@ -188,7 +188,7 @@ namespace NKikimr {
}
THolder<IActor> actor{CreateSkeletonVPatchActor(EdgeActors[nodeId], GType,
- ev, TInstant(), nullptr, nullptr, nullptr, patchCtx, VDiskIds[nodeId].ToString(), 0)};
+ ev, TInstant(), nullptr, nullptr, nullptr, nullptr, nullptr, patchCtx, VDiskIds[nodeId].ToString(), 0)};
if constexpr (!std::is_void_v<DecoratorType>) {
TVPatchDecoratorArgs args{EdgeActors[nodeId], IsCheckingEventsByDecorator,
diff --git a/ydb/core/protos/blobstorage.proto b/ydb/core/protos/blobstorage.proto
index 78927019eb8..a2943ca9869 100644
--- a/ydb/core/protos/blobstorage.proto
+++ b/ydb/core/protos/blobstorage.proto
@@ -199,6 +199,8 @@ message TEvVPatchStart {
optional bool NotifyIfNotReady = 4;
optional uint64 Cookie = 5;
+ optional EGetHandleClass HandleClass = 6;
+
optional TMsgQoS MsgQoS = 10;
optional TTimestamps Timestamps = 23;
}
@@ -242,6 +244,8 @@ message TEvVPatchDiff {
optional uint32 ExpectedXorDiffs = 7;
optional bool ForceEnd = 8;
optional bool NotifyIfNotReady = 9;
+
+ optional EPutHandleClass HandleClass = 11;
optional TMsgQoS MsgQoS = 10;
optional TTimestamps Timestamps = 23;
@@ -256,6 +260,8 @@ message TEvVPatchXorDiff {
optional uint32 FromPartId = 6;
optional bool NotifyIfNotReady = 7;
+ optional EPutHandleClass HandleClass = 8;
+
optional TMsgQoS MsgQoS = 10;
optional TTimestamps Timestamps = 23;
}