From f69acd51e0f0d2cf8574970902e4b16bbc524515 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Wed, 11 Dec 2024 11:26:47 +0300 Subject: [PATCH] morph,node/object/put: support "strict" meta-data policy According to https://github.com/nspcc-dev/neofs-api/pull/309, "strict" must wait for meta-data handling on the contract-side and every PUT request is responded only with transaction acceptance. Signed-off-by: Pavel Karpy --- pkg/morph/client/container/meta.go | 8 ++++++-- pkg/services/object/put/distributed.go | 11 ++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/pkg/morph/client/container/meta.go b/pkg/morph/client/container/meta.go index 2afe4283f1..a4769464bf 100644 --- a/pkg/morph/client/container/meta.go +++ b/pkg/morph/client/container/meta.go @@ -6,10 +6,11 @@ import ( "github.com/nspcc-dev/neofs-node/pkg/morph/client" ) -// SubmitObjectPut puts object meta information. +// SubmitObjectPut puts object meta information. With awaitTX it blocks until +// TX is accepted in chain or is expired. // // Returns any error encountered that caused the saving to interrupt. -func (c *Client) SubmitObjectPut(meta []byte, sigs [][]byte) error { +func (c *Client) SubmitObjectPut(awaitTX bool, meta []byte, sigs [][]byte) error { if len(meta) == 0 || len(sigs) == 0 { return errNilArgument } @@ -17,6 +18,9 @@ func (c *Client) SubmitObjectPut(meta []byte, sigs [][]byte) error { var prm client.InvokePrm prm.SetMethod(submitObjectPutMethod) prm.SetArgs(meta, sigs) + if awaitTX { + prm.Await() + } err := c.client.Invoke(prm) if err != nil { diff --git a/pkg/services/object/put/distributed.go b/pkg/services/object/put/distributed.go index d2052b01c0..ba503438f0 100644 --- a/pkg/services/object/put/distributed.go +++ b/pkg/services/object/put/distributed.go @@ -159,7 +159,16 @@ func (t *distributedTarget) Close() (oid.ID, error) { t.metaMtx.RLock() defer t.metaMtx.RUnlock() - err = t.cnrClient.SubmitObjectPut(t.objSharedMeta, t.collectedSignatures) + var await bool + switch t.metainfoConsistencyAttr { + // TODO: there was no constant in SDK at the code creation moment + case "strict": + await = true + default: + await = false + } + + err = t.cnrClient.SubmitObjectPut(await, t.objSharedMeta, t.collectedSignatures) if err != nil { t.placementIterator.log.Info("submitting meta information", zap.Stringer("oid", id), zap.Error(err)) }