diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index b1446c3e7..c403698e5 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -25,6 +25,7 @@ import ( "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants" "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" "github.com/seaweedfs/seaweedfs/weed/util/mem" + util_http "github.com/seaweedfs/seaweedfs/weed/util/http" "github.com/seaweedfs/seaweedfs/weed/glog" ) @@ -740,7 +741,12 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) return } // Response not yet written - safe to write S3 error response - s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + // Check if error is due to volume server rate limiting (HTTP 429) + if errors.Is(err, util_http.ErrTooManyRequests) { + s3err.WriteErrorResponse(w, r, s3err.ErrRequestBytesExceed) + } else { + s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + } return } } diff --git a/weed/util/http/http_global_client_util.go b/weed/util/http/http_global_client_util.go index 38f129365..3a969fdc8 100644 --- a/weed/util/http/http_global_client_util.go +++ b/weed/util/http/http_global_client_util.go @@ -24,6 +24,7 @@ import ( ) var ErrNotFound = fmt.Errorf("not found") +var ErrTooManyRequests = fmt.Errorf("too many requests") var ( jwtSigningReadKey security.SigningKey @@ -332,6 +333,9 @@ func ReadUrlAsStream(ctx context.Context, fileUrl, jwt string, cipherKey []byte, if r.StatusCode == http.StatusNotFound { return true, fmt.Errorf("%s: %s: %w", fileUrl, r.Status, ErrNotFound) } + if r.StatusCode == http.StatusTooManyRequests { + return false, fmt.Errorf("%s: %s: %w", fileUrl, r.Status, ErrTooManyRequests) + } retryable = r.StatusCode >= 499 return retryable, fmt.Errorf("%s: %s", fileUrl, r.Status) }