MCPcopy Index your code
hub / github.com/coder/coder / runCoordinator

Method runCoordinator

agent/agent.go:1906–1956  ·  view source on GitHub ↗

runCoordinator runs a coordinator and returns whether a reconnect should occur.

(ctx context.Context, tClient tailnetproto.DRPCTailnetClient24, network *tailnet.Conn)

Source from the content-addressed store, hash-verified

1904// runCoordinator runs a coordinator and returns whether a reconnect
1905// should occur.
1906func (a *agent) runCoordinator(ctx context.Context, tClient tailnetproto.DRPCTailnetClient24, network *tailnet.Conn) (retErr error) {
1907 // we run the RPC on the hardCtx so that we have a chance to send the disconnect message if we
1908 // gracefully shut down.
1909 coordinate, err := tClient.Coordinate(a.hardCtx)
1910 if err != nil {
1911 return xerrors.Errorf("failed to connect to the coordinate endpoint: %w", err)
1912 }
1913 defer func() {
1914 reason, initiator := classifyCoordinatorRPCExit(ctx, retErr)
1915 a.logger.Debug(ctx, "disconnected from coordination RPC",
1916 codersdk.ConnectionDirectionServerToAgent.SlogField(),
1917 reason.SlogField(),
1918 reason.SlogExpectedField(),
1919 initiator.SlogField(),
1920 slog.Error(retErr),
1921 )
1922 }()
1923 defer func() {
1924 cErr := coordinate.Close()
1925 if cErr != nil {
1926 a.logger.Debug(ctx, "error closing Coordinate client", slog.Error(err))
1927 }
1928 }()
1929 a.logger.Info(ctx, "connected to coordination RPC")
1930
1931 // This allows the Close() routine to wait for the coordinator to gracefully disconnect.
1932 disconnected := a.setCoordDisconnected()
1933 if disconnected == nil {
1934 return nil // already closed by something else
1935 }
1936 defer close(disconnected)
1937
1938 ctrl := tailnet.NewAgentCoordinationController(a.logger, network)
1939 coordination := ctrl.New(coordinate)
1940
1941 errCh := make(chan error, 1)
1942 go func() {
1943 defer close(errCh)
1944 select {
1945 case <-ctx.Done():
1946 err := coordination.Close(a.hardCtx)
1947 if err != nil {
1948 a.logger.Warn(ctx, "failed to close remote coordination", slog.Error(err))
1949 }
1950 return
1951 case err := <-coordination.Wait():
1952 errCh <- err
1953 }
1954 }()
1955 return <-errCh
1956}
1957
1958func (a *agent) setCoordDisconnected() chan struct{} {
1959 a.closeMutex.Lock()

Callers 1

runMethod · 0.95

Calls 13

setCoordDisconnectedMethod · 0.95
SlogExpectedFieldMethod · 0.80
CoordinateMethod · 0.65
CloseMethod · 0.65
NewMethod · 0.65
WaitMethod · 0.65
ErrorfMethod · 0.45
SlogFieldMethod · 0.45
ErrorMethod · 0.45
InfoMethod · 0.45

Tested by

no test coverage detected