Browse Source

Fix VDisk internal tracing issues related to patching (#1943)

Alexander Rutkovsky 1 year ago
parent
commit
40805170f6

+ 4 - 4
ydb/core/blobstorage/vdisk/common/vdisk_events.h

@@ -1524,7 +1524,7 @@ namespace NKikimr {
         , TEventWithRelevanceTracker
     {
         mutable NLWTrace::TOrbit Orbit;
-        TVDiskSkeletonTrace *VDiskSkeletonTrace = nullptr;
+        std::shared_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
 
         TEvVSpecialPatchBase() = default;
 
@@ -1918,7 +1918,7 @@ namespace NKikimr {
         , TEventWithRelevanceTracker
     {
         mutable NLWTrace::TOrbit Orbit;
-        TVDiskSkeletonTrace *VDiskSkeletonTrace = nullptr;
+        std::shared_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
 
         TEvVPatchStart() = default;
 
@@ -2004,7 +2004,7 @@ namespace NKikimr {
         , TEventWithRelevanceTracker
     {
         mutable NLWTrace::TOrbit Orbit;
-        TVDiskSkeletonTrace *VDiskSkeletonTrace = nullptr;
+        std::shared_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
 
         TEvVPatchDiff() = default;
 
@@ -2079,7 +2079,7 @@ namespace NKikimr {
         , TEventWithRelevanceTracker
     {
         mutable NLWTrace::TOrbit Orbit;
-        TVDiskSkeletonTrace *VDiskSkeletonTrace = nullptr;
+        std::shared_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
 
         TEvVPatchXorDiff() = default;
 

+ 16 - 16
ydb/core/blobstorage/vdisk/skeleton/blobstorage_skeletonfront.cpp

@@ -103,14 +103,14 @@ namespace NKikimr {
             NBackpressure::TQueueClientId ClientId;
             TActorId ActorId;
             NWilson::TSpan Span;
-            std::unique_ptr<TVDiskSkeletonTrace> Trace;
+            std::shared_ptr<TVDiskSkeletonTrace> Trace;
             ui64 Cookie;
 
             TRecord() = default;
 
             TRecord(std::unique_ptr<IEventHandle> ev, TInstant now, ui32 recByteSize, const NBackpressure::TMessageId &msgId,
                     ui64 cost, TInstant deadline, NKikimrBlobStorage::EVDiskQueueId extQueueId,
-                    const NBackpressure::TQueueClientId& clientId, TString name, std::unique_ptr<TVDiskSkeletonTrace> &&trace,
+                    const NBackpressure::TQueueClientId& clientId, TString name, std::shared_ptr<TVDiskSkeletonTrace> &&trace,
                     ui64 cookie)
                 : Ev(std::move(ev))
                 , ReceivedTime(now)
@@ -144,14 +144,14 @@ namespace NKikimr {
         ////////////////////////////////////////////////////////////////////////////
         class TIntQueueClass {
             using TQueueType = TQueueInplace<TRecord, 4096>;
-            using TFreeTraceObjectsQueue = TQueueInplace<std::unique_ptr<TVDiskSkeletonTrace>, 4096>;
+            using TFreeTraceObjectsQueue = TQueueInplace<std::shared_ptr<TVDiskSkeletonTrace>, 4096>;
 
             struct TMsgInfo {
                 ui64 MsgId;
                 TInstant ReceivedTime;
-                std::unique_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
+                std::shared_ptr<TVDiskSkeletonTrace> VDiskSkeletonTrace;
 
-                TMsgInfo(ui64 msgId, TInstant receivedTime, std::unique_ptr<TVDiskSkeletonTrace> &&trace)
+                TMsgInfo(ui64 msgId, TInstant receivedTime, std::shared_ptr<TVDiskSkeletonTrace> &&trace)
                     : MsgId(msgId)
                     , ReceivedTime(receivedTime)
                     , VDiskSkeletonTrace(std::move(trace))
@@ -220,13 +220,14 @@ namespace NKikimr {
                 return Queue->GetSize();
             }
 
-            std::unique_ptr<TVDiskSkeletonTrace> GetFreeTrace() {
-                if (std::unique_ptr<TVDiskSkeletonTrace> *ptr = FreeTraceObjects->Head()) {
-                    std::unique_ptr<TVDiskSkeletonTrace> tmp = std::move(*ptr);
+            std::shared_ptr<TVDiskSkeletonTrace> GetFreeTrace() {
+                if (std::shared_ptr<TVDiskSkeletonTrace> *ptr = FreeTraceObjects->Head()) {
+                    std::shared_ptr<TVDiskSkeletonTrace> tmp = std::move(*ptr);
+                    Y_DEBUG_ABORT_UNLESS(tmp.use_count() == 1);
                     FreeTraceObjects->Pop();
                     return tmp;
                 } else {
-                    return std::make_unique<TVDiskSkeletonTrace>();
+                    return std::make_shared<TVDiskSkeletonTrace>();
                 }
             }
 
@@ -234,7 +235,7 @@ namespace NKikimr {
             void Enqueue(const TActorContext &ctx, ui32 recByteSize, std::unique_ptr<IEventHandle> converted,
                          const NBackpressure::TMessageId &msgId, ui64 cost, const TInstant &deadline,
                          NKikimrBlobStorage::EVDiskQueueId extQueueId, TFront& front,
-                         const NBackpressure::TQueueClientId& clientId, std::unique_ptr<TVDiskSkeletonTrace> &&trace) {
+                         const NBackpressure::TQueueClientId& clientId, std::shared_ptr<TVDiskSkeletonTrace> &&trace) {
                 Y_UNUSED(front);
                 ui64 cookie = converted->Cookie;
                 if (!Queue->Head() && CanSendToSkeleton(cost)) {
@@ -338,10 +339,9 @@ namespace NKikimr {
                 auto it = Msgs.find(cookie);
                 if (it != Msgs.end()) {
                     Y_VERIFY_S(it!= Msgs.end(), "cookie# " << cookie);
-                    if (it->second.VDiskSkeletonTrace) {
-                        it->second.VDiskSkeletonTrace->AdditionalTrace = nullptr;
-                        it->second.VDiskSkeletonTrace->MarkCount = 0;
-                        FreeTraceObjects->Push(std::move(it->second.VDiskSkeletonTrace));
+                    if (auto trace = std::exchange(it->second.VDiskSkeletonTrace, nullptr); trace && trace.use_count() == 1) {
+                        trace->Clear();
+                        FreeTraceObjects->Push(std::move(trace));
                     }
                     Msgs.erase(it);
                 }
@@ -1267,10 +1267,10 @@ namespace NKikimr {
             std::unique_ptr<IEventHandle> event = extQueue.Enqueue(ctx, std::unique_ptr<IEventHandle>(
                 ev->Forward(SkeletonId).Release()), msgId, cost, *this, clientId);
             if (event) {
-                std::unique_ptr<TVDiskSkeletonTrace> trace;
+                std::shared_ptr<TVDiskSkeletonTrace> trace;
                 if constexpr (IsPatchEvent<std::decay_t<decltype(*ev->Get())>>) {
                     trace = intQueue.GetFreeTrace();
-                    event->Get<std::decay_t<decltype(*ev->Get())>>()->VDiskSkeletonTrace = trace.get();
+                    event->Get<std::decay_t<decltype(*ev->Get())>>()->VDiskSkeletonTrace = trace;
                 }
                 // good, enqueue it in intQueue
                 intQueue.Enqueue(ctx, recByteSize, std::move(event), msgId, cost,

+ 6 - 4
ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp

@@ -116,7 +116,7 @@ namespace NKikimr::NPrivate {
         ui64 WaitedXorDiffCount = 0;
 
         std::shared_ptr<TVDiskSkeletonTrace> PatchActorTrace;
-        TVDiskSkeletonTrace *CurrentEventTrace;
+        std::shared_ptr<TVDiskSkeletonTrace> CurrentEventTrace;
 
 
         void AddMark(const char * const mark) {
@@ -147,7 +147,7 @@ namespace NKikimr::NPrivate {
             , IncarnationGuid(incarnationGuid)
             , GType(gType)
             , PatchActorTrace(std::make_shared<TVDiskSkeletonTrace>())
-            , CurrentEventTrace(ev->Get()->VDiskSkeletonTrace)
+            , CurrentEventTrace(std::move(ev->Get()->VDiskSkeletonTrace))
         {
             NKikimrBlobStorage::TEvVPatchStart &record = ev->Get()->Record;
             if (record.HasMsgQoS() && record.GetMsgQoS().HasDeadlineSeconds()) {
@@ -502,7 +502,7 @@ namespace NKikimr::NPrivate {
                     &record, SkeletonFrontIDPtr, VPatchResMsgsPtr, PutHistogram, IncarnationGuid);
             Sender = ev->Sender;
             Cookie = ev->Cookie;
-            CurrentEventTrace = ev->Get()->VDiskSkeletonTrace;
+            CurrentEventTrace = std::move(ev->Get()->VDiskSkeletonTrace);
             AddMark("Error: HandleError TEvVPatchDiff");
             SendVPatchResult(NKikimrProto::ERROR, ev->Get()->IsForceEnd());
         }
@@ -523,7 +523,7 @@ namespace NKikimr::NPrivate {
 
         void Handle(TEvBlobStorage::TEvVPatchDiff::TPtr &ev) {
             NKikimrBlobStorage::TEvVPatchDiff &record = ev->Get()->Record;
-            CurrentEventTrace = ev->Get()->VDiskSkeletonTrace;
+            CurrentEventTrace = std::move(ev->Get()->VDiskSkeletonTrace);
             if (CurrentEventTrace) {
                 CurrentEventTrace->AdditionalTrace = PatchActorTrace;
             }
@@ -762,6 +762,8 @@ namespace NKikimr::NPrivate {
                 IgnoreFunc(TEvBlobStorage::TEvVPatchXorDiffResult)
                 hFunc(TKikimrEvents::TEvWakeup, HandleInWaitState)
                 sFunc(TEvVPatchDyingConfirm, PassAway)
+                IgnoreFunc(TEvBlobStorage::TEvVGetResult)
+                IgnoreFunc(TEvBlobStorage::TEvVPutResult)
                 default: Y_FAIL_S(VDiskLogPrefix << " unexpected event " << ev->GetTypeName());
             }
         }