Reload refreshes proxy routing from the configured provider source. A refresh failure leaves the previous snapshot in place.
(ctx context.Context)
| 35 | // Reload refreshes proxy routing from the configured provider source. |
| 36 | // A refresh failure leaves the previous snapshot in place. |
| 37 | func (s *Server) Reload(ctx context.Context) error { |
| 38 | if s.refreshProviders == nil { |
| 39 | return nil |
| 40 | } |
| 41 | s.recordReloadAttempt() |
| 42 | reload, err := s.refreshProviders(ctx) |
| 43 | if err != nil { |
| 44 | return xerrors.Errorf("refresh ai providers for proxy routing: %w", err) |
| 45 | } |
| 46 | router, err := buildProviderRouter(reload, s.allowedPorts) |
| 47 | if err != nil { |
| 48 | return xerrors.Errorf("build provider router (provider_count=%d): %w", len(reload.Providers), err) |
| 49 | } |
| 50 | s.providerRouter.Store(router) |
| 51 | for _, p := range reload.Providers { |
| 52 | if p.Status == aibridged.ProviderStatusError { |
| 53 | s.logger.Warn(s.ctx, "provider excluded from routing", |
| 54 | slog.F("provider", p.Name), |
| 55 | slog.Error(p.Err), |
| 56 | ) |
| 57 | } |
| 58 | } |
| 59 | s.recordReloadSuccess(reload) |
| 60 | s.logger.Debug(s.ctx, "aibridgeproxyd router reloaded", |
| 61 | slog.F("provider_count", len(reload.Providers)), |
| 62 | slog.F("mitm_host_count", len(router.mitmHosts)), |
| 63 | slog.F("mitm_hosts", router.mitmHosts), |
| 64 | ) |
| 65 | return nil |
| 66 | } |
| 67 | |
| 68 | // recordReloadAttempt stamps the attempt-time gauge at the start of a |
| 69 | // Reload. A reload that hangs mid-flight is detected by watching the |