store S3 storage class in extended atrributes #7961 (#7962)

* store S3 storage class in extended atrributes #7961

* canonical

* remove issue reference

---------

Co-authored-by: Robert Schade <robert.schade@uni-paderborn.de>
Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
Robert Schade
2026-01-04 20:24:43 +01:00
committed by GitHub
parent c909724bf1
commit de3df211d7
4 changed files with 47 additions and 5 deletions

View File

@@ -571,6 +571,15 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, filePath string, dataReader
}
}
// Store the storage class from header
if sc := r.Header.Get(s3_constants.AmzStorageClass); sc != "" {
if !validateStorageClass(sc) {
glog.Warningf("putToFiler: Invalid storage class '%s' for %s", sc, filePath)
return "", s3err.ErrInvalidStorageClass, SSEResponseMetadata{}
}
entry.Extended[s3_constants.AmzStorageClass] = []byte(sc)
}
// Parse and store object tags from X-Amz-Tagging header
// Fix for GitHub issue #7589: Tags sent during object upload were not being stored
if tagging := r.Header.Get(s3_constants.AmzObjectTagging); tagging != "" {
@@ -1881,3 +1890,20 @@ func (s3a *S3ApiServer) deleteOrphanedChunks(chunks []*filer_pb.FileChunk) {
glog.V(3).Infof("deleteOrphanedChunks: successfully deleted all %d orphaned chunks", successCount)
}
}
func validateStorageClass(sc string) bool {
switch StorageClass(sc) {
case "STANDARD", "REDUCED_REDUNDANCY", "STANDARD_IA", "ONEZONE_IA", "INTELLIGENT_TIERING", "GLACIER", "DEEP_ARCHIVE", "OUTPOSTS", "GLACIER_IR", "SNOW":
return true
}
return false
}
func (s3a *S3ApiServer) getStorageClassFromExtended(extended map[string][]byte) string {
if extended != nil {
if sc, ok := extended[s3_constants.AmzStorageClass]; ok {
return string(sc)
}
}
return "STANDARD"
}