Skip to content

1.2.1

Choose a tag to compare

@github-actions github-actions released this 27 Sep 22:56
· 21 commits to main since this release

πŸ› Fixes

  • Node no longer becomes unresponsive (HTTP 502) after a prolonged Manager outage. ManagerRegistrationHostedService used to block Node startup with an unbounded, blocking retry loop when the Manager was unreachable; ManagerHealthCheck opened a fresh, timeout-less HttpClient on every poll, which piled up hung connections over a long outage and degraded the Node's own responsiveness. Registration is now a non-blocking BackgroundService, and the health check uses a pooled client with a 5s timeout.
  • Manager registration (PUT /api/nodes) now checks the response status code instead of treating any response as success.
  • Client no longer hangs (up to 100s per call) when the Node is degraded. IsFeatureEnabledAsync requests to the Node are now bounded by a configurable requestTimeout (default 3s), independent of the underlying HttpClient's own timeout.

✨ Improvements

  • Client circuit breaker. After a failed/timed-out request to the Node, FeatureManager stops contacting it again for circuitBreakDuration (default 30s) and serves cached state immediately instead β€” so a prolonged Node/Manager outage no longer costs every single feature check the full request timeout. Configurable via FeatureSwitcherBasicClientConfiguration.
  • Explicit, tunable HTTP timeouts instead of the .NET default of 100s across the board:
    • Node β†’ Manager registration: 15s (named "Manager" client)
    • Node β†’ Manager health check: 5s (named "ManagerHealthCheck" client)
    • Client β†’ Node: configurable requestTimeout, default 3s

πŸ›‘οΈ Hardening

  • Preventive fix for SQLite write contention on Node (no incident had occurred β€” addressed proactively since this is a production system). Connections now run in WAL mode and use a 10s write-lock timeout, so concurrent feature reads/writes no longer risk an unhandled SqliteException (SQLITE_BUSY) under contention.

Upgrade notes

  • No manual steps required. All new timeouts and the circuit breaker ship with sane defaults and apply automatically; override requestTimeout / circuitBreakDuration on FeatureSwitcherBasicClientConfiguration only if you need different values.
  • No breaking changes to the Manager or Node HTTP APIs, or to the Client's public constructors β€” new parameters are optional and additive.

Full Changelog: v1.2.0...v1.2.1