aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/pb/filer_pb/filer_pb_helper.go5
-rw-r--r--weed/s3api/s3api_object_handlers.go18
-rw-r--r--weed/s3api/s3api_object_handlers_list.go13
3 files changed, 29 insertions, 7 deletions
diff --git a/weed/pb/filer_pb/filer_pb_helper.go b/weed/pb/filer_pb/filer_pb_helper.go
index b5fd4e1e0..361f5a60b 100644
--- a/weed/pb/filer_pb/filer_pb_helper.go
+++ b/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)
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go
index 163633e22..424987377 100644
--- a/weed/s3api/s3api_object_handlers.go
+++ b/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)
}
diff --git a/weed/s3api/s3api_object_handlers_list.go b/weed/s3api/s3api_object_handlers_list.go
index 816ee02df..f0479b4ea 100644
--- a/weed/s3api/s3api_object_handlers_list.go
+++ b/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 {