Compare commits

..

3 Commits

Author SHA1 Message Date
Marc Brooks dd56b17c20
Merge 8e9e3e242f into 79098d3546 2025-10-28 18:50:33 +01:00
Adam Shiervani 79098d3546
feat: Enhance DHCP client timeout and retry logic (#908) 2025-10-28 18:50:29 +01:00
Adam Shiervani 50fc88aae1
bug: fix null pointer in wakeDisplay (#907) 2025-10-28 18:48:30 +01:00
3 changed files with 27 additions and 15 deletions

View File

@ -305,11 +305,11 @@ func wakeDisplay(force bool, reason string) {
displayLogger.Warn().Err(err).Msg("failed to wake display") displayLogger.Warn().Err(err).Msg("failed to wake display")
} }
if config.DisplayDimAfterSec != 0 { if config.DisplayDimAfterSec != 0 && dimTicker != nil {
dimTicker.Reset(time.Duration(config.DisplayDimAfterSec) * time.Second) dimTicker.Reset(time.Duration(config.DisplayDimAfterSec) * time.Second)
} }
if config.DisplayOffAfterSec != 0 { if config.DisplayOffAfterSec != 0 && offTicker != nil {
offTicker.Reset(time.Duration(config.DisplayOffAfterSec) * time.Second) offTicker.Reset(time.Duration(config.DisplayOffAfterSec) * time.Second)
} }
backlightState = 0 backlightState = 0

View File

@ -111,6 +111,7 @@ type Client struct {
var ( var (
defaultTimerDuration = 1 * time.Second defaultTimerDuration = 1 * time.Second
defaultLinkUpTimeout = 30 * time.Second defaultLinkUpTimeout = 30 * time.Second
defaultDHCPTimeout = 5 * time.Second // DHCP request timeout (not link up timeout)
maxRenewalAttemptDuration = 2 * time.Hour maxRenewalAttemptDuration = 2 * time.Hour
) )
@ -125,11 +126,11 @@ func NewClient(ctx context.Context, ifaces []string, c *Config, l *zerolog.Logge
} }
if cfg.Timeout == 0 { if cfg.Timeout == 0 {
cfg.Timeout = defaultLinkUpTimeout cfg.Timeout = defaultDHCPTimeout
} }
if cfg.Retries == 0 { if cfg.Retries == 0 {
cfg.Retries = 3 cfg.Retries = 4
} }
return &Client{ return &Client{
@ -153,9 +154,15 @@ func NewClient(ctx context.Context, ifaces []string, c *Config, l *zerolog.Logge
}, nil }, nil
} }
func resetTimer(t *time.Timer, l *zerolog.Logger) { func resetTimer(t *time.Timer, attempt int, l *zerolog.Logger) {
l.Debug().Dur("delay", defaultTimerDuration).Msg("will retry later") // Exponential backoff: 1s, 2s, 4s, 8s, max 8s
t.Reset(defaultTimerDuration) backoffAttempt := attempt
if backoffAttempt > 3 {
backoffAttempt = 3
}
delay := time.Duration(1<<backoffAttempt) * time.Second
l.Debug().Dur("delay", delay).Int("attempt", attempt).Msg("will retry later")
t.Reset(delay)
} }
func getRenewalTime(lease *Lease) time.Duration { func getRenewalTime(lease *Lease) time.Duration {
@ -168,12 +175,14 @@ func getRenewalTime(lease *Lease) time.Duration {
func (c *Client) requestLoop(t *time.Timer, family int, ifname string) { func (c *Client) requestLoop(t *time.Timer, family int, ifname string) {
l := c.l.With().Str("interface", ifname).Int("family", family).Logger() l := c.l.With().Str("interface", ifname).Int("family", family).Logger()
attempt := 0
for range t.C { for range t.C {
l.Info().Msg("requesting lease") l.Info().Int("attempt", attempt).Msg("requesting lease")
if _, err := c.ensureInterfaceUp(ifname); err != nil { if _, err := c.ensureInterfaceUp(ifname); err != nil {
l.Error().Err(err).Msg("failed to ensure interface up") l.Error().Err(err).Int("attempt", attempt).Msg("failed to ensure interface up")
resetTimer(t, c.l) resetTimer(t, attempt, c.l)
attempt++
continue continue
} }
@ -188,11 +197,14 @@ func (c *Client) requestLoop(t *time.Timer, family int, ifname string) {
lease, err = c.requestLease6(ifname) lease, err = c.requestLease6(ifname)
} }
if err != nil { if err != nil {
l.Error().Err(err).Msg("failed to request lease") l.Error().Err(err).Int("attempt", attempt).Msg("failed to request lease")
resetTimer(t, c.l) resetTimer(t, attempt, c.l)
attempt++
continue continue
} }
// Successfully obtained lease, reset attempt counter
attempt = 0
c.handleLeaseChange(lease) c.handleLeaseChange(lease)
nextRenewal := getRenewalTime(lease) nextRenewal := getRenewalTime(lease)

View File

@ -46,10 +46,10 @@ export default function SettingsHardwareRoute() {
} }
setBacklightSettings(settings); setBacklightSettings(settings);
handleBacklightSettingsSave(); handleBacklightSettingsSave(settings);
}; };
const handleBacklightSettingsSave = () => { const handleBacklightSettingsSave = (backlightSettings: BacklightSettings) => {
send("setBacklightSettings", { params: backlightSettings }, (resp: JsonRpcResponse) => { send("setBacklightSettings", { params: backlightSettings }, (resp: JsonRpcResponse) => {
if ("error" in resp) { if ("error" in resp) {
notifications.error( notifications.error(