delete on get and head

This commit is contained in:
Konstantin Lebedev
2025-11-03 15:11:28 +05:00
parent 391f261ba5
commit 8efd47bf8f
3 changed files with 29 additions and 7 deletions
+5
View File
@@ -24,6 +24,11 @@ func (entry *Entry) IsDirectoryKeyObject() bool {
return entry.IsDirectory && entry.Attributes != nil && entry.Attributes.Mime != ""
}
func (entry *Entry) IsExpired() bool {
return entry.Attributes != nil && entry.Attributes.TtlSec > 0 &&
(entry.Attributes.GetMtime()+int64(entry.Attributes.TtlSec)) >= time.Now().UTC().Unix()
}
func (entry *Entry) FileMode() (fileMode os.FileMode) {
if entry != nil && entry.Attributes != nil {
fileMode = os.FileMode(entry.Attributes.FileMode)
+18
View File
@@ -18,6 +18,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
"github.com/seaweedfs/seaweedfs/weed/util"
"github.com/seaweedfs/seaweedfs/weed/util/mem"
"github.com/seaweedfs/seaweedfs/weed/glog"
@@ -87,6 +88,13 @@ func removeDuplicateSlashes(object string) string {
}
return result.String()
}
func (s3a *S3ApiServer) removeExpiredObject(w http.ResponseWriter, r *http.Request, entry *filer_pb.Entry, bucket, object string) {
target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object))
dir, name := target.DirAndName()
if rmErr := s3a.rm(dir, name, true, false); rmErr != nil {
glog.Errorf("delete expired entries %s/%s: %v", dir, name, rmErr)
}
}
// checkDirectoryObject checks if the object is a directory object (ends with "/") and if it exists
// Returns: (entry, isDirectoryObject, error)
@@ -340,6 +348,11 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request)
// Add object lock metadata to response headers if present
s3a.addObjectLockHeadersToResponse(w, entry)
} else {
if s3a.option.AllowDeleteObjectsByTTL && entry.IsExpired() {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
s3a.removeExpiredObject(w, r, entry, bucket, object)
return
}
// Handle regular GET (non-versioned)
destUrl = s3a.toFilerUrl(bucket, object)
}
@@ -490,6 +503,11 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request
// Add object lock metadata to response headers if present
s3a.addObjectLockHeadersToResponse(w, entry)
} else {
if s3a.option.AllowDeleteObjectsByTTL && entry.IsExpired() {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
s3a.removeExpiredObject(w, r, entry, bucket, object)
return
}
// Handle regular HEAD (non-versioned)
destUrl = s3a.toFilerUrl(bucket, object)
}
+6 -7
View File
@@ -9,7 +9,6 @@ import (
"net/url"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/seaweedfs/seaweedfs/weed/glog"
@@ -304,17 +303,17 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
}
}
}
if s3a.option.AllowDeleteObjectsByTTL && entry.IsExpired() {
if delErr := doDeleteEntry(client, dir, entry.Name, true, false); delErr != nil {
glog.Errorf("delete expired entries %s/%s: %v", dir, entry.Name, delErr)
}
return
}
if !delimiterFound {
contents = append(contents, newListEntry(entry, "", dirName, entryName, bucketPrefix, fetchOwner, false, false, s3a.iam))
cursor.maxKeys--
lastEntryWasCommonPrefix = false
}
if s3a.option.AllowDeleteObjectsByTTL && entry.Attributes != nil && entry.Attributes.TtlSec > 0 &&
(entry.Attributes.GetMtime()+int64(entry.Attributes.TtlSec)) >= time.Now().Unix() {
if delErr := doDeleteEntry(client, dir, entry.Name, true, false); delErr != nil {
glog.Errorf("delete expired entries %s/%s: %v", dir, entry.Name, delErr)
}
}
}
})
if doErr != nil {