treat all localhost endpoints as local setup with same port (#18784)

fixes #18783 and avoids user mistakes
This commit is contained in:
Harshavardhana 2024-01-12 23:53:03 -08:00 committed by GitHub
parent b2b26d9c95
commit 993d96feef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 40 deletions

View File

@ -103,7 +103,7 @@ func (endpoint Endpoint) GridHost() string {
// UpdateIsLocal - resolves the host and updates if it is local or not. // UpdateIsLocal - resolves the host and updates if it is local or not.
func (endpoint *Endpoint) UpdateIsLocal() (err error) { func (endpoint *Endpoint) UpdateIsLocal() (err error) {
if !endpoint.IsLocal { if endpoint.Host != "" {
endpoint.IsLocal, err = isLocalHost(endpoint.Hostname(), endpoint.Port(), globalMinioPort) endpoint.IsLocal, err = isLocalHost(endpoint.Hostname(), endpoint.Port(), globalMinioPort)
if err != nil { if err != nil {
return err return err
@ -522,6 +522,16 @@ func (endpoints Endpoints) UpdateIsLocal() error {
continue continue
} }
if endpoints[i].Host == "" {
resolvedList[i] = true
endpoints[i].IsLocal = true
epsResolved++
if !foundLocal {
foundLocal = true
}
continue
}
// Log the message to console about the host resolving // Log the message to console about the host resolving
reqInfo := (&logger.ReqInfo{}).AppendTags( reqInfo := (&logger.ReqInfo{}).AppendTags(
"host", "host",
@ -705,6 +715,17 @@ func (p PoolEndpointList) UpdateIsLocal() error {
continue continue
} }
if endpoint.Host == "" {
if !foundLocal {
foundLocal = true
}
endpoint.IsLocal = true
endpoints[j] = endpoint
epsResolved++
resolvedList[endpoint] = true
continue
}
// Log the message to console about the host resolving // Log the message to console about the host resolving
reqInfo := (&logger.ReqInfo{}).AppendTags( reqInfo := (&logger.ReqInfo{}).AppendTags(
"host", "host",
@ -859,6 +880,8 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
return poolEndpoints, setupType, nil return poolEndpoints, setupType, nil
} }
uniqueArgs := set.NewStringSet()
for poolIdx, pool := range poolsLayout { for poolIdx, pool := range poolsLayout {
var endpoints Endpoints var endpoints Endpoints
for setIdx, setLayout := range pool.layout { for setIdx, setLayout := range pool.layout {
@ -889,26 +912,10 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
poolEndpoints[poolIdx] = endpoints poolEndpoints[poolIdx] = endpoints
} }
for _, endpoints := range poolEndpoints {
// Return Erasure setup when all endpoints are path style.
if endpoints[0].Type() == PathEndpointType {
setupType = ErasureSetupType
}
if endpoints[0].Type() == URLEndpointType && setupType != DistErasureSetupType {
setupType = DistErasureSetupType
}
}
if setupType == ErasureSetupType {
return poolEndpoints, setupType, nil
}
if err := poolEndpoints.UpdateIsLocal(); err != nil { if err := poolEndpoints.UpdateIsLocal(); err != nil {
return nil, setupType, config.ErrInvalidErasureEndpoints(nil).Msg(err.Error()) return nil, setupType, config.ErrInvalidErasureEndpoints(nil).Msg(err.Error())
} }
uniqueArgs := set.NewStringSet()
for i, endpoints := range poolEndpoints { for i, endpoints := range poolEndpoints {
// Here all endpoints are URL style. // Here all endpoints are URL style.
endpointPathSet := set.NewStringSet() endpointPathSet := set.NewStringSet()
@ -918,7 +925,7 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
endpointPathSet.Add(endpoint.Path) endpointPathSet.Add(endpoint.Path)
if endpoint.IsLocal { if endpoint.IsLocal && endpoint.Host != "" {
localServerHostSet.Add(endpoint.Hostname()) localServerHostSet.Add(endpoint.Hostname())
_, port, err := net.SplitHostPort(endpoint.Host) _, port, err := net.SplitHostPort(endpoint.Host)
@ -934,9 +941,8 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
orchestrated := IsKubernetes() || IsDocker() orchestrated := IsKubernetes() || IsDocker()
reverseProxy := (env.Get("_MINIO_REVERSE_PROXY", "") != "") && ((env.Get("MINIO_CI_CD", "") != "") || (env.Get("CI", "") != "")) reverseProxy := (env.Get("_MINIO_REVERSE_PROXY", "") != "") && ((env.Get("MINIO_CI_CD", "") != "") || (env.Get("CI", "") != ""))
// If not orchestrated // If not orchestrated
if !orchestrated && // and not setup in reverse proxy
// and not setup in reverse proxy if !orchestrated && !reverseProxy {
!reverseProxy {
// Check whether same path is not used in endpoints of a host on different port. // Check whether same path is not used in endpoints of a host on different port.
// Only verify this on baremetal setups, DNS is not available in orchestrated // Only verify this on baremetal setups, DNS is not available in orchestrated
// environments so we can't do much here. // environments so we can't do much here.
@ -944,14 +950,18 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
hostIPCache := make(map[string]set.StringSet) hostIPCache := make(map[string]set.StringSet)
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
host := endpoint.Hostname() host := endpoint.Hostname()
hostIPSet, ok := hostIPCache[host] var hostIPSet set.StringSet
if !ok { if host != "" {
var err error var ok bool
hostIPSet, err = getHostIP(host) hostIPSet, ok = hostIPCache[host]
if err != nil { if !ok {
return nil, setupType, config.ErrInvalidErasureEndpoints(nil).Msg(fmt.Sprintf("host '%s' cannot resolve: %s", host, err)) var err error
hostIPSet, err = getHostIP(host)
if err != nil {
return nil, setupType, config.ErrInvalidErasureEndpoints(nil).Msg(fmt.Sprintf("host '%s' cannot resolve: %s", host, err))
}
hostIPCache[host] = hostIPSet
} }
hostIPCache[host] = hostIPSet
} }
if IPSet, ok := pathIPMap[endpoint.Path]; ok { if IPSet, ok := pathIPMap[endpoint.Path]; ok {
if !IPSet.Intersection(hostIPSet).IsEmpty() { if !IPSet.Intersection(hostIPSet).IsEmpty() {
@ -982,12 +992,14 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
// Add missing port in all endpoints. // Add missing port in all endpoints.
for i := range endpoints { for i := range endpoints {
_, port, err := net.SplitHostPort(endpoints[i].Host) if endpoints[i].Host != "" {
if err != nil { _, port, err := net.SplitHostPort(endpoints[i].Host)
endpoints[i].Host = net.JoinHostPort(endpoints[i].Host, serverAddrPort) if err != nil {
} else if endpoints[i].IsLocal && serverAddrPort != port { endpoints[i].Host = net.JoinHostPort(endpoints[i].Host, serverAddrPort)
// If endpoint is local, but port is different than serverAddrPort, then make it as remote. } else if endpoints[i].IsLocal && serverAddrPort != port {
endpoints[i].IsLocal = false // If endpoint is local, but port is different than serverAddrPort, then make it as remote.
endpoints[i].IsLocal = false
}
} }
} }
@ -1006,10 +1018,12 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
// This means it is DistErasure setup. // This means it is DistErasure setup.
} }
poolEndpoints[i] = endpoints
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
uniqueArgs.Add(endpoint.Host) if endpoint.Host != "" {
uniqueArgs.Add(endpoint.Host)
} else {
uniqueArgs.Add(net.JoinHostPort("localhost", serverAddrPort))
}
} }
poolEndpoints[i] = endpoints poolEndpoints[i] = endpoints
@ -1020,13 +1034,21 @@ func CreatePoolEndpoints(serverAddr string, poolsLayout ...poolDisksLayout) ([]E
updateDomainIPs(uniqueArgs) updateDomainIPs(uniqueArgs)
} }
erasureType := len(uniqueArgs.ToSlice()) == 1
for _, endpoints := range poolEndpoints { for _, endpoints := range poolEndpoints {
// Return Erasure setup when all endpoints are path style. // Return Erasure setup when all endpoints are path style.
if endpoints[0].Type() == PathEndpointType { if endpoints[0].Type() == PathEndpointType {
setupType = ErasureSetupType setupType = ErasureSetupType
break
} }
if endpoints[0].Type() == URLEndpointType && setupType != DistErasureSetupType { if endpoints[0].Type() == URLEndpointType {
setupType = DistErasureSetupType if erasureType {
setupType = ErasureSetupType
} else {
setupType = DistErasureSetupType
}
break
} }
} }

View File

@ -258,7 +258,7 @@ func TestCreateEndpoints(t *testing.T) {
Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d2"}, IsLocal: true}, Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d2"}, IsLocal: true},
Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d3"}, IsLocal: true}, Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d3"}, IsLocal: true},
Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d4"}, IsLocal: true}, Endpoint{URL: &url.URL{Scheme: "http", Host: "localhost:9000", Path: "/d4"}, IsLocal: true},
}, DistErasureSetupType, nil}, }, ErasureSetupType, nil},
// DistErasure Setup with URLEndpointType having mixed naming to local host. // DistErasure Setup with URLEndpointType having mixed naming to local host.
{"127.0.0.1:10000", []string{"http://localhost/d1", "http://localhost/d2", "http://127.0.0.1/d3", "http://127.0.0.1/d4"}, "", Endpoints{}, -1, fmt.Errorf("all local endpoints should not have different hostnames/ips")}, {"127.0.0.1:10000", []string{"http://localhost/d1", "http://localhost/d2", "http://127.0.0.1/d3", "http://127.0.0.1/d4"}, "", Endpoints{}, -1, fmt.Errorf("all local endpoints should not have different hostnames/ips")},