From 37d3506c5cef3eb043d4c349d64ebd5d6c464ee7 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Wed, 3 Dec 2025 14:06:31 +0300 Subject: [PATCH 1/2] go.mod: Upgrade `github.com/nspcc-dev/neofs-contract` to the latest This auto-makes IR to deploy/update Container contract with supported locks https://github.com/nspcc-dev/neofs-contract/pull/558. This also makes IR to accept containers with lock attribute. Signed-off-by: Leonard Lyubich --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 ++-- pkg/innerring/processors/container/process_container.go | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6dcfa89c2..fa1e7d5a44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Changelog for NeoFS Node - CLI supports `CONTAINER_AWAIT_TIMEOUT` status now (#3711) - Policer logs when it reaches the end of its cycle (#3720) - Support for GET of LINK objects in EC containers (#3722) +- Containers can now be locked for deletion via `__NEOFS__LOCK_UNTIL` attribute (#3708) ### Fixed - IR panics at graceful shutdown (#3706) diff --git a/go.mod b/go.mod index 4651f2f0e0..10770af6e4 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/nspcc-dev/locode-db v0.8.1 github.com/nspcc-dev/neo-go v0.114.0 github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea - github.com/nspcc-dev/neofs-contract v0.25.2-0.20251124180339-40ec608b4893 + github.com/nspcc-dev/neofs-contract v0.25.2-0.20251208151418-d34e3802d8c3 github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8 github.com/nspcc-dev/tzhash v1.8.3 github.com/panjf2000/ants/v2 v2.11.3 diff --git a/go.sum b/go.sum index 8c0f3e734d..63e251e59a 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251112080609-3c8e29c66609 h1:9j github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20251112080609-3c8e29c66609/go.mod h1:X2spkE8hK/l08CYulOF19fpK5n3p2xO0L1GnJFIywQg= github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea h1:mK0EMGLvunXcFyq7fBURS/CsN4MH+4nlYiqn6pTwWAU= github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240827150555-5ce597aa14ea/go.mod h1:YzhD4EZmC9Z/PNyd7ysC7WXgIgURc9uCG1UWDeV027Y= -github.com/nspcc-dev/neofs-contract v0.25.2-0.20251124180339-40ec608b4893 h1:sh25Y5GMLL9ixlcJdbktHkFUY3nyK9DeLY5EBaEQDwQ= -github.com/nspcc-dev/neofs-contract v0.25.2-0.20251124180339-40ec608b4893/go.mod h1:CYX51uP2pNBCK7Q0ygD1LNsoFSHbB2F5luaBrluFkUo= +github.com/nspcc-dev/neofs-contract v0.25.2-0.20251208151418-d34e3802d8c3 h1:L3ck8vHfeewmHBbb9sBhrKmx450YEiQ1Dox2Y09SXZY= +github.com/nspcc-dev/neofs-contract v0.25.2-0.20251208151418-d34e3802d8c3/go.mod h1:CYX51uP2pNBCK7Q0ygD1LNsoFSHbB2F5luaBrluFkUo= github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8 h1:oasL8SD11yOmW0a/GqMmm4/0sb86hMOYMi7HC20PIb0= github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.16.0.20251203135706-86667929fbb8/go.mod h1:IrM1JG/klBtecZEApIf8USgLonNcarv32R1O0dj4kQI= github.com/nspcc-dev/rfc6979 v0.2.4 h1:NBgsdCjhLpEPJZqmC9rciMZDcSY297po2smeaRjw57k= diff --git a/pkg/innerring/processors/container/process_container.go b/pkg/innerring/processors/container/process_container.go index e550df7e7b..03caa053e9 100644 --- a/pkg/innerring/processors/container/process_container.go +++ b/pkg/innerring/processors/container/process_container.go @@ -88,6 +88,7 @@ var allowedSystemAttributes = map[string]struct{}{ sysAttrPrefix + "NAME": {}, sysAttrPrefix + "ZONE": {}, sysAttrPrefix + "DISABLE_HOMOMORPHIC_HASHING": {}, + sysAttrPrefix + "LOCK_UNTIL": {}, sysAttrChainMeta: {}, } From 7ef904c1e547aef8b8c442fbd7aaa2957fc82c4f Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Wed, 3 Dec 2025 18:47:34 +0300 Subject: [PATCH 2/2] sn/container: Support `CONTAINER_LOCKED` status Catch 'container is locked' exception added in https://github.com/nspcc-dev/neofs-contract/pull/558 and respond with `CONTAINER_LOCKED` API status on it. Signed-off-by: Leonard Lyubich --- CHANGELOG.md | 1 + pkg/morph/client/container/delete.go | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa1e7d5a44..3562925907 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Changelog for NeoFS Node - Policer logs when it reaches the end of its cycle (#3720) - Support for GET of LINK objects in EC containers (#3722) - Containers can now be locked for deletion via `__NEOFS__LOCK_UNTIL` attribute (#3708) +- SN can respond with `CONTAINER_LOCKED` status now (#3708) ### Fixed - IR panics at graceful shutdown (#3706) diff --git a/pkg/morph/client/container/delete.go b/pkg/morph/client/container/delete.go index 18f31a1f8d..bfde6fdc07 100644 --- a/pkg/morph/client/container/delete.go +++ b/pkg/morph/client/container/delete.go @@ -3,8 +3,11 @@ package container import ( "context" "fmt" + "strings" + containerrpc "github.com/nspcc-dev/neofs-contract/rpc/container" fschaincontracts "github.com/nspcc-dev/neofs-node/pkg/morph/contracts" + apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status" ) // DeletePrm groups parameters of Delete client operation. @@ -42,6 +45,8 @@ func (d *DeletePrm) SetToken(token []byte) { // // Returns any error encountered that caused // the removal to interrupt. +// +// Returns [apistatus.ContainerLocked] if container is locked. func (c *Client) Delete(ctx context.Context, p DeletePrm) error { if len(p.signature) == 0 { return errNilArgument @@ -56,10 +61,16 @@ func (c *Client) Delete(ctx context.Context, p DeletePrm) error { p.cnr, p.signature, p.key, p.token, }) if err != nil { + if e := err.Error(); strings.Contains(e, containerrpc.ErrorLocked) { + return apistatus.NewContainerLocked(e) + } return fmt.Errorf("could not invoke method (%s): %w", deleteMethod, err) } return nil } + if e := err.Error(); strings.Contains(e, containerrpc.ErrorLocked) { + return apistatus.NewContainerLocked(e) + } return fmt.Errorf("could not invoke method (%s): %w", fschaincontracts.RemoveContainerMethod, err) } return nil