Fix wait.JitterUntil

parent 617fa912
...@@ -20,6 +20,8 @@ import ( ...@@ -20,6 +20,8 @@ import (
"errors" "errors"
"math/rand" "math/rand"
"time" "time"
"k8s.io/kubernetes/pkg/util/runtime"
) )
// For any test of the style: // For any test of the style:
...@@ -81,6 +83,7 @@ func JitterUntil(f func(), period time.Duration, jitterFactor float64, sliding b ...@@ -81,6 +83,7 @@ func JitterUntil(f func(), period time.Duration, jitterFactor float64, sliding b
} }
func() { func() {
defer runtime.HandleCrash()
f() f()
}() }()
......
...@@ -23,6 +23,8 @@ import ( ...@@ -23,6 +23,8 @@ import (
"sync/atomic" "sync/atomic"
"testing" "testing"
"time" "time"
"k8s.io/kubernetes/pkg/util/runtime"
) )
func TestUntil(t *testing.T) { func TestUntil(t *testing.T) {
...@@ -109,6 +111,41 @@ func TestJitterUntilReturnsImmediately(t *testing.T) { ...@@ -109,6 +111,41 @@ func TestJitterUntilReturnsImmediately(t *testing.T) {
} }
} }
func TestJitterUntilRecoversPanic(t *testing.T) {
// Save and restore crash handlers
originalReallyCrash := runtime.ReallyCrash
originalHandlers := runtime.PanicHandlers
defer func() {
runtime.ReallyCrash = originalReallyCrash
runtime.PanicHandlers = originalHandlers
}()
called := 0
handled := 0
// Hook up a custom crash handler to ensure it is called when a jitter function panics
runtime.ReallyCrash = false
runtime.PanicHandlers = []func(interface{}){
func(p interface{}) {
handled++
},
}
ch := make(chan struct{})
JitterUntil(func() {
called++
if called > 2 {
close(ch)
return
}
panic("TestJitterUntilRecoversPanic")
}, time.Millisecond, 1.0, true, ch)
if called != 3 {
t.Errorf("Expected panic recovers")
}
}
func TestJitterUntilNegativeFactor(t *testing.T) { func TestJitterUntilNegativeFactor(t *testing.T) {
now := time.Now() now := time.Now()
ch := make(chan struct{}) ch := make(chan struct{})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment