From b3464e8140102ad585b8fa65c331d2bf3fbfe83a Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Wed, 22 Sep 2021 17:04:45 +0300 Subject: [PATCH] [#839] service/object: Do not use request forwarding when assembling object Forwarding mechanism resends original request. During split object chain traversal, storage node performs multiple `object.Head` requests on each child. If request forwarding happens, then `object.Head` returns object ID of the original request. This produces infinite assembly loop. Signed-off-by: Alex Vanin --- pkg/services/object/get/assemble.go | 6 +++++- pkg/services/object/get/exec.go | 6 ------ pkg/services/object/get/util.go | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pkg/services/object/get/assemble.go b/pkg/services/object/get/assemble.go index bcbd581c..7f8aade2 100644 --- a/pkg/services/object/get/assemble.go +++ b/pkg/services/object/get/assemble.go @@ -12,7 +12,11 @@ func (exec *execCtx) assemble() { return } - exec.assembling = true + // do not use forwarding during assembly stage + // assembly flag is not inherited in produced + // `execCtx`, however `commonPrm` does, so it + // makes sense to nil it there + exec.prm.SetRequestForwarder(nil) exec.log.Debug("trying to assemble the object...") diff --git a/pkg/services/object/get/exec.go b/pkg/services/object/get/exec.go index d92a29d2..58ac46e7 100644 --- a/pkg/services/object/get/exec.go +++ b/pkg/services/object/get/exec.go @@ -41,12 +41,6 @@ type execCtx struct { head bool curProcEpoch uint64 - - // true when the processing of the initial request - // is turned to assembling stage. When false, - // initial request can be forwarded during network - // communication. - assembling bool } type execOption func(*execCtx) diff --git a/pkg/services/object/get/util.go b/pkg/services/object/get/util.go index 90ea40a5..7a1ff0cb 100644 --- a/pkg/services/object/get/util.go +++ b/pkg/services/object/get/util.go @@ -82,7 +82,7 @@ func (c *clientCacheWrapper) get(addr network.AddressGroup) (getClient, error) { } func (c *clientWrapper) getObject(exec *execCtx, addr network.AddressGroup) (*objectSDK.Object, error) { - if !exec.assembling && exec.prm.forwarder != nil { + if exec.prm.forwarder != nil { return exec.prm.forwarder(addr, c.client) }