Merge pull request #14585 from tjungblu/testport

Test port allocating using net.Listen
This commit is contained in:
Marek Siarkowicz 2022-10-14 10:00:40 +02:00 committed by GitHub
commit a861bfed03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 15 deletions

View File

@ -83,9 +83,8 @@ const (
var ( var (
ElectionTicks = 10 ElectionTicks = 10
// LocalListenCount integration test uses unique ports, counting up, to listen for each // UniqueCount integration test is used to set unique member ids
// member, ensuring restarted members can listen on the same port again. UniqueCount = int32(0)
LocalListenCount = int32(0)
TestTLSInfo = transport.TLSInfo{ TestTLSInfo = transport.TLSInfo{
KeyFile: MustAbsPath("../fixtures/server.key.insecure"), KeyFile: MustAbsPath("../fixtures/server.key.insecure"),
@ -258,6 +257,7 @@ func (c *Cluster) ProtoMembers() []*pb.Member {
func (c *Cluster) mustNewMember(t testutil.TB) *Member { func (c *Cluster) mustNewMember(t testutil.TB) *Member {
memberNumber := c.LastMemberNum memberNumber := c.LastMemberNum
c.LastMemberNum++ c.LastMemberNum++
m := MustNewMember(t, m := MustNewMember(t,
MemberConfig{ MemberConfig{
Name: fmt.Sprintf("m%v", memberNumber), Name: fmt.Sprintf("m%v", memberNumber),
@ -369,6 +369,7 @@ func (c *Cluster) RemoveMember(t testutil.TB, cc *clientv3.Client, id uint64) er
} }
} }
} }
c.Members = newMembers c.Members = newMembers
c.WaitMembersMatch(t, c.ProtoMembers()) c.WaitMembersMatch(t, c.ProtoMembers())
return nil return nil
@ -524,7 +525,7 @@ func isMembersEqual(membs []*pb.Member, wmembs []*pb.Member) bool {
} }
func NewLocalListener(t testutil.TB) net.Listener { func NewLocalListener(t testutil.TB) net.Listener {
c := atomic.AddInt32(&LocalListenCount, 1) c := atomic.AddInt32(&UniqueCount, 1)
// Go 1.8+ allows only numbers in port // Go 1.8+ allows only numbers in port
addr := fmt.Sprintf("127.0.0.1:%05d%05d", c+BasePort, os.Getpid()) addr := fmt.Sprintf("127.0.0.1:%05d%05d", c+BasePort, os.Getpid())
return NewListenerWithAddr(t, addr) return NewListenerWithAddr(t, addr)
@ -543,6 +544,7 @@ type Member struct {
config.ServerConfig config.ServerConfig
UniqNumber int UniqNumber int
MemberNumber int MemberNumber int
Port string
PeerListeners, ClientListeners []net.Listener PeerListeners, ClientListeners []net.Listener
GrpcListener net.Listener GrpcListener net.Listener
// PeerTLSInfo enables peer TLS when set // PeerTLSInfo enables peer TLS when set
@ -616,7 +618,7 @@ func MustNewMember(t testutil.TB, mcfg MemberConfig) *Member {
var err error var err error
m := &Member{ m := &Member{
MemberNumber: mcfg.MemberNumber, MemberNumber: mcfg.MemberNumber,
UniqNumber: int(atomic.AddInt32(&LocalListenCount, 1)), UniqNumber: int(atomic.AddInt32(&UniqueCount, 1)),
} }
peerScheme := SchemeFromTLSInfo(mcfg.PeerTLS) peerScheme := SchemeFromTLSInfo(mcfg.PeerTLS)
@ -751,7 +753,7 @@ func memberLogger(t testutil.TB, name string) *zap.Logger {
func (m *Member) listenGRPC() error { func (m *Member) listenGRPC() error {
// prefix with localhost so cert has right domain // prefix with localhost so cert has right domain
network, host, port := m.grpcAddr() network, host, port := m.grpcAddr()
grpcAddr := host + ":" + port grpcAddr := net.JoinHostPort(host, port)
wd, err := os.Getwd() wd, err := os.Getwd()
if err != nil { if err != nil {
return err return err
@ -761,7 +763,17 @@ func (m *Member) listenGRPC() error {
if err != nil { if err != nil {
return fmt.Errorf("listen failed on grpc socket %s (%v)", grpcAddr, err) return fmt.Errorf("listen failed on grpc socket %s (%v)", grpcAddr, err)
} }
m.GrpcURL = fmt.Sprintf("%s://%s", m.clientScheme(), grpcAddr)
addr := grpcListener.Addr().String()
host, port, err = net.SplitHostPort(addr)
if err != nil {
return fmt.Errorf("failed to parse grpc listen port from address %s (%v)", addr, err)
}
m.Port = port
m.GrpcURL = fmt.Sprintf("%s://%s", m.clientScheme(), addr)
m.Logger.Info("LISTEN GRPC SUCCESS", zap.String("grpcAddr", m.GrpcURL), zap.String("m.Name", m.Name),
zap.String("workdir", wd), zap.String("port", m.Port))
if m.UseBridge { if m.UseBridge {
_, err = m.addBridge() _, err = m.addBridge()
if err != nil { if err != nil {
@ -790,8 +802,12 @@ func (m *Member) clientScheme() string {
func (m *Member) addBridge() (*bridge, error) { func (m *Member) addBridge() (*bridge, error) {
network, host, port := m.grpcAddr() network, host, port := m.grpcAddr()
grpcAddr := host + ":" + port grpcAddr := net.JoinHostPort(host, m.Port)
bridgeAddr := grpcAddr + "0" bridgePort := fmt.Sprintf("%s%s", port, "0")
if m.UseTCP {
bridgePort = "0"
}
bridgeAddr := net.JoinHostPort(host, bridgePort)
m.Logger.Info("LISTEN BRIDGE", zap.String("grpc-address", bridgeAddr), zap.String("member", m.Name)) m.Logger.Info("LISTEN BRIDGE", zap.String("grpc-address", bridgeAddr), zap.String("member", m.Name))
bridgeListener, err := transport.NewUnixListener(bridgeAddr) bridgeListener, err := transport.NewUnixListener(bridgeAddr)
if err != nil { if err != nil {
@ -802,7 +818,9 @@ func (m *Member) addBridge() (*bridge, error) {
bridgeListener.Close() bridgeListener.Close()
return nil, err return nil, err
} }
m.GrpcURL = m.clientScheme() + "://" + bridgeAddr addr := bridgeListener.Addr().String()
m.Logger.Info("LISTEN BRIDGE SUCCESS", zap.String("grpc-address", addr), zap.String("member", m.Name))
m.GrpcURL = m.clientScheme() + "://" + addr
return m.GrpcBridge, nil return m.GrpcBridge, nil
} }
@ -823,15 +841,21 @@ func (m *Member) grpcAddr() (network, host, port string) {
if m.UseTCP { if m.UseTCP {
network = "tcp" network = "tcp"
} }
if m.Port != "" {
return network, host, m.Port
}
port = m.Name port = m.Name
if m.UseTCP { if m.UseTCP {
port = fmt.Sprintf("%d", GrpcPortNumber(m.UniqNumber, m.MemberNumber)) // let net.Listen choose the port automatically
port = fmt.Sprintf("%d", 0)
} }
return network, host, port return network, host, port
} }
func GrpcPortNumber(uniqNumber, memberNumber int) int { func (m *Member) GrpcPortNumber() string {
return BaseGRPCPort + uniqNumber*10 + memberNumber return m.Port
} }
type dialer struct { type dialer struct {

View File

@ -146,7 +146,7 @@ func templateEndpoints(t *testing.T, pattern string, clus *integration.Cluster)
var endpoints []string var endpoints []string
for _, m := range clus.Members { for _, m := range clus.Members {
ent := pattern ent := pattern
ent = strings.Replace(ent, "${MEMBER_PORT}", fmt.Sprintf("%d", integration.GrpcPortNumber(m.UniqNumber, m.MemberNumber)), -1) ent = strings.Replace(ent, "${MEMBER_PORT}", m.GrpcPortNumber(), -1)
ent = strings.Replace(ent, "${MEMBER_NAME}", m.Name, -1) ent = strings.Replace(ent, "${MEMBER_NAME}", m.Name, -1)
endpoints = append(endpoints, ent) endpoints = append(endpoints, ent)
} }
@ -156,7 +156,7 @@ func templateEndpoints(t *testing.T, pattern string, clus *integration.Cluster)
func templateAuthority(t *testing.T, pattern string, m *integration.Member) string { func templateAuthority(t *testing.T, pattern string, m *integration.Member) string {
t.Helper() t.Helper()
authority := pattern authority := pattern
authority = strings.Replace(authority, "${MEMBER_PORT}", fmt.Sprintf("%d", integration.GrpcPortNumber(m.UniqNumber, m.MemberNumber)), -1) authority = strings.Replace(authority, "${MEMBER_PORT}", m.GrpcPortNumber(), -1)
authority = strings.Replace(authority, "${MEMBER_NAME}", m.Name, -1) authority = strings.Replace(authority, "${MEMBER_NAME}", m.Name, -1)
return authority return authority
} }