diff --git a/api/handler/delete.go b/api/handler/delete.go index 230002f72..df65313ea 100644 --- a/api/handler/delete.go +++ b/api/handler/delete.go @@ -12,10 +12,12 @@ import ( "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/middleware" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session" "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" "github.com/pquerna/otp/totp" + "go.uber.org/zap" ) // 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) + successObjects := make([]string, 0, len(toRemove)) + var errorObjects []string + for _, obj := range deletedObjects { if obj.Error != nil { + errorObjects = append(errorObjects, formObjNameToLog(obj)) code := "BadRequest" if s3err, ok := obj.Error.(errors.Error); ok { code = s3err.Code @@ -254,7 +260,8 @@ func (h *handler) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Re Key: obj.Name, VersionID: obj.VersionID, }) - } else if !requested.Quiet { + } else { + successObjects = append(successObjects, formObjNameToLog(obj)) deletedObj := DeletedObject{ ObjectIdentifier: ObjectIdentifier{ 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 { h.logAndSendError(ctx, w, "could not write response", reqInfo, err) return } } +func formObjNameToLog(obj *layer.VersionedObject) string { + return obj.Name + "\x00" + obj.VersionID +} + func (h *handler) DeleteBucketHandler(w http.ResponseWriter, r *http.Request) { ctx, span := tracing.StartSpanFromContext(r.Context(), "handler.DeleteBucket") defer span.End() diff --git a/internal/logs/logs.go b/internal/logs/logs.go index c0fddf5d4..ba6970dc5 100644 --- a/internal/logs/logs.go +++ b/internal/logs/logs.go @@ -164,6 +164,7 @@ const ( FailedToResolveCID = "failed to resolve CID" FailedToDiscardPutPayloadProbablyGoroutineLeaks = "failed to discard put payload, probably goroutine leaks" FailedToQueueOldUnversionedObjectToDelete = "failed to queue old unversioned object to delete, removal will be performed in lifecycler" + DeleteObjects = "delete objects" ) // External storage.