Browse Source

fix: make transport startup failures non-fatal

A single transport failing (e.g. tor binary missing) no longer
prevents other transports from starting. Only fails if zero
transports start successfully.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
imwald-v0.58.10
woikos 4 months ago
parent
commit
69eccb21e2
No known key found for this signature in database
  1. 20
      pkg/transport/manager.go
  2. 2
      pkg/version/version

20
pkg/transport/manager.go

@ -30,24 +30,24 @@ func (m *Manager) Add(t iface.Transport) {
} }
// StartAll starts all registered transports in order. // StartAll starts all registered transports in order.
// If any transport fails to start, previously started transports are stopped. // If a transport fails to start, it is logged and skipped.
// Returns an error only if no transports started successfully.
func (m *Manager) StartAll(ctx context.Context) error { func (m *Manager) StartAll(ctx context.Context) error {
m.mu.RLock() m.mu.RLock()
defer m.mu.RUnlock() defer m.mu.RUnlock()
for i, t := range m.transports { started := 0
for _, t := range m.transports {
log.I.F("starting transport: %s", t.Name()) log.I.F("starting transport: %s", t.Name())
if err := t.Start(ctx); err != nil { if err := t.Start(ctx); err != nil {
// Stop previously started transports in reverse order log.E.F("transport %s failed to start: %v (skipping)", t.Name(), err)
for j := i - 1; j >= 0; j-- { continue
if stopErr := m.transports[j].Stop(ctx); stopErr != nil {
log.E.F("failed to stop transport %s during rollback: %v",
m.transports[j].Name(), stopErr)
}
}
return fmt.Errorf("transport %s failed to start: %w", t.Name(), err)
} }
log.I.F("transport started: %s", t.Name()) log.I.F("transport started: %s", t.Name())
started++
}
if started == 0 {
return fmt.Errorf("no transports started successfully")
} }
return nil return nil
} }

2
pkg/version/version

@ -1 +1 @@
v0.58.8 v0.58.9

Loading…
Cancel
Save