include ip address while doing checkPortAvailability (#7818)

While checking for port availability, ip address should be included.
When a machine has multiple ip addresses, multiple minio instances
or some other applications can be run on same port but different
ip address.

Fixes #7685
master
Kanagaraj M 5 years ago committed by kannappanr
parent 61229b38f7
commit 48cb271a46
  1. 2
      cmd/gateway-main.go
  2. 6
      cmd/net.go
  3. 8
      cmd/net_test.go
  4. 2
      cmd/server-main.go

@ -121,7 +121,7 @@ func StartGateway(ctx *cli.Context, gw Gateway) {
// to IPv6 address ie minio will start listening on IPv6 address whereas another // to IPv6 address ie minio will start listening on IPv6 address whereas another
// (non-)minio process is listening on IPv4 of given port. // (non-)minio process is listening on IPv4 of given port.
// To avoid this error situation we check for port availability. // To avoid this error situation we check for port availability.
logger.FatalIf(checkPortAvailability(globalMinioPort), "Unable to start the gateway") logger.FatalIf(checkPortAvailability(globalMinioHost, globalMinioPort), "Unable to start the gateway")
// Check and load TLS certificates. // Check and load TLS certificates.
var err error var err error

@ -190,10 +190,10 @@ func isHostIP(ipAddress string) bool {
return net.ParseIP(host) != nil return net.ParseIP(host) != nil
} }
// checkPortAvailability - check if given port is already in use. // checkPortAvailability - check if given host and port is already in use.
// Note: The check method tries to listen on given port and closes it. // Note: The check method tries to listen on given port and closes it.
// It is possible to have a disconnected client in this tiny window of time. // It is possible to have a disconnected client in this tiny window of time.
func checkPortAvailability(port string) (err error) { func checkPortAvailability(host, port string) (err error) {
// Return true if err is "address already in use" error. // Return true if err is "address already in use" error.
isAddrInUseErr := func(err error) (b bool) { isAddrInUseErr := func(err error) (b bool) {
if opErr, ok := err.(*net.OpError); ok { if opErr, ok := err.(*net.OpError); ok {
@ -209,7 +209,7 @@ func checkPortAvailability(port string) (err error) {
network := []string{"tcp", "tcp4", "tcp6"} network := []string{"tcp", "tcp4", "tcp6"}
for _, n := range network { for _, n := range network {
l, err := net.Listen(n, net.JoinHostPort("", port)) l, err := net.Listen(n, net.JoinHostPort(host, port))
if err == nil { if err == nil {
// As we are able to listen on this network, the port is not in use. // As we are able to listen on this network, the port is not in use.
// Close the listener and continue check other networks. // Close the listener and continue check other networks.

@ -206,11 +206,13 @@ func TestCheckPortAvailability(t *testing.T) {
defer listener.Close() defer listener.Close()
testCases := []struct { testCases := []struct {
host string
port string port string
expectedErr error expectedErr error
}{ }{
{port, fmt.Errorf("listen tcp :%v: bind: address already in use", port)}, {"", port, fmt.Errorf("listen tcp :%v: bind: address already in use", port)},
{getFreePort(), nil}, {"127.0.0.1", port, fmt.Errorf("listen tcp 127.0.0.1:%v: bind: address already in use", port)},
{"", getFreePort(), nil},
} }
for _, testCase := range testCases { for _, testCase := range testCases {
@ -219,7 +221,7 @@ func TestCheckPortAvailability(t *testing.T) {
continue continue
} }
err := checkPortAvailability(testCase.port) err := checkPortAvailability(testCase.host, testCase.port)
if testCase.expectedErr == nil { if testCase.expectedErr == nil {
if err != nil { if err != nil {
t.Fatalf("error: expected = <nil>, got = %v", err) t.Fatalf("error: expected = <nil>, got = %v", err)

@ -176,7 +176,7 @@ func serverHandleCmdArgs(ctx *cli.Context) {
// to IPv6 address ie minio will start listening on IPv6 address whereas another // to IPv6 address ie minio will start listening on IPv6 address whereas another
// (non-)minio process is listening on IPv4 of given port. // (non-)minio process is listening on IPv4 of given port.
// To avoid this error sutiation we check for port availability. // To avoid this error sutiation we check for port availability.
logger.FatalIf(checkPortAvailability(globalMinioPort), "Unable to start the server") logger.FatalIf(checkPortAvailability(globalMinioHost, globalMinioPort), "Unable to start the server")
globalIsXL = (setupType == XLSetupType) globalIsXL = (setupType == XLSetupType)
globalIsDistXL = (setupType == DistXLSetupType) globalIsDistXL = (setupType == DistXLSetupType)

Loading…
Cancel
Save