diff --git a/dockerscripts/healthcheck.go b/dockerscripts/healthcheck.go index c23b6e726..3bfea759c 100755 --- a/dockerscripts/healthcheck.go +++ b/dockerscripts/healthcheck.go @@ -19,6 +19,7 @@ package main import ( "bufio" "crypto/tls" + "errors" "fmt" "io/ioutil" "log" @@ -45,23 +46,23 @@ func getStartTime() time.Time { di, err := os.Stat("/proc/1") if err != nil { // Cant stat proc dir successfully, exit with error - log.Fatal(err.Error()) + log.Fatalln(err) } return di.ModTime() } // Returns the ip:port of the Minio process // running in the container -func findEndpoint() string { +func findEndpoint() (string, error) { cmd := exec.Command("netstat", "-ntlp") stdout, err := cmd.StdoutPipe() if err != nil { // error getting stdout pipe - log.Fatal(err.Error()) + return "", err } if err = cmd.Start(); err != nil { - // error starting the command - log.Fatal(err.Error()) + // error executing the command. + return "", err } // split netstat output in rows scanner := bufio.NewScanner(stdout) @@ -85,20 +86,21 @@ func findEndpoint() string { } // wait for cmd to complete before return if err = cmd.Wait(); err != nil { - // command failed to run - log.Fatal(err.Error()) + return "", err } // return joint address and port - return strings.Join([]string{addr, port}, ":") + return strings.Join([]string{addr, port}, ":"), nil } } + if err = scanner.Err(); err != nil { + return "", err + } if err = cmd.Wait(); err != nil { // command failed to run - log.Fatal(err.Error()) + return "", err } // minio process not found, exit with error - os.Exit(1) - return "" + return "", errors.New("no minio process found") } func main() { @@ -110,16 +112,16 @@ func main() { // Refer: https://github.com/moby/moby/pull/28938#issuecomment-301753272 - if (time.Now().Sub(startTime) / time.Second) < initGraceTime { - os.Exit(0) - } else { - endPoint := findEndpoint() + if (time.Now().Sub(startTime) / time.Second) > initGraceTime { + endPoint, err := findEndpoint() + if err != nil { + log.Fatalln(err) + } u, err := url.Parse(fmt.Sprintf("http://%s%s", endPoint, healthPath)) if err != nil { // Could not parse URL successfully - log.Fatal(err.Error()) + log.Fatalln(err) } - // Minio server may be using self-signed or CA certificates. To avoid // making Docker setup complicated, we skip verifying certificates here. // This is because, following request tests for health status within @@ -132,7 +134,7 @@ func main() { resp, err := client.Get(u.String()) if err != nil { // GET failed exit - log.Fatal(err.Error()) + log.Fatalln(err) } if resp.StatusCode == http.StatusOK { // Drain any response. @@ -145,7 +147,7 @@ func main() { // Drain any response. xhttp.DrainBody(resp.Body) // GET failed exit - log.Fatal(err.Error()) + log.Fatalln(err) } bodyString := string(bodyBytes) // Drain any response. @@ -157,7 +159,7 @@ func main() { resp, err = client.Get(u.String()) if err != nil { // GET failed exit - log.Fatal(err.Error()) + log.Fatalln(err) } if resp.StatusCode == http.StatusOK { // Drain any response. @@ -168,8 +170,9 @@ func main() { // Drain any response. xhttp.DrainBody(resp.Body) } + // Execution reaching here means none of + // the success cases were satisfied + os.Exit(1) } - // Execution reaching here means none of - // the success cases were satisfied - os.Exit(1) + os.Exit(0) }