mirror of
https://github.com/minio/minio.git
synced 2025-01-26 14:13:16 -05:00
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
This commit is contained in:
parent
61229b38f7
commit
48cb271a46
@ -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…
x
Reference in New Issue
Block a user