From 0f9e125cf3eb259709380e9847ac4e442480d082 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 19 Nov 2020 10:38:02 -0800 Subject: [PATCH] fix: check for gateway backend online without http request (#10924) fixes #10921 --- cmd/gateway-common.go | 20 +++++++------------- cmd/gateway/azure/gateway-azure.go | 10 +++++++--- cmd/gateway/gcs/gateway-gcs.go | 2 +- cmd/gateway/s3/gateway-s3.go | 6 +++++- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/cmd/gateway-common.go b/cmd/gateway-common.go index 492a803d7..93f6a2caa 100644 --- a/cmd/gateway-common.go +++ b/cmd/gateway-common.go @@ -18,6 +18,7 @@ package cmd import ( "context" + "net" "net/http" "strings" "time" @@ -254,25 +255,18 @@ func ToMinioClientCompleteParts(parts []CompletePart) []minio.CompletePart { // IsBackendOnline - verifies if the backend is reachable // by performing a GET request on the URL. returns 'true' // if backend is reachable. -func IsBackendOnline(ctx context.Context, clnt *http.Client, urlStr string) bool { +func IsBackendOnline(ctx context.Context, host string) bool { + var d net.Dialer + ctx, cancel := context.WithTimeout(ctx, 1*time.Second) defer cancel() - // never follow redirects - clnt.CheckRedirect = func(*http.Request, []*http.Request) error { - return http.ErrUseLastResponse - } - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, urlStr, nil) + conn, err := d.DialContext(ctx, "tcp", host) if err != nil { return false } - resp, err := clnt.Do(req) - if err != nil { - clnt.CloseIdleConnections() - return !xnet.IsNetworkOrHostDown(err, false) - } - xhttp.DrainBody(resp.Body) + + conn.Close() return true } diff --git a/cmd/gateway/azure/gateway-azure.go b/cmd/gateway/azure/gateway-azure.go index 7ce30ac01..eeee5ef4c 100644 --- a/cmd/gateway/azure/gateway-azure.go +++ b/cmd/gateway/azure/gateway-azure.go @@ -212,7 +212,7 @@ func (g *Azure) NewGatewayLayer(creds auth.Credentials) (minio.ObjectLayer, erro client := azblob.NewServiceURL(*endpointURL, pipeline) return &azureObjects{ - endpoint: endpointURL.String(), + endpoint: endpointURL, httpClient: httpClient, client: client, metrics: metrics, @@ -424,7 +424,7 @@ func azurePropertiesToS3Meta(meta azblob.Metadata, props azblob.BlobHTTPHeaders, // azureObjects - Implements Object layer for Azure blob storage. type azureObjects struct { minio.GatewayUnsupported - endpoint string + endpoint *url.URL httpClient *http.Client metrics *minio.Metrics client azblob.ServiceURL // Azure sdk client @@ -553,7 +553,11 @@ func (a *azureObjects) Shutdown(ctx context.Context) error { // StorageInfo - Not relevant to Azure backend. func (a *azureObjects) StorageInfo(ctx context.Context, _ bool) (si minio.StorageInfo, _ []error) { si.Backend.Type = minio.BackendGateway - si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, a.httpClient, a.endpoint) + host := a.endpoint.Host + if a.endpoint.Port() == "" { + host = a.endpoint.Host + ":" + a.endpoint.Scheme + } + si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, host) return si, nil } diff --git a/cmd/gateway/gcs/gateway-gcs.go b/cmd/gateway/gcs/gateway-gcs.go index 1bdd94f11..11f373e08 100644 --- a/cmd/gateway/gcs/gateway-gcs.go +++ b/cmd/gateway/gcs/gateway-gcs.go @@ -414,7 +414,7 @@ func (l *gcsGateway) Shutdown(ctx context.Context) error { // StorageInfo - Not relevant to GCS backend. func (l *gcsGateway) StorageInfo(ctx context.Context, _ bool) (si minio.StorageInfo, _ []error) { si.Backend.Type = minio.BackendGateway - si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, l.httpClient, "https://storage.googleapis.com") + si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, "storage.googleapis.com:443") return si, nil } diff --git a/cmd/gateway/s3/gateway-s3.go b/cmd/gateway/s3/gateway-s3.go index 3f3b86b71..95ca0f1bb 100644 --- a/cmd/gateway/s3/gateway-s3.go +++ b/cmd/gateway/s3/gateway-s3.go @@ -276,7 +276,11 @@ func (l *s3Objects) Shutdown(ctx context.Context) error { // StorageInfo is not relevant to S3 backend. func (l *s3Objects) StorageInfo(ctx context.Context, _ bool) (si minio.StorageInfo, _ []error) { si.Backend.Type = minio.BackendGateway - si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, l.HTTPClient, l.Client.EndpointURL().String()) + host := l.Client.EndpointURL().Host + if l.Client.EndpointURL().Port() == "" { + host = l.Client.EndpointURL().Host + ":" + l.Client.EndpointURL().Scheme + } + si.Backend.GatewayOnline = minio.IsBackendOnline(ctx, host) return si, nil }