[#673] Log deleted objects in multiple removing

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
Denis Kirillov 2025-04-01 14:50:13 +03:00
parent 7d6e20fdad
commit 7626b6a04a
2 changed files with 20 additions and 1 deletions

View file

@ -12,10 +12,12 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors"
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer"
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware"
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs"
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
"github.com/pquerna/otp/totp" "github.com/pquerna/otp/totp"
"go.uber.org/zap"
) )
// limitation of AWS https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html // limitation of AWS https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html
@ -242,8 +244,12 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re
} }
deletedObjects := h.obj.DeleteObjects(ctx, p) deletedObjects := h.obj.DeleteObjects(ctx, p)
successObjects := make([]string, 0, len(toRemove))
var errorObjects []string
for _, obj := range deletedObjects { for _, obj := range deletedObjects {
if obj.Error != nil { if obj.Error != nil {
errorObjects = append(errorObjects, formObjNameToLog(obj))
code := "BadRequest" code := "BadRequest"
if s3err, ok := obj.Error.(errors.Error); ok { if s3err, ok := obj.Error.(errors.Error); ok {
code = s3err.Code code = s3err.Code
@ -254,7 +260,8 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re
Key: obj.Name, Key: obj.Name,
VersionID: obj.VersionID, VersionID: obj.VersionID,
}) })
} else if !requested.Quiet { } else {
successObjects = append(successObjects, formObjNameToLog(obj))
deletedObj := DeletedObject{ deletedObj := DeletedObject{
ObjectIdentifier: ObjectIdentifier{ ObjectIdentifier: ObjectIdentifier{
ObjectName: obj.Name, ObjectName: obj.Name,
@ -269,12 +276,23 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re
} }
} }
h.reqLogger(ctx).Info(logs.DeleteObjects, zap.Strings("success", successObjects), zap.Strings("errors", errorObjects),
logs.TagField(logs.TagDatapath))
if requested.Quiet {
response.DeletedObjects = nil
}
if err = middleware.EncodeToResponse(w, response); err != nil { if err = middleware.EncodeToResponse(w, response); err != nil {
h.logAndSendError(ctx, w, "could not write response", reqInfo, err) h.logAndSendError(ctx, w, "could not write response", reqInfo, err)
return return
} }
} }
func formObjNameToLog(obj *layer.VersionedObject) string {
return obj.Name + "\x00" + obj.VersionID
}
func (h *handler) DeleteBucketHandler(w http.ResponseWriter, r *http.Request) { func (h *handler) DeleteBucketHandler(w http.ResponseWriter, r *http.Request) {
ctx, span := tracing.StartSpanFromContext(r.Context(), "handler.DeleteBucket") ctx, span := tracing.StartSpanFromContext(r.Context(), "handler.DeleteBucket")
defer span.End() defer span.End()

View file

@ -164,6 +164,7 @@ const (
FailedToResolveCID = "failed to resolve CID" FailedToResolveCID = "failed to resolve CID"
FailedToDiscardPutPayloadProbablyGoroutineLeaks = "failed to discard put payload, probably goroutine leaks" FailedToDiscardPutPayloadProbablyGoroutineLeaks = "failed to discard put payload, probably goroutine leaks"
FailedToQueueOldUnversionedObjectToDelete = "failed to queue old unversioned object to delete, removal will be performed in lifecycler" FailedToQueueOldUnversionedObjectToDelete = "failed to queue old unversioned object to delete, removal will be performed in lifecycler"
DeleteObjects = "delete objects"
) )
// External storage. // External storage.