Browse Source

delete on get and head

pull/7426/head
Konstantin Lebedev 2 months ago
parent
commit
8efd47bf8f
  1. 5
      weed/pb/filer_pb/filer_pb_helper.go
  2. 18
      weed/s3api/s3api_object_handlers.go
  3. 13
      weed/s3api/s3api_object_handlers_list.go

5
weed/pb/filer_pb/filer_pb_helper.go

@ -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
weed/s3api/s3api_object_handlers.go

@ -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)
}

13
weed/s3api/s3api_object_handlers_list.go

@ -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 {

Loading…
Cancel
Save