Restart the relay guard settle timer on every network transition

This commit is contained in:
Zoltán Papp
2026-08-18 12:49:45 +02:00
parent d479d6e7fa
commit 31c77805ce
2 changed files with 44 additions and 7 deletions

View File

@@ -223,17 +223,24 @@ func (g *Guard) waitForNetwork(ctx context.Context) bool {
case <-settle.C:
return true
case <-changedCh:
continue
case <-ctx.Done():
return false
}
} else {
select {
case <-budget.C:
return true
case <-changedCh:
case <-ctx.Done():
return false
}
}
select {
case <-budget.C:
return true
case <-changedCh:
case <-ctx.Done():
return false
if !settle.Stop() {
select {
case <-settle.C:
default:
}
}
settle.Reset(settleWindow)
}
}

View File

@@ -0,0 +1,30 @@
package client
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/netbirdio/netbird/client/netstate"
)
func TestWaitForNetworkSettlesAfterOutage(t *testing.T) {
ns := netstate.New()
ns.Set(false)
g := NewGuard(nil, 0, ns)
const outage = 2 * verdictSettleWindow
go func() {
time.Sleep(outage)
ns.Set(true)
}()
start := time.Now()
ok := g.waitForNetwork(context.Background())
elapsed := time.Since(start)
assert.True(t, ok, "recovered network must let the quick reconnect proceed")
assert.GreaterOrEqual(t, elapsed, outage+verdictSettleWindow, "reconnect must wait a full settle window after the network returns")
}