From: kenzok8 Date: 2026-09-23 Subject: [PATCH] daed: bound startup network wait on new wing Return an error after 60 seconds and retry on the next generation. --- diff --git a/dae/run.go b/dae/run.go index 7c9a5cc..7f00748 100644 --- a/dae/run.go +++ b/dae/run.go @@ -19,6 +19,7 @@ import ( "github.com/daeuniverse/dae/control" "github.com/daeuniverse/dae/pkg/config_parser" "github.com/daeuniverse/dae/pkg/logger" + "github.com/daeuniverse/outbound/netproxy" "github.com/daeuniverse/outbound/protocol/direct" "github.com/mohae/deepcopy" "github.com/sirupsen/logrus" @@ -43,7 +44,8 @@ var EmptyConfig *daeConfig.Config // active is the generation currently serving traffic. It is nil before the // first generation is ready and while a reload has retired the old one. var active atomic.Pointer[control.ControlPlane] -var onceWaitingNetwork sync.Once +var waitingNetworkMu sync.Mutex +var networkReady bool func init() { sections, err := config_parser.Parse(`global{} routing{}`) @@ -64,6 +66,19 @@ func ControlPlane() (*control.ControlPlane, error) { return c, nil } +func waitForNetwork(log *logrus.Logger, directDialer netproxy.Dialer) error { + waitingNetworkMu.Lock() + defer waitingNetworkMu.Unlock() + if networkReady { + return nil + } + if err := WaitForNetwork(log, directDialer); err != nil { + return err + } + networkReady = true + return nil +} + // generation is one control plane with its listener. retired is set before // the plane is torn down so a Serve error from a plane that is being replaced // is not mistaken for the active datapath dying. @@ -345,9 +360,9 @@ func newControlPlane(log *logrus.Logger, dnsCache map[string]*control.DnsCache, if !conf.Global.DisableWaitingNetwork && len(conf.Global.WanInterface) > 0 { // Wait for network for WAN ready. - onceWaitingNetwork.Do(func() { - WaitForNetwork(log, directDialers.Symmetric) - }) + if err = waitForNetwork(log, directDialers.Symmetric); err != nil { + return nil, err + } } /// Get subscription -> nodeList mapping. diff --git a/dae/utils.go b/dae/utils.go index 2b4f6bf..93efb7e 100644 --- a/dae/utils.go +++ b/dae/utils.go @@ -94,8 +94,9 @@ func preprocessWanInterfaceAuto(params *daeConfig.Config) error { return nil } -func WaitForNetwork(log *logrus.Logger, directDialer netproxy.Dialer) { +func WaitForNetwork(log *logrus.Logger, directDialer netproxy.Dialer) error { epo := 5 * time.Second + deadline := time.Now().Add(60 * time.Second) client := http.Client{ Transport: &http.Transport{ DialContext: func(ctx context.Context, network, addr string) (c net.Conn, err error) { @@ -114,6 +115,9 @@ func WaitForNetwork(log *logrus.Logger, directDialer netproxy.Dialer) { } log.Infoln("Waiting for network...") for i := 0; ; i++ { + if time.Now().After(deadline) { + return fmt.Errorf("network unavailable after 60 seconds") + } resp, err := client.Get(cmd.CheckNetworkLinks[i%len(cmd.CheckNetworkLinks)]) if err != nil { log.Debugln("CheckNetwork:", err) @@ -133,4 +137,5 @@ func WaitForNetwork(log *logrus.Logger, directDialer netproxy.Dialer) { time.Sleep(epo) } log.Infoln("Network online.") + return nil }