From fae03c2b50f03623dd1300cb100034f40fedd4d2 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Fri, 26 May 2023 18:29:11 +0300 Subject: [PATCH] [#78] Process 'not found' error when object exists in tree When object exists in tree but missing in storage, we can't remove bucket. While storage node does not sync tree service and object service, the only way to delete such broken bucket is to ignore 'object not found' error, clear cache and do not include missing objects in the listing result. Signed-off-by: Alex Vanin --- api/layer/layer.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/api/layer/layer.go b/api/layer/layer.go index 4ee38b5..203f92e 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -646,6 +646,15 @@ func (n *layer) handleObjectDeleteErrors(ctx context.Context, bkt *data.BucketIn n.cache.DeleteObjectName(bkt.CID, bkt.Name, obj.Name) } + if client.IsErrObjectNotFound(obj.Error) { + n.log.Debug("object not found", zap.String("bucket", bkt.Name), zap.Stringer("cid", bkt.CID), + zap.String("object", obj.Name), zap.String("oid", obj.VersionID)) + + obj.Error = nil + + n.cache.DeleteObjectName(bkt.CID, bkt.Name, obj.Name) + } + return obj } @@ -724,7 +733,7 @@ func (n *layer) ResolveBucket(ctx context.Context, name string) (cid.ID, error) } func (n *layer) DeleteBucket(ctx context.Context, p *DeleteBucketParams) error { - nodeVersions, err := n.bucketNodeVersions(ctx, p.BktInfo, "") + nodeVersions, err := n.getAllObjectsVersions(ctx, p.BktInfo, "", "") if err != nil { return err }