From d4e48b28b15d7533d8c428d1e1c9770883de3e1a Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 1 Dec 2020 12:35:42 +0300 Subject: [PATCH] [#222] Add Inhume method to storage engine Signed-off-by: Alex Vanin --- pkg/local_object_storage/engine/inhume.go | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 pkg/local_object_storage/engine/inhume.go diff --git a/pkg/local_object_storage/engine/inhume.go b/pkg/local_object_storage/engine/inhume.go new file mode 100644 index 00000000..18bd1bc0 --- /dev/null +++ b/pkg/local_object_storage/engine/inhume.go @@ -0,0 +1,47 @@ +package engine + +import ( + objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object" + "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/shard" + "go.uber.org/zap" +) + +// InhumePrm encapsulates parameters for inhume operation. +type InhumePrm struct { + addr, tombstone *objectSDK.Address +} + +// InhumeRes encapsulates results of inhume operation. +type InhumeRes struct{} + +// WithTarget sets object address that should be inhumed and tombstone address +// as the reason for inhume operation. +func (p *InhumePrm) WithTarget(addr, tombstone *objectSDK.Address) *InhumePrm { + if p != nil { + p.addr = addr + p.tombstone = tombstone + } + + return p +} + +// Inhume calls metabase. Inhume method to mark object as removed. It won't be +// removed physically from shard until `Delete` operation. +func (e *StorageEngine) Inhume(prm *InhumePrm) (*InhumeRes, error) { + shPrm := new(shard.InhumePrm).WithTarget(prm.addr, prm.tombstone) + + e.iterateOverSortedShards(prm.addr, func(sh *shard.Shard) (stop bool) { + _, err := sh.Inhume(shPrm) + if err != nil { + // TODO: smth wrong with shard, need to be processed + e.log.Warn("could not inhume object in shard", + zap.Stringer("shard", sh.ID()), + zap.String("error", err.Error()), + ) + } + + return false + }) + + return nil, nil +}