Launch starts a member based on ServerConfig, PeerListeners and ClientListeners.
()
| 960 | // Launch starts a member based on ServerConfig, PeerListeners |
| 961 | // and ClientListeners. |
| 962 | func (m *Member) Launch() error { |
| 963 | m.Logger.Info( |
| 964 | "launching a member", |
| 965 | zap.String("name", m.Name), |
| 966 | zap.Strings("advertise-peer-urls", m.PeerURLs.StringSlice()), |
| 967 | zap.Strings("listen-client-urls", m.ClientURLs.StringSlice()), |
| 968 | zap.String("grpc-url", m.GRPCURL), |
| 969 | ) |
| 970 | var err error |
| 971 | if m.Server, err = etcdserver.NewServer(m.ServerConfig); err != nil { |
| 972 | return fmt.Errorf("failed to initialize the etcd server: %w", err) |
| 973 | } |
| 974 | m.Server.SyncTicker = time.NewTicker(500 * time.Millisecond) |
| 975 | m.Server.Start() |
| 976 | |
| 977 | var peerTLScfg *tls.Config |
| 978 | if m.PeerTLSInfo != nil && !m.PeerTLSInfo.Empty() { |
| 979 | if peerTLScfg, err = m.PeerTLSInfo.ServerConfig(); err != nil { |
| 980 | return err |
| 981 | } |
| 982 | } |
| 983 | |
| 984 | if m.GRPCListener != nil { |
| 985 | var tlscfg *tls.Config |
| 986 | if m.ClientTLSInfo != nil && !m.ClientTLSInfo.Empty() { |
| 987 | tlscfg, err = m.ClientTLSInfo.ServerConfig() |
| 988 | if err != nil { |
| 989 | return err |
| 990 | } |
| 991 | } |
| 992 | m.GRPCServer = v3rpc.Server(m.Server, tlscfg, m.GRPCServerRecorder.UnaryInterceptor(), m.GRPCServerOpts...) |
| 993 | m.ServerClient = v3client.New(m.Server) |
| 994 | lockpb.RegisterLockServer(m.GRPCServer, v3lock.NewLockServer(m.ServerClient)) |
| 995 | epb.RegisterElectionServer(m.GRPCServer, v3election.NewElectionServer(m.ServerClient)) |
| 996 | go m.GRPCServer.Serve(m.GRPCListener) |
| 997 | } |
| 998 | |
| 999 | m.RaftHandler = &testutil.PauseableHandler{Next: etcdhttp.NewPeerHandler(m.Logger, m.Server)} |
| 1000 | |
| 1001 | h := (http.Handler)(m.RaftHandler) |
| 1002 | if m.GRPCListener != nil { |
| 1003 | h = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 1004 | m.RaftHandler.ServeHTTP(w, r) |
| 1005 | }) |
| 1006 | } |
| 1007 | |
| 1008 | for _, ln := range m.PeerListeners { |
| 1009 | cm := cmux.New(ln) |
| 1010 | // don't hang on matcher after closing listener |
| 1011 | cm.SetReadTimeout(time.Second) |
| 1012 | |
| 1013 | // serve http1/http2 rafthttp/grpc |
| 1014 | ll := cm.Match(cmux.Any()) |
| 1015 | if peerTLScfg != nil { |
| 1016 | if ll, err = transport.NewTLSListener(ll, m.PeerTLSInfo); err != nil { |
| 1017 | return err |
| 1018 | } |
| 1019 | } |