func()

in store/engine/raft/node.go [178:223]


func (n *Node) runTransport() error {
	logger := logger.Get()
	idString := fmt.Sprintf("%d", n.config.ID)
	transport := &rafthttp.Transport{
		ID:          types.ID(n.config.ID),
		Logger:      logger,
		ClusterID:   0x6666,
		Raft:        n,
		LeaderStats: stats.NewLeaderStats(logger, idString),
		ServerStats: stats.NewServerStats("raft", idString),
		ErrorC:      make(chan error),
	}
	if err := transport.Start(); err != nil {
		return fmt.Errorf("unable to start transport: %w", err)
	}
	for i, peer := range n.config.Peers {
		// Don't add self to transport
		if uint64(i+1) != n.config.ID {
			transport.AddPeer(types.ID(i+1), []string{peer})
		}
		n.peers.Store(uint64(i+1), peer)
	}

	n.addr = n.config.Peers[n.config.ID-1]
	url, err := url.Parse(n.addr)
	if err != nil {
		return err
	}
	httpServer := &http.Server{
		Addr:    url.Host,
		Handler: transport.Handler(),
	}

	n.wg.Add(1)
	go func() {
		defer n.wg.Done()
		if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			n.logger.Fatal("Unable to start http server", zap.Error(err))
			os.Exit(1)
		}
	}()

	n.transport = transport
	n.httpServer = httpServer
	return nil
}