From 53f84d6084652cccaecf0b5aff8355ad2a84df0c Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Sun, 13 Aug 2017 07:56:35 +0530 Subject: [PATCH] Report healthy status for initial 120s, then switch to healthcheck (#4799) Swarm routes traffic only to containers that report healthy status, while Minio in distributed mode needs to talk to other peers before it can respond to healthcheck probe. As the Minio containers are not able to talk to each other, distributed Minio is not getting started on Docker Swarm. With this PR, Minio Healthcheck report healthy status for initial 120s enough for distributed Minio to start. After that normal Healthcheck resumes. Also changed the healthcheck method name in accordance with Google shell styleguide. Fixes: https://github.com/minio/minio/issues/4761 --- buildscripts/healthcheck.sh | 45 ++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/buildscripts/healthcheck.sh b/buildscripts/healthcheck.sh index 325c97c74..287fc20dc 100644 --- a/buildscripts/healthcheck.sh +++ b/buildscripts/healthcheck.sh @@ -19,25 +19,40 @@ _init () { scheme="http://" address="127.0.0.1:9000" resource="/minio/index.html" + start=$(stat -c "%Y" /proc/1) } -HealthCheckMain () { - # Get the http response code - http_response=$(curl -s -k -o /dev/null -I -w "%{http_code}" ${scheme}${address}${resource}) +healthcheck_main () { + # In distributed environment like Swarm, traffic is routed + # to a container only when it reports a `healthy` status. So, we exit + # with 0 to ensure healthy status till distributed Minio starts (120s). + # + # Refer: https://github.com/moby/moby/pull/28938#issuecomment-301753272 + if [ $(( $(date +%s) - start )) -lt 120 ]; then + exit 0 + else + # Get the http response code + http_response=$(curl -s -k -o /dev/null -I -w "%{http_code}" \ + ${scheme}${address}${resource}) - # Get the http response body - http_response_body=$(curl -k -s ${scheme}${address}${resource}) + # Get the http response body + http_response_body=$(curl -k -s ${scheme}${address}${resource}) - # server returns response 403 and body "SSL required" if non-TLS connection is attempted on a TLS-configured server. - # change the scheme and try again - if [ "$http_response" = "403" ] && [ "$http_response_body" = "SSL required" ]; then - scheme="https://" - http_response=$(curl -s -k -o /dev/null -I -w "%{http_code}" ${scheme}${address}${resource}) - fi + # server returns response 403 and body "SSL required" if non-TLS + # connection is attempted on a TLS-configured server. Change + # the scheme and try again + if [ "$http_response" = "403" ] && \ + [ "$http_response_body" = "SSL required" ]; then + scheme="https://" + http_response=$(curl -s -k -o /dev/null -I -w "%{http_code}" \ + ${scheme}${address}${resource}) + fi - # If http_repsonse is 200 - server is up. - # When MINIO_BROWSER is set to off, curl responds with 404. We assume that the the server is up - [ "$http_response" = "200" ] || [ "$http_response" = "404" ] + # If http_repsonse is 200 - server is up. When MINIO_BROWSER is + # set to off, curl responds with 404. We assume that the server + # is up + [ "$http_response" = "200" ] || [ "$http_response" = "404" ] + fi } -_init && HealthCheckMain +_init && healthcheck_main