diff --git a/cmd/api-errors.go b/cmd/api-errors.go index a2372ef5d..7e249a467 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -1362,8 +1362,8 @@ var errorCodes = errorCodeMap{ }, ErrBackendDown: { Code: "XMinioBackendDown", - Description: "Object storage backend is unreachable", - HTTPStatusCode: http.StatusServiceUnavailable, + Description: "Remote backend is unreachable", + HTTPStatusCode: http.StatusBadRequest, }, ErrIncorrectContinuationToken: { Code: "InvalidArgument", @@ -2129,6 +2129,11 @@ func toAPIError(ctx context.Context, err error) APIError { } } + if apiErr.Code == "XMinioBackendDown" { + apiErr.Description = fmt.Sprintf("%s (%v)", apiErr.Description, err) + return apiErr + } + if apiErr.Code == "InternalError" { // If we see an internal error try to interpret // any underlying errors if possible depending on diff --git a/cmd/gateway-common.go b/cmd/gateway-common.go index 09356721a..23e711c14 100644 --- a/cmd/gateway-common.go +++ b/cmd/gateway-common.go @@ -287,7 +287,7 @@ func ErrorRespToObjectError(err error, params ...string) error { } if xnet.IsNetworkOrHostDown(err, false) { - return BackendDown{} + return BackendDown{Err: err.Error()} } minioErr, ok := err.(minio.ErrorResponse) diff --git a/cmd/object-api-errors.go b/cmd/object-api-errors.go index 7f34e7fea..2692797c6 100644 --- a/cmd/object-api-errors.go +++ b/cmd/object-api-errors.go @@ -645,10 +645,12 @@ func (e UnsupportedMetadata) Error() string { } // BackendDown is returned for network errors or if the gateway's backend is down. -type BackendDown struct{} +type BackendDown struct { + Err string +} func (e BackendDown) Error() string { - return "Backend down" + return e.Err } // isErrBucketNotFound - Check if error type is BucketNotFound. diff --git a/cmd/warm-backend.go b/cmd/warm-backend.go index 441bf27af..97d1bbe4e 100644 --- a/cmd/warm-backend.go +++ b/cmd/warm-backend.go @@ -50,6 +50,10 @@ func checkWarmBackend(ctx context.Context, w WarmBackend) error { var empty bytes.Reader rv, err := w.Put(ctx, probeObject, &empty, 0) if err != nil { + switch err.(type) { + case BackendDown: + return err + } return tierPermErr{ Op: tierPut, Err: err, @@ -58,6 +62,10 @@ func checkWarmBackend(ctx context.Context, w WarmBackend) error { _, err = w.Get(ctx, probeObject, rv, WarmBackendGetOpts{}) if err != nil { + switch err.(type) { + case BackendDown: + return err + } switch { case isErrBucketNotFound(err): return errTierBucketNotFound @@ -72,6 +80,10 @@ func checkWarmBackend(ctx context.Context, w WarmBackend) error { } if err = w.Remove(ctx, probeObject, rv); err != nil { + switch err.(type) { + case BackendDown: + return err + } return tierPermErr{ Op: tierDelete, Err: err,