From b83893bad75574a02c7bdb011e58b934a9175e20 Mon Sep 17 00:00:00 2001 From: JackDoan Date: Tue, 14 Jul 2026 11:38:43 -0500 Subject: [PATCH] re-align to master --- cmd/nebula-service/main.go | 5 ++--- cmd/nebula-service/service.go | 5 ++--- cmd/nebula/main.go | 5 ++--- control.go | 16 +++++++--------- control_lifecycle_test.go | 18 ++++++++---------- service/service.go | 4 ++-- 6 files changed, 23 insertions(+), 30 deletions(-) diff --git a/cmd/nebula-service/main.go b/cmd/nebula-service/main.go index a1cec03a..e0b335f5 100644 --- a/cmd/nebula-service/main.go +++ b/cmd/nebula-service/main.go @@ -98,15 +98,14 @@ func main() { } if !*configTest { - wait, err := ctrl.Start() - if err != nil { + if err := ctrl.Start(); err != nil { util.LogWithContextIfNeeded("Error while running", err, l) os.Exit(1) } go ctrl.ShutdownBlock() - if err := wait(); err != nil { + if err := ctrl.Wait(); err != nil { l.Error("Nebula stopped due to fatal error", "error", err) os.Exit(2) } diff --git a/cmd/nebula-service/service.go b/cmd/nebula-service/service.go index a70c4bde..abe9abe0 100644 --- a/cmd/nebula-service/service.go +++ b/cmd/nebula-service/service.go @@ -45,14 +45,13 @@ func (p *program) Start(s service.Service) error { return err } - wait, err := p.control.Start() - if err != nil { + if err := p.control.Start(); err != nil { return err } // Nebula can stop itself on a fatal packet reader error, make sure to log it if it happens. go func() { - if err := wait(); err != nil { + if err := p.control.Wait(); err != nil { logger.Error(fmt.Sprintf("Nebula stopped due to fatal error: %v", err)) os.Exit(2) } diff --git a/cmd/nebula/main.go b/cmd/nebula/main.go index 219519c2..3c786b84 100644 --- a/cmd/nebula/main.go +++ b/cmd/nebula/main.go @@ -84,8 +84,7 @@ func main() { } if !*configTest { - wait, err := ctrl.Start() - if err != nil { + if err := ctrl.Start(); err != nil { util.LogWithContextIfNeeded("Error while running", err, l) os.Exit(1) } @@ -93,7 +92,7 @@ func main() { go ctrl.ShutdownBlock() notifyReady(l) - if err := wait(); err != nil { + if err := ctrl.Wait(); err != nil { l.Error("Nebula stopped due to fatal error", "error", err) os.Exit(2) } diff --git a/control.go b/control.go index 94ebf14e..a79ebbfa 100644 --- a/control.go +++ b/control.go @@ -69,21 +69,19 @@ type ControlHostInfo struct { } // Start actually runs nebula, this is a nonblocking call. -// The returned function blocks until nebula has fully stopped and reports the -// fatal reader error (nil on a clean shutdown). Calling it is equivalent to -// calling Wait. -func (c *Control) Start() (func() error, error) { +// Use Wait to block until nebula has fully stopped and to learn whether a fatal reader error caused the shutdown. +func (c *Control) Start() error { c.stateLock.Lock() defer c.stateLock.Unlock() switch c.state { case StateReady: //yay! case StateStopped, StateStopping: - return nil, ErrAlreadyStopped + return ErrAlreadyStopped case StateStarted: - return nil, ErrAlreadyStarted + return ErrAlreadyStarted default: - return nil, ErrUnknownState + return ErrUnknownState } // Activate the interface @@ -93,7 +91,7 @@ func (c *Control) Start() (func() error, error) { c.cancel() _ = c.f.Close() c.state = StateStopped - return nil, err + return err } // Call all the delayed funcs that waited patiently for the interface to be created. @@ -118,7 +116,7 @@ func (c *Control) Start() (func() error, error) { // Start reading packets. c.f.run() c.state = StateStarted - return c.Wait, nil + return nil } func (c *Control) State() RunState { diff --git a/control_lifecycle_test.go b/control_lifecycle_test.go index 3e942cb6..67cae925 100644 --- a/control_lifecycle_test.go +++ b/control_lifecycle_test.go @@ -109,7 +109,7 @@ func TestControl_StopBeforeStart(t *testing.T) { require.NoError(t, c.Wait()) // A stopped control can never be started - _, err := c.Start() + err := c.Start() require.ErrorIs(t, err, ErrAlreadyStopped) // A second Stop is a harmless no-op @@ -192,7 +192,7 @@ func TestControl_StartMultiqueueFailureReleases(t *testing.T) { } // The second reader fails to open, everything must be released - _, err := c.Start() + err := c.Start() require.Error(t, err) assert.Equal(t, StateStopped, c.State()) assert.True(t, dev.closed, "the tun device should have been closed") @@ -250,7 +250,7 @@ func TestControl_ConcurrentStopAndStart(t *testing.T) { for i := 0; i < 2; i++ { wg.Go(func() { c.Stop() }) } - wg.Go(func() { _, _ = c.Start() }) + wg.Go(func() { _ = c.Start() }) wg.Go(func() { _ = c.Wait() // A returned Wait must always observe the final state, no matter how @@ -263,18 +263,17 @@ func TestControl_ConcurrentStopAndStart(t *testing.T) { // panic and Wait must observe the final state require.NoError(t, c.Wait()) assert.Equal(t, StateStopped, c.State()) - _, err := c.Start() + err := c.Start() require.ErrorIs(t, err, ErrAlreadyStopped) } func TestControl_StartStopLifecycle(t *testing.T) { c, dev, conn := newReadyControl(t) - wait, err := c.Start() + err := c.Start() require.NoError(t, err) - require.NotNil(t, wait, "a successful Start must return a block function") assert.Equal(t, StateStarted, c.State()) - _, err = c.Start() + err = c.Start() require.ErrorIs(t, err, ErrAlreadyStarted) // Stop must unpark the reader blocked in the device and release everything @@ -286,7 +285,7 @@ func TestControl_StartStopLifecycle(t *testing.T) { // The reader drained off a closed device, that is not a fatal error require.NoError(t, c.Wait()) - _, err = c.Start() + err = c.Start() require.ErrorIs(t, err, ErrAlreadyStopped) } @@ -297,9 +296,8 @@ func TestControl_RebindIsGatedByState(t *testing.T) { c.RebindUDPServer() assert.Equal(t, 0, conn.rebinds, "rebind before start must be a no-op") - wait, err := c.Start() + err := c.Start() require.NoError(t, err) - require.NotNil(t, wait, "a successful Start must return a block function") c.RebindUDPServer() assert.Equal(t, 1, conn.rebinds, "rebind while started must reach the conn") diff --git a/service/service.go b/service/service.go index b012b7cd..6610800d 100644 --- a/service/service.go +++ b/service/service.go @@ -50,7 +50,7 @@ func New(control *nebula.Control) (_ *Service, reterr error) { return nil, errors.New("must be using user device") } - wait, err := control.Start() + err := control.Start() if err != nil { return nil, err } @@ -155,7 +155,7 @@ func New(control *nebula.Control) (_ *Service, reterr error) { // Add the nebula wait function to the group so a fatal reader error // propagates out through errgroup.Wait(). eg.Go(func() error { - return wait() + return control.Wait() }) return &s, nil