diff options
| -rw-r--r-- | weed/pb/filer_pb/filer_pb_helper.go | 5 | ||||
| -rw-r--r-- | weed/s3api/s3api_object_handlers.go | 18 | ||||
| -rw-r--r-- | weed/s3api/s3api_object_handlers_list.go | 13 |
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 { |
