aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/s3api_object_handlers_put.go
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2025-11-25 15:34:28 -0800
committerGitHub <noreply@github.com>2025-11-25 15:34:28 -0800
commitc156a130b7e1fbd8b63da3b24b494c9fbeb91d30 (patch)
tree9b250e9c2caec47354a9dd02cf01b8d7a983945b /weed/s3api/s3api_object_handlers_put.go
parent2843cb1255642816dab23562bfa68f98d80aebd1 (diff)
downloadseaweedfs-c156a130b7e1fbd8b63da3b24b494c9fbeb91d30.tar.xz
seaweedfs-c156a130b7e1fbd8b63da3b24b494c9fbeb91d30.zip
S3: Auto create bucket (#7549)
* auto create buckets * only admin users can auto create buckets * Update weed/s3api/s3api_bucket_handlers.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * validate bucket name * refactor * error handling * error * refetch * ensure owner * multiple errors --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Diffstat (limited to 'weed/s3api/s3api_object_handlers_put.go')
-rw-r--r--weed/s3api/s3api_object_handlers_put.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go
index c618405ca..540a1e512 100644
--- a/weed/s3api/s3api_object_handlers_put.go
+++ b/weed/s3api/s3api_object_handlers_put.go
@@ -135,12 +135,23 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request)
versioningState, err := s3a.getVersioningState(bucket)
if err != nil {
if errors.Is(err, filer_pb.ErrNotFound) {
- s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket)
+ // Auto-create bucket if it doesn't exist (requires Admin permission)
+ if !s3a.handleAutoCreateBucket(w, r, bucket, "PutObjectHandler") {
+ return
+ }
+ // Re-fetch versioning state to handle race conditions where
+ // another process might have created the bucket with versioning enabled.
+ versioningState, err = s3a.getVersioningState(bucket)
+ if err != nil {
+ glog.Errorf("Error re-checking versioning status for bucket %s after auto-creation: %v", bucket, err)
+ s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
+ return
+ }
+ } else {
+ glog.Errorf("Error checking versioning status for bucket %s: %v", bucket, err)
+ s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
return
}
- glog.Errorf("Error checking versioning status for bucket %s: %v", bucket, err)
- s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
- return
}
versioningEnabled := (versioningState == s3_constants.VersioningEnabled)