diff options
author | kruall <kruall@ydb.tech> | 2023-04-05 14:57:16 +0300 |
---|---|---|
committer | kruall <kruall@ydb.tech> | 2023-04-05 14:57:16 +0300 |
commit | bc30b652ffaa9eb08f5a2df8d4ff5cceada994d2 (patch) | |
tree | 26a8c13f65c2a06199b71b929083e6410de14f12 | |
parent | dcaefa0e49c162ddc69f7898b5f068900992c870 (diff) | |
download | ydb-bc30b652ffaa9eb08f5a2df8d4ff5cceada994d2.tar.gz |
Fix histograms when VPatch is enable,
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; } |