core/internal/network: move to supervisor
Test Plan: behaviour shouldn't change, covered by existing tests
Bug: T653
X-Origin-Diff: phab/D430
GitOrigin-RevId: b92f0953daba6da84bad96120cde2021c4a82e5c
diff --git a/core/cmd/init/BUILD.bazel b/core/cmd/init/BUILD.bazel
index 0765538..1e5db46 100644
--- a/core/cmd/init/BUILD.bazel
+++ b/core/cmd/init/BUILD.bazel
@@ -9,6 +9,7 @@
importpath = "git.monogon.dev/source/nexantic.git/core/cmd/init",
visibility = ["//visibility:private"],
deps = [
+ "//core/internal/common/supervisor:go_default_library",
"//core/internal/network:go_default_library",
"//core/internal/node:go_default_library",
"//core/internal/storage:go_default_library",
diff --git a/core/cmd/init/main.go b/core/cmd/init/main.go
index f4ff871..d1e2f87 100644
--- a/core/cmd/init/main.go
+++ b/core/cmd/init/main.go
@@ -23,6 +23,7 @@
"os/signal"
"runtime/debug"
+ "git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
"git.monogon.dev/source/nexantic.git/core/internal/network"
"git.monogon.dev/source/nexantic.git/core/internal/node"
"git.monogon.dev/source/nexantic.git/core/internal/storage"
@@ -38,7 +39,6 @@
)
func main() {
- ctx := context.Background()
defer func() {
if r := recover(); r != nil {
fmt.Println("Init panicked:", r)
@@ -76,46 +76,56 @@
panic(fmt.Errorf("could not initialize storage: %w", err))
}
- networkSvc, err := network.NewNetworkService(network.Config{}, logger.With(zap.String("component", "network")))
+ networkSvc := network.New(network.Config{})
if err != nil {
panic(err)
}
- if err := networkSvc.Start(); err != nil {
- logger.Panic("Failed to start network service", zap.Error(err))
- }
+ supervisor.New(context.Background(), logger, func(ctx context.Context) error {
+ if err := supervisor.Run(ctx, "network", networkSvc.Run); err != nil {
+ return err
+ }
- nodeInstance, err := node.NewSmalltownNode(logger, networkSvc, storageManager)
- if err != nil {
- panic(err)
- }
+ // TODO(q3k): convert node code to supervisor
+ nodeInstance, err := node.NewSmalltownNode(logger, networkSvc, storageManager)
+ if err != nil {
+ panic(err)
+ }
- err = nodeInstance.Start(ctx)
- if err != nil {
- panic(err)
- }
+ err = nodeInstance.Start(ctx)
+ if err != nil {
+ panic(err)
+ }
- // We're PID1, so orphaned processes get reparented to us to clean up
- for {
- sig := <-signalChannel
- switch sig {
- case unix.SIGCHLD:
- var status unix.WaitStatus
- var rusage unix.Rusage
- for {
- res, err := unix.Wait4(-1, &status, unix.WNOHANG, &rusage)
- if err != nil && err != unix.ECHILD {
- logger.Error("Failed to wait on orphaned child", zap.Error(err))
- break
- }
- if res <= 0 {
- break
+ supervisor.Signal(ctx, supervisor.SignalHealthy)
+
+ // We're PID1, so orphaned processes get reparented to us to clean up
+ for {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case sig := <-signalChannel:
+ switch sig {
+ case unix.SIGCHLD:
+ var status unix.WaitStatus
+ var rusage unix.Rusage
+ for {
+ res, err := unix.Wait4(-1, &status, unix.WNOHANG, &rusage)
+ if err != nil && err != unix.ECHILD {
+ logger.Error("Failed to wait on orphaned child", zap.Error(err))
+ break
+ }
+ if res <= 0 {
+ break
+ }
+ }
+ // TODO(lorenz): We can probably get more than just SIGCHLD as init, but I can't think
+ // of any others right now, just log them in case we hit any of them.
+ default:
+ logger.Warn("Got unexpected signal", zap.String("signal", sig.String()))
}
}
- // TODO(lorenz): We can probably get more than just SIGCHLD as init, but I can't think
- // of any others right now, just log them in case we hit any of them.
- default:
- logger.Warn("Got unexpected signal", zap.String("signal", sig.String()))
}
- }
+ })
+ select {}
}