diff --git a/pkg/local_object_storage/shard/inhume.go b/pkg/local_object_storage/shard/inhume.go index b1ee560d8..0246a4775 100644 --- a/pkg/local_object_storage/shard/inhume.go +++ b/pkg/local_object_storage/shard/inhume.go @@ -17,6 +17,9 @@ type InhumeRes struct{} // WithTarget sets object address that should be inhumed and tombstone address // as the reason for inhume operation. +// +// Arguments should not be nil. +// Should not be called along with MarkAsGarbage. func (p *InhumePrm) WithTarget(addr, tombstone *objectSDK.Address) *InhumePrm { if p != nil { p.target = addr @@ -26,10 +29,30 @@ func (p *InhumePrm) WithTarget(addr, tombstone *objectSDK.Address) *InhumePrm { return p } +// MarkAsGarbage marks object to be physically removed from shard. +// +// Should not be called along with WithTarget. +func (p *InhumePrm) MarkAsGarbage(addr *objectSDK.Address) *InhumePrm { + if p != nil { + p.target = addr + p.tombstone = nil + } + + return p +} + // Inhume calls metabase. Inhume method to mark object as removed. It won't be // removed physically from blobStor and metabase until `Delete` operation. func (s *Shard) Inhume(prm *InhumePrm) (*InhumeRes, error) { - err := meta.Inhume(s.metaBase, prm.target, prm.tombstone) + metaPrm := new(meta.InhumePrm).WithAddress(prm.target) + + if prm.tombstone != nil { + metaPrm.WithTombstoneAddress(prm.tombstone) + } else { + metaPrm.WithGCMark() + } + + _, err := s.metaBase.Inhume(metaPrm) if err != nil { s.log.Debug("could not mark object to delete in metabase", zap.String("error", err.Error()),