diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2025-11-25 15:34:28 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-25 15:34:28 -0800 |
| commit | c156a130b7e1fbd8b63da3b24b494c9fbeb91d30 (patch) | |
| tree | 9b250e9c2caec47354a9dd02cf01b8d7a983945b /weed/s3api/s3api_object_handlers_put.go | |
| parent | 2843cb1255642816dab23562bfa68f98d80aebd1 (diff) | |
| download | seaweedfs-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.go | 19 |
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) |
