forked from TrueCloudLab/frostfs-s3-gw
[#165] Delete object from tree in case of storage error
Extend storage node errors in case of which we continue deleting from tree with 'object not found' error Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
71d82d1cc8
commit
69297a4a38
3 changed files with 26 additions and 36 deletions
|
@ -65,25 +65,25 @@ func TestDeleteBucket(t *testing.T) {
|
||||||
deleteBucket(t, tc, bktName, http.StatusNoContent)
|
deleteBucket(t, tc, bktName, http.StatusNoContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
//func TestDeleteBucketOnNotFoundError(t *testing.T) {
|
func TestDeleteBucketOnNotFoundError(t *testing.T) {
|
||||||
// hc := prepareHandlerContext(t)
|
hc := prepareHandlerContext(t)
|
||||||
//
|
|
||||||
// bktName, objName := "bucket-for-removal", "object-to-delete"
|
bktName, objName := "bucket-for-removal", "object-to-delete"
|
||||||
// bktInfo := createTestBucket(hc, bktName)
|
bktInfo := createTestBucket(hc, bktName)
|
||||||
//
|
|
||||||
// putObject(hc, bktName, objName)
|
putObject(hc, bktName, objName)
|
||||||
//
|
|
||||||
// nodeVersion, err := hc.tree.GetUnversioned(hc.context, bktInfo, objName)
|
nodeVersion, err := hc.tree.GetUnversioned(hc.context, bktInfo, objName)
|
||||||
// require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
// var addr oid.Address
|
var addr oid.Address
|
||||||
// addr.SetContainer(bktInfo.CID)
|
addr.SetContainer(bktInfo.CID)
|
||||||
// addr.SetObject(nodeVersion.OID)
|
addr.SetObject(nodeVersion.OID)
|
||||||
// hc.tp.SetObjectError(addr, &apistatus.ObjectNotFound{})
|
hc.tp.SetObjectError(addr, &apistatus.ObjectNotFound{})
|
||||||
//
|
|
||||||
// deleteObjects(t, hc, bktName, [][2]string{{objName, emptyVersion}})
|
deleteObjects(t, hc, bktName, [][2]string{{objName, emptyVersion}})
|
||||||
//
|
|
||||||
// deleteBucket(t, hc, bktName, http.StatusNoContent)
|
deleteBucket(t, hc, bktName, http.StatusNoContent)
|
||||||
//}
|
}
|
||||||
|
|
||||||
func TestDeleteObjectsError(t *testing.T) {
|
func TestDeleteObjectsError(t *testing.T) {
|
||||||
hc := prepareHandlerContext(t)
|
hc := prepareHandlerContext(t)
|
||||||
|
|
|
@ -711,24 +711,15 @@ func (n *layer) handleNotFoundError(bkt *data.BucketInfo, obj *VersionedObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *layer) handleObjectDeleteErrors(ctx context.Context, bkt *data.BucketInfo, obj *VersionedObject, nodeID uint64) *VersionedObject {
|
func (n *layer) handleObjectDeleteErrors(ctx context.Context, bkt *data.BucketInfo, obj *VersionedObject, nodeID uint64) *VersionedObject {
|
||||||
if client.IsErrObjectAlreadyRemoved(obj.Error) {
|
if !client.IsErrObjectAlreadyRemoved(obj.Error) && !client.IsErrObjectNotFound(obj.Error) {
|
||||||
n.reqLogger(ctx).Debug(logs.ObjectAlreadyRemoved,
|
return obj
|
||||||
zap.Stringer("cid", bkt.CID), zap.String("oid", obj.VersionID))
|
|
||||||
|
|
||||||
obj.Error = n.treeService.RemoveVersion(ctx, bkt, nodeID)
|
|
||||||
if obj.Error != nil {
|
|
||||||
return obj
|
|
||||||
}
|
|
||||||
|
|
||||||
n.cache.DeleteObjectName(bkt.CID, bkt.Name, obj.Name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if client.IsErrObjectNotFound(obj.Error) {
|
n.reqLogger(ctx).Debug(logs.CouldntDeleteObjectFromStorageContinueDeleting,
|
||||||
n.reqLogger(ctx).Debug(logs.ObjectNotFound,
|
zap.Stringer("cid", bkt.CID), zap.String("oid", obj.VersionID), zap.Error(obj.Error))
|
||||||
zap.Stringer("cid", bkt.CID), zap.String("oid", obj.VersionID))
|
|
||||||
|
|
||||||
obj.Error = nil
|
|
||||||
|
|
||||||
|
obj.Error = n.treeService.RemoveVersion(ctx, bkt, nodeID)
|
||||||
|
if obj.Error == nil {
|
||||||
n.cache.DeleteObjectName(bkt.CID, bkt.Name, obj.Name)
|
n.cache.DeleteObjectName(bkt.CID, bkt.Name, obj.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,6 @@ const (
|
||||||
CouldntDeletePart = "couldn't delete part" // Warn in ../../api/layer/multipart_upload.go
|
CouldntDeletePart = "couldn't delete part" // Warn in ../../api/layer/multipart_upload.go
|
||||||
PartDetails = "part details" // Debug in ../../api/layer/multipart_upload.go
|
PartDetails = "part details" // Debug in ../../api/layer/multipart_upload.go
|
||||||
GetObject = "get object" // Debug in ../../api/layer/layer.go
|
GetObject = "get object" // Debug in ../../api/layer/layer.go
|
||||||
ObjectAlreadyRemoved = "object already removed" // Debug in ../../api/layer/layer.go
|
|
||||||
ObjectNotFound = "object not found" // Debug in ../../api/layer/layer.go
|
|
||||||
ResolveBucket = "resolve bucket" // Info in ../../api/layer/layer.go
|
ResolveBucket = "resolve bucket" // Info in ../../api/layer/layer.go
|
||||||
CouldntDeleteCorsObject = "couldn't delete cors object" // Error in ../../api/layer/cors.go
|
CouldntDeleteCorsObject = "couldn't delete cors object" // Error in ../../api/layer/cors.go
|
||||||
PutObject = "put object" // Debug in ../../api/layer/object.go
|
PutObject = "put object" // Debug in ../../api/layer/object.go
|
||||||
|
@ -140,4 +138,5 @@ const (
|
||||||
PolicyValidationFailed = "policy validation failed"
|
PolicyValidationFailed = "policy validation failed"
|
||||||
ParseTreeNode = "parse tree node"
|
ParseTreeNode = "parse tree node"
|
||||||
FailedToGetRealObjectSize = "failed to get real object size"
|
FailedToGetRealObjectSize = "failed to get real object size"
|
||||||
|
CouldntDeleteObjectFromStorageContinueDeleting = "couldn't delete object from storage, continue deleting from tree"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue