diff --git a/changelog/11588.txt b/changelog/11588.txt new file mode 100644 index 0000000000000..1f7f0365abfa5 --- /dev/null +++ b/changelog/11588.txt @@ -0,0 +1,3 @@ +```release-note:improvement +core: Add a small (<1s) exponential backoff to failed TCP listener Accept failures. +``` \ No newline at end of file diff --git a/vault/cluster/cluster.go b/vault/cluster/cluster.go index b4ec28cf6f4cb..016e73c32abd5 100644 --- a/vault/cluster/cluster.go +++ b/vault/cluster/cluster.go @@ -279,6 +279,15 @@ func (cl *Listener) Run(ctx context.Context) error { close(closeCh) }() + // baseDelay is the initial delay after an Accept() error before attempting again + const baseDelay = 5 * time.Millisecond + + // maxDelay is the maximum delay after an Accept() error before attempting again. + // In the case that this function is error-looping, it will delay the shutdown check. + // Therefore, changes to maxDelay may have an effect on the latency of shutdown. + const maxDelay = 1 * time.Second + + var loopDelay time.Duration for { if atomic.LoadUint32(cl.shutdown) > 0 { return @@ -298,8 +307,23 @@ func (cl *Listener) Run(ctx context.Context) error { if conn != nil { conn.Close() } + + if loopDelay == 0 { + loopDelay = baseDelay + } else { + loopDelay *= 2 + } + + if loopDelay > maxDelay { + loopDelay = maxDelay + } + + time.Sleep(loopDelay) continue } + // No error, reset loop delay + loopDelay = 0 + if conn == nil { continue }