func (n *Node) initManagerConnection(ctx context.Context, ready chan<- struct{}) error { opts := []grpc.DialOption{} insecureCreds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) opts = append(opts, grpc.WithTransportCredentials(insecureCreds)) // Using listen address instead of advertised address because this is a // local connection. addr := n.config.ListenControlAPI opts = append(opts, grpc.WithDialer( func(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout("unix", addr, timeout) })) conn, err := grpc.Dial(addr, opts...) if err != nil { return err } client := api.NewHealthClient(conn) for { resp, err := client.Check(ctx, &api.HealthCheckRequest{Service: "ControlAPI"}) if err != nil { return err } if resp.Status == api.HealthCheckResponse_SERVING { break } time.Sleep(500 * time.Millisecond) } n.setControlSocket(conn) if ready != nil { close(ready) } return nil }
// checkHealth tries to contact an aspiring member through its advertised address // and checks if its raft server is running. func (n *Node) checkHealth(ctx context.Context, addr string, timeout time.Duration) error { conn, err := dial(addr, "tcp", n.tlsCredentials, timeout) if err != nil { return err } if timeout != 0 { tctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() ctx = tctx } client := api.NewHealthClient(conn) defer conn.Close() resp, err := client.Check(ctx, &api.HealthCheckRequest{Service: "Raft"}) if err != nil { return ErrHealthCheckFailure } if resp != nil && resp.Status != api.HealthCheckResponse_SERVING { return ErrHealthCheckFailure } return nil }
func healthCheckConn(ctx context.Context, cc *grpc.ClientConn) error { resp, err := api.NewHealthClient(cc).Check(ctx, &api.HealthCheckRequest{Service: "Raft"}) if err != nil { return errors.Wrap(err, "failed to check health") } if resp.Status != api.HealthCheckResponse_SERVING { return errors.Errorf("health check returned status %s", resp.Status) } return nil }
// HealthCheck sends a health check RPC to the member and returns the response. func (member *Member) HealthCheck(ctx context.Context) error { healthClient := api.NewHealthClient(member.Conn) resp, err := healthClient.Check(ctx, &api.HealthCheckRequest{Service: "Raft"}) if err != nil { return err } if resp.Status != api.HealthCheckResponse_SERVING { return fmt.Errorf("health check returned status %s", resp.Status.String()) } return nil }