dagger/dagger · error
service stop called
Error message
service stop called
What it means
Sentinel error used as the deliberate cancellation cause when the tunnel's Stop is invoked: shutdown(stopErr) cancels svcCtx, and Wait distinguishes an intentional stop from a crash by checking errors.Is(cause, stopErr). It is a control-flow marker, not an operational failure.
Source
Thrown at core/service.go:1203
if err != nil {
return err
}
svcs, err := query.Services(ctx)
if err != nil {
return fmt.Errorf("failed to get services: %w", err)
}
bk, err := query.Engine(ctx)
if err != nil {
return fmt.Errorf("failed to get engine client: %w", err)
}
upstream, err := svcs.StartResult(svcCtx, svc.TunnelUpstream, svc.TunnelUpstream.Self().TunnelUpstream.Self() != nil)
if err != nil {
return fmt.Errorf("start upstream: %w", err)
}
const bindHost = "0.0.0.0"
const dialHost = "127.0.0.1"
stopErr := errors.New("service stop called")
upstreamExitedErr := errors.New("upstream exited")
closers := make([]func() error, len(svc.TunnelPorts))
ports := make([]Port, len(svc.TunnelPorts))
for i, forward := range svc.TunnelPorts {
var frontend int
if forward.Frontend != nil {
frontend = *forward.Frontend
} else {
frontend = 0 // allow OS to choose
}
res, closeListener, err := bk.ListenHostToContainer(
svcCtx,
fmt.Sprintf("%s:%d", bindHost, frontend),
forward.Protocol.Network(),
fmt.Sprintf("%s:%d", upstream.Host, forward.Backend),
)View on GitHub (pinned to 82ba2681db)
Solutions
- No action needed — this indicates an intentional Stop, and Wait returns nil for it
- If seen unexpectedly, audit callers of running.Stop for premature shutdowns
- Check that application shutdown ordering is intentional
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at core/service.go:1203 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/85c710d1922e1839.
Report an issue: GitHub.