From 72c84709581e32fad0b08c944d10d6e6ffc9475e 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 | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 4 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 4e732397e8..9a34db73c1 100644 --- a/pkg/services/object/put/distributed.go +++ b/pkg/services/object/put/distributed.go @@ -155,11 +155,22 @@ func (t *distributedTarget) Close() (oid.ID, error) { return oid.ID{}, err } - if t.localNodeInContainer && (t.metainfoConsistencyAttr == "strict" || t.metainfoConsistencyAttr == "optimistic") { + if t.localNodeInContainer && t.metainfoConsistencyAttr != "" { 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 + case "optimistic": + await = false + default: + return id, nil + } + + err = t.cnrClient.SubmitObjectPut(await, t.objSharedMeta, t.collectedSignatures) if err != nil { t.placementIterator.log.Info("failed to submit", zap.Stringer("oid", id), zap.Error(err)) }