satellite: wrap notfound on failed deletes as DRPC errors
We're seeing BeginDeleteObject in metaclient returning object not found: metabase: no rows deleted in the Gateway-MT mint tests. There's a client check for rpcStatus.NotFound, but the metabase endpoint isn't wrapping the db error as a DRPC error. Here's the chain: gateway.AbortMultipartUpload() project.AbortUpload() metainfoClient.BeginDeleteObject() <- understands DRPC errors endpoint.DeletePendingObject() <- where this code is db.DeletePendingObject() <- returns error Change-Id: I93991de76487426df0a807b0d1e69fc975196a1a
This commit is contained in:
parent
ea772a8480
commit
549e799bbe
@ -1458,7 +1458,11 @@ func (endpoint *Endpoint) BeginDeleteObject(ctx context.Context, req *pb.ObjectB
|
||||
// No error info is returned if neither Read, nor List permission is granted
|
||||
return &pb.ObjectBeginDeleteResponse{}, nil
|
||||
}
|
||||
return nil, err
|
||||
if storj.ErrObjectNotFound.Has(err) {
|
||||
return nil, rpcstatus.Wrap(rpcstatus.NotFound, err)
|
||||
}
|
||||
endpoint.log.Error("internal", zap.Error(err))
|
||||
return nil, rpcstatus.Wrap(rpcstatus.Internal, err)
|
||||
}
|
||||
|
||||
var object *pb.Object
|
||||
|
@ -1964,3 +1964,41 @@ func TestObjectSegmentExpiresAt(t *testing.T) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestDeleteNonExistentObject(t *testing.T) {
|
||||
testplanet.Run(t, testplanet.Config{
|
||||
SatelliteCount: 1, StorageNodeCount: 0, UplinkCount: 1,
|
||||
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
||||
apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()]
|
||||
|
||||
expectedBucketName := "delete-objects-bucket"
|
||||
metainfoClient, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey)
|
||||
require.NoError(t, err)
|
||||
defer ctx.Check(metainfoClient.Close)
|
||||
|
||||
// non-pending non-existent objects return no error
|
||||
_, err = metainfoClient.BeginDeleteObject(ctx, metaclient.BeginDeleteObjectParams{
|
||||
Bucket: []byte(expectedBucketName),
|
||||
EncryptedPath: []byte("bad path"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// pending non-existent objects return an RPC error
|
||||
signer := signing.SignerFromFullIdentity(planet.Satellites[0].Identity)
|
||||
streamUUID := testrand.UUID()
|
||||
satStreamID := &internalpb.StreamID{CreationDate: time.Now(), StreamId: streamUUID[:]}
|
||||
signedStreamID, err := metainfo.SignStreamID(ctx, signer, satStreamID)
|
||||
require.NoError(t, err)
|
||||
encodedStreamID, err := pb.Marshal(signedStreamID)
|
||||
require.NoError(t, err)
|
||||
streamID, err := storj.StreamIDFromBytes(encodedStreamID)
|
||||
require.NoError(t, err)
|
||||
_, err = metainfoClient.BeginDeleteObject(ctx, metaclient.BeginDeleteObjectParams{
|
||||
Bucket: []byte(expectedBucketName),
|
||||
EncryptedPath: []byte("bad path"),
|
||||
Status: int32(metabase.Pending),
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.True(t, errs2.IsRPC(err, rpcstatus.NotFound))
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user