mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-08-28 03:46:24 +00:00
delete on get and head
This commit is contained in:
@@ -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,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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user