diff --git a/cmd/endpoint.go b/cmd/endpoint.go index c7c396cc3..2dbc063b8 100644 --- a/cmd/endpoint.go +++ b/cmd/endpoint.go @@ -334,7 +334,7 @@ func CreateEndpoints(serverAddr string, args ...string) (string, EndpointList, S return serverAddr, endpoints, setupType, fmt.Errorf("no endpoint found for this host") } - // Check whether same path is not used in endpoints of a host. + // Check whether same path is not used in endpoints of a host on different port. { pathIPMap := make(map[string]set.StringSet) for _, endpoint := range endpoints { @@ -349,7 +349,6 @@ func CreateEndpoints(serverAddr string, args ...string) (string, EndpointList, S err = fmt.Errorf("path '%s' can not be served by different port on same address", endpoint.Path) return serverAddr, endpoints, setupType, err } - pathIPMap[endpoint.Path] = IPSet.Union(hostIPSet) } else { pathIPMap[endpoint.Path] = hostIPSet @@ -357,6 +356,21 @@ func CreateEndpoints(serverAddr string, args ...string) (string, EndpointList, S } } + // Check whether same path is used for more than 1 local endpoints. + { + localPathSet := set.CreateStringSet() + for _, endpoint := range endpoints { + if !endpoint.IsLocal { + continue + } + if localPathSet.Contains(endpoint.Path) { + err = fmt.Errorf("path '%s' cannot be served by different address on same server", endpoint.Path) + return serverAddr, endpoints, setupType, err + } + localPathSet.Add(endpoint.Path) + } + } + // Check whether serverAddrPort matches at least in one of port used in local endpoints. { if !localPortSet.Contains(serverAddrPort) { diff --git a/cmd/endpoint_test.go b/cmd/endpoint_test.go index a03b8d81d..e4ff0c691 100644 --- a/cmd/endpoint_test.go +++ b/cmd/endpoint_test.go @@ -257,7 +257,7 @@ func TestCreateEndpoints(t *testing.T) { Endpoint{URL: &url.URL{Path: "/d4"}, IsLocal: true}, }, XLSetupType, nil}, {":9001", []string{"http://10.0.0.1:9000/export", "http://10.0.0.2:9000/export", "http://" + nonLoopBackIP + ":9001/export", "http://10.0.0.2:9001/export"}, "", EndpointList{}, -1, fmt.Errorf("path '/export' can not be served by different port on same address")}, - + {":9000", []string{"http://127.0.0.1:9000/export", "http://" + nonLoopBackIP + ":9000/export", "http://10.0.0.1:9000/export", "http://10.0.0.2:9000/export"}, "", EndpointList{}, -1, fmt.Errorf("path '/export' cannot be served by different address on same server")}, {":9000", []string{"http://localhost/d1", "http://localhost/d2", "http://example.org/d3", "http://example.com/d4"}, "", EndpointList{}, -1, fmt.Errorf("'localhost' resolves to loopback address is not allowed for distributed XL")}, // DistXL type