Revert "common/daemon: add a method to reexec itself"

This reverts commit 216786d40e. We don't
really need that if we move logic to cmd package.
This commit is contained in:
Vincent Bernat
2025-09-19 07:20:49 +02:00
parent 9f34f9caf9
commit 75f6908f71
4 changed files with 4 additions and 67 deletions

View File

@@ -39,7 +39,6 @@ func StartStopComponents(r *reporter.Reporter, daemonComponent daemon.Component,
<-daemonComponent.Terminated() <-daemonComponent.Terminated()
r.Info().Msg("stopping all components") r.Info().Msg("stopping all components")
daemonComponent.FinishReexec()
return nil return nil
} }

View File

@@ -9,7 +9,6 @@ package daemon
import ( import (
"os" "os"
"os/signal" "os/signal"
"sync/atomic"
"syscall" "syscall"
"gopkg.in/tomb.v2" "gopkg.in/tomb.v2"
@@ -21,8 +20,6 @@ import (
type Component interface { type Component interface {
Start() error Start() error
Stop() error Stop() error
Reexec()
FinishReexec()
Track(t *tomb.Tomb, who string) Track(t *tomb.Tomb, who string)
// Lifecycle // Lifecycle
@@ -35,7 +32,6 @@ type Component interface {
type realComponent struct { type realComponent struct {
r *reporter.Reporter r *reporter.Reporter
tombs []tombWithOrigin tombs []tombWithOrigin
shouldReexec atomic.Bool
lifecycleComponent lifecycleComponent
} }
@@ -74,12 +70,11 @@ func (c *realComponent) Start() error {
c.Terminate() c.Terminate()
}(t) }(t)
} }
// On signal, terminate or reexec // On signal, terminate
go func() { go func() {
signals := make(chan os.Signal, 1) signals := make(chan os.Signal, 1)
signal.Notify(signals, signal.Notify(signals,
syscall.SIGINT, syscall.SIGINT, syscall.SIGTERM)
syscall.SIGTERM)
select { select {
case s := <-signals: case s := <-signals:
c.r.Debug().Stringer("signal", s).Msg("signal received") c.r.Debug().Stringer("signal", s).Msg("signal received")
@@ -102,30 +97,6 @@ func (c *realComponent) Stop() error {
return nil return nil
} }
// Reexec will reexecute the current process with the same arguments.
func (c *realComponent) Reexec() {
c.shouldReexec.Store(true)
c.Terminate()
}
// FinishReexec should be called just before exiting to trigger the real reexec.
func (c *realComponent) FinishReexec() {
if c.shouldReexec.Load() {
executable, err := os.Executable()
if err != nil {
c.r.Err(err).Msg("cannot get executable name")
return
}
env := os.Environ()
args := append([]string{executable}, os.Args[1:]...)
c.r.Info().Strs("args", args).Msg("reexec in progress")
if err := syscall.Exec(executable, args, env); err != nil {
c.r.Err(err).Msg("cannot reexec")
}
}
}
// Add a new tomb to be tracked. This is only used before Start(). // Add a new tomb to be tracked. This is only used before Start().
func (c *realComponent) Track(t *tomb.Tomb, who string) { func (c *realComponent) Track(t *tomb.Tomb, who string) {
c.tombs = append(c.tombs, tombWithOrigin{ c.tombs = append(c.tombs, tombWithOrigin{

View File

@@ -5,7 +5,6 @@ package daemon
import ( import (
"errors" "errors"
"os"
"syscall" "syscall"
"testing" "testing"
"testing/synctest" "testing/synctest"
@@ -63,28 +62,6 @@ func TestTerminateWithSignal(t *testing.T) {
} }
} }
func TestReexecWithSignal(t *testing.T) {
r := reporter.NewMock(t)
c, err := New(r)
if err != nil {
t.Fatalf("New() error:\n%+v", err)
}
helpers.StartStop(t, c)
c.Reexec()
if os.Getenv("TEST_DAEMON_REEXEC") == "1" {
// This is a way to increase a bit coverage
executable, _ := os.Executable()
os.Remove(executable)
c.FinishReexec()
return
}
os.Setenv("TEST_DAEMON_REEXEC", "1")
c.FinishReexec()
t.Fatalf("No reexec done!")
}
func TestStop(t *testing.T) { func TestStop(t *testing.T) {
r := reporter.NewMock(t) r := reporter.NewMock(t)
c, err := New(r) c, err := New(r)

View File

@@ -17,8 +17,6 @@ type MockComponent struct {
lifecycleComponent lifecycleComponent
} }
var _ Component = &MockComponent{}
// NewMock will create a daemon component that does nothing. // NewMock will create a daemon component that does nothing.
func NewMock(t testing.TB) Component { func NewMock(t testing.TB) Component {
t.Helper() t.Helper()
@@ -40,14 +38,6 @@ func (c *MockComponent) Stop() error {
return nil return nil
} }
// Reexec does nothing for the mock implementation
func (c *MockComponent) Reexec() {
}
// FinishReexec does nothing for the mock implementation
func (c *MockComponent) FinishReexec() {
}
// Track does nothing // Track does nothing
func (c *MockComponent) Track(_ *tomb.Tomb, _ string) { func (c *MockComponent) Track(_ *tomb.Tomb, _ string) {
} }