From 97b4da16c2e2d1261e50b1a2597815a7054ba805 Mon Sep 17 00:00:00 2001
From: Dmitrii Stepanov <d.stepanov@yadro.com>
Date: Mon, 10 Feb 2025 17:55:34 +0300
Subject: [PATCH] [#1636] object: Fix IO tag adjustment for Put/Patch

There was no tag adjustment for CloseAndRecv.

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
---
 pkg/services/object/qos.go | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/pkg/services/object/qos.go b/pkg/services/object/qos.go
index 145a316e2..01eb1ea8d 100644
--- a/pkg/services/object/qos.go
+++ b/pkg/services/object/qos.go
@@ -3,6 +3,8 @@ package object
 import (
 	"context"
 
+	"git.frostfs.info/TrueCloudLab/frostfs-node/internal/assert"
+	"git.frostfs.info/TrueCloudLab/frostfs-qos/tagging"
 	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/object"
 	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/session"
 )
@@ -120,13 +122,24 @@ type qosSendRecv[TReq qosVerificationHeader, TResp any] interface {
 type qosWriteStream[TReq qosVerificationHeader, TResp any] struct {
 	s   qosSendRecv[TReq, TResp]
 	adj AdjustIOTag
+
+	ioTag        string
+	ioTagDefined bool
 }
 
 func (q *qosWriteStream[TReq, TResp]) CloseAndRecv(ctx context.Context) (TResp, error) {
+	if q.ioTagDefined {
+		ctx = tagging.ContextWithIOTag(ctx, q.ioTag)
+	}
 	return q.s.CloseAndRecv(ctx)
 }
 
 func (q *qosWriteStream[TReq, TResp]) Send(ctx context.Context, req TReq) error {
-	ctx = q.adj.AdjustIncomingTag(ctx, req.GetVerificationHeader().GetBodySignature().GetKey())
+	if !q.ioTagDefined {
+		ctx = q.adj.AdjustIncomingTag(ctx, req.GetVerificationHeader().GetBodySignature().GetKey())
+		q.ioTag, q.ioTagDefined = tagging.IOTagFromContext(ctx)
+	}
+	assert.True(q.ioTagDefined, "io tag undefined after incoming tag adjustment")
+	ctx = tagging.ContextWithIOTag(ctx, q.ioTag)
 	return q.s.Send(ctx, req)
 }