diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 75eeb50..7872abd 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -1598,7 +1598,7 @@ func selfCheckStatus(s service.Service) (bool, service.Status, error) { dir, err := socketDir() if err != nil { - mainLog.Load().Error().Err(err).Msg("failed to check ctrld listener status: could not get home directory") + mainLog.Load().Error().Err(err).Msg("failed to get ctrld listener status: could not get home directory") return false, status, err } mainLog.Load().Debug().Msg("waiting for ctrld listener to be ready") @@ -1607,17 +1607,6 @@ func selfCheckStatus(s service.Service) (bool, service.Status, error) { return false, status, errors.New("could not connect to control server") } - resp, err := cc.post(startedPath, nil) - if err != nil { - mainLog.Load().Error().Err(err).Msg("failed to connect to control server") - return false, status, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - mainLog.Load().Error().Msg("ctrld listener is not ready") - return false, status, errors.New("ctrld listener is not ready") - } - // Not a ctrld upstream, return status as-is. if cfg.FirstUpstream().VerifyDomain() == "" { return true, status, nil @@ -2261,6 +2250,10 @@ func removeProvTokenFromArgs(sc *service.Config) { // newSocketControlClient returns new control client after control server was started. func newSocketControlClient(s service.Service, dir string) *controlClient { + // Return early if service is not running. + if status, err := s.Status(); err != nil || status != service.StatusRunning { + return nil + } bo := backoff.NewBackoff("self-check", logf, 10*time.Second) bo.LogLongerThan = 10 * time.Second ctx := context.Background() @@ -2270,28 +2263,21 @@ func newSocketControlClient(s service.Service, dir string) *controlClient { defer timeout.Stop() // The socket control server may not start yet, so attempt to ping - // it until we got a response. For each iteration, check ctrld status - // to make sure ctrld is still running. + // it until we got a response. for { - curStatus, err := s.Status() - if err != nil { - return nil - } - if curStatus != service.StatusRunning { - return nil - } - if _, err := cc.post("/", nil); err == nil { + _, err := cc.post(startedPath, nil) + if err == nil { // Server was started, stop pinging. break } // The socket control server is not ready yet, backoff for waiting it to be ready. bo.BackOff(ctx, err) + select { case <-timeout.C: return nil default: } - continue } return cc diff --git a/cmd/cli/dns_proxy.go b/cmd/cli/dns_proxy.go index fd8a5cc..9f95812 100644 --- a/cmd/cli/dns_proxy.go +++ b/cmd/cli/dns_proxy.go @@ -210,12 +210,9 @@ func (p *prog) serveDNS(listenerNum string) error { addr := net.JoinHostPort(listenerConfig.IP, strconv.Itoa(listenerConfig.Port)) s, errCh := runDNSServer(addr, proto, handler) defer s.Shutdown() - select { - case err := <-errCh: - return err - case <-time.After(5 * time.Second): - p.started <- struct{}{} - } + + p.started <- struct{}{} + select { case <-p.stopCh: case <-ctx.Done(): diff --git a/cmd/cli/prog.go b/cmd/cli/prog.go index b3f3abf..64728a0 100644 --- a/cmd/cli/prog.go +++ b/cmd/cli/prog.go @@ -249,6 +249,13 @@ func (p *prog) run(reload bool, reloadCh chan struct{}) { numListeners := len(p.cfg.Listener) if !reload { p.started = make(chan struct{}, numListeners) + if p.cs != nil { + p.registerControlServerHandler() + if err := p.cs.start(); err != nil { + mainLog.Load().Warn().Err(err).Msg("could not start control server") + } + mainLog.Load().Debug().Msgf("control server started: %s", p.cs.addr) + } } p.onStartedDone = make(chan struct{}) p.loop = make(map[string]bool) @@ -381,12 +388,6 @@ func (p *prog) run(reload bool, reloadCh chan struct{}) { if p.logConn != nil { _ = p.logConn.Close() } - if p.cs != nil { - p.registerControlServerHandler() - if err := p.cs.start(); err != nil { - mainLog.Load().Warn().Err(err).Msg("could not start control server") - } - } } wg.Wait() }