mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-09 12:07:47 +00:00
always execute condition for wait.PollUntilContextTimeout with
immediate=true The API guarantees that the condition will be executed at least once independently of the context. Change-Id: I9ac8ed681d03f38e270c7726b482c05ca6a568ce
This commit is contained in:
parent
c984d53b31
commit
889ecf865b
@ -27,9 +27,11 @@ import (
|
|||||||
// the provided timer until the provided context is cancelled, the condition returns
|
// the provided timer until the provided context is cancelled, the condition returns
|
||||||
// true, or the condition returns an error. If sliding is true, the period is computed
|
// true, or the condition returns an error. If sliding is true, the period is computed
|
||||||
// after condition runs. If it is false then period includes the runtime for condition.
|
// after condition runs. If it is false then period includes the runtime for condition.
|
||||||
// If immediate is false the first delay happens before any call to condition. The
|
// If immediate is false the first delay happens before any call to condition, if
|
||||||
// returned error is the error returned by the last condition or the context error if
|
// immediate is true the condition will be invoked before waiting and guarantees that
|
||||||
// the context was terminated.
|
// the condition is invoked at least once, regardless of whether the context has been
|
||||||
|
// cancelled. The returned error is the error returned by the last condition or the
|
||||||
|
// context error if the context was terminated.
|
||||||
//
|
//
|
||||||
// This is the common loop construct for all polling in the wait package.
|
// This is the common loop construct for all polling in the wait package.
|
||||||
func loopConditionUntilContext(ctx context.Context, t Timer, immediate, sliding bool, condition ConditionWithContextFunc) error {
|
func loopConditionUntilContext(ctx context.Context, t Timer, immediate, sliding bool, condition ConditionWithContextFunc) error {
|
||||||
@ -38,8 +40,17 @@ func loopConditionUntilContext(ctx context.Context, t Timer, immediate, sliding
|
|||||||
var timeCh <-chan time.Time
|
var timeCh <-chan time.Time
|
||||||
doneCh := ctx.Done()
|
doneCh := ctx.Done()
|
||||||
|
|
||||||
|
// if immediate is true the condition is
|
||||||
|
// guaranteed to be executed at least once,
|
||||||
// if we haven't requested immediate execution, delay once
|
// if we haven't requested immediate execution, delay once
|
||||||
if !immediate {
|
if immediate {
|
||||||
|
if ok, err := func() (bool, error) {
|
||||||
|
defer runtime.HandleCrash()
|
||||||
|
return condition(ctx)
|
||||||
|
}(); err != nil || ok {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
timeCh = t.C()
|
timeCh = t.C()
|
||||||
select {
|
select {
|
||||||
case <-doneCh:
|
case <-doneCh:
|
||||||
|
@ -144,6 +144,33 @@ func Test_loopConditionUntilContext_semantic(t *testing.T) {
|
|||||||
attemptsExpected: 0,
|
attemptsExpected: 0,
|
||||||
errExpected: context.Canceled,
|
errExpected: context.Canceled,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "context already canceled condition success and immediate 1 attempt expected",
|
||||||
|
context: cancelledContext,
|
||||||
|
callback: func(_ int) (bool, error) {
|
||||||
|
return true, nil
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
attemptsExpected: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "context already canceled condition fail and immediate 1 attempt expected",
|
||||||
|
context: cancelledContext,
|
||||||
|
callback: func(_ int) (bool, error) {
|
||||||
|
return false, conditionErr
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
attemptsExpected: 1,
|
||||||
|
errExpected: conditionErr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "context already canceled and immediate 1 attempt expected",
|
||||||
|
context: cancelledContext,
|
||||||
|
callback: defaultCallback,
|
||||||
|
immediate: true,
|
||||||
|
attemptsExpected: 1,
|
||||||
|
errExpected: context.Canceled,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "context cancelled after 5 attempts",
|
name: "context cancelled after 5 attempts",
|
||||||
context: defaultContext,
|
context: defaultContext,
|
||||||
@ -152,6 +179,23 @@ func Test_loopConditionUntilContext_semantic(t *testing.T) {
|
|||||||
attemptsExpected: 5,
|
attemptsExpected: 5,
|
||||||
errExpected: context.Canceled,
|
errExpected: context.Canceled,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "context cancelled and immediate after 5 attempts",
|
||||||
|
context: defaultContext,
|
||||||
|
callback: defaultCallback,
|
||||||
|
immediate: true,
|
||||||
|
cancelContextAfter: 5,
|
||||||
|
attemptsExpected: 5,
|
||||||
|
errExpected: context.Canceled,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "context at deadline and immediate 1 attempt expected",
|
||||||
|
context: deadlinedContext,
|
||||||
|
callback: defaultCallback,
|
||||||
|
immediate: true,
|
||||||
|
attemptsExpected: 1,
|
||||||
|
errExpected: context.DeadlineExceeded,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "context at deadline no attempts expected",
|
name: "context at deadline no attempts expected",
|
||||||
context: deadlinedContext,
|
context: deadlinedContext,
|
||||||
|
Loading…
Reference in New Issue
Block a user