client-go: fix the wait time for trying to acquire the leader lease

Signed-off-by: Iceber Gu <wei.cai-nat@daocloud.io>

Kubernetes-commit: 9d80516abb4244ac1df4ceb84a32d3204fe5b308
This commit is contained in:
Iceber Gu 2023-01-10 13:09:07 +08:00 committed by Kubernetes Publisher
parent ba2fdddad1
commit b4217e149b
2 changed files with 37 additions and 2 deletions

View File

@ -344,7 +344,7 @@ func (le *LeaderElector) tryAcquireOrRenew(ctx context.Context) bool {
le.observedRawRecord = oldLeaderElectionRawRecord le.observedRawRecord = oldLeaderElectionRawRecord
} }
if len(oldLeaderElectionRecord.HolderIdentity) > 0 && if len(oldLeaderElectionRecord.HolderIdentity) > 0 &&
le.observedTime.Add(le.config.LeaseDuration).After(now.Time) && le.observedTime.Add(time.Second*time.Duration(oldLeaderElectionRecord.LeaseDurationSeconds)).After(now.Time) &&
!le.IsLeader() { !le.IsLeader() {
klog.V(4).Infof("lock is held by %v and has not yet expired", oldLeaderElectionRecord.HolderIdentity) klog.V(4).Infof("lock is held by %v and has not yet expired", oldLeaderElectionRecord.HolderIdentity)
return false return false

View File

@ -81,6 +81,7 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) {
name string name string
observedRecord rl.LeaderElectionRecord observedRecord rl.LeaderElectionRecord
observedTime time.Time observedTime time.Time
retryAfter time.Duration
reactors []Reactor reactors []Reactor
expectedEvents []string expectedEvents []string
@ -127,6 +128,33 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) {
transitionLeader: true, transitionLeader: true,
outHolder: "baz", outHolder: "baz",
}, },
{
name: "acquire from led object with the lease duration seconds",
reactors: []Reactor{
{
verb: "get",
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
return true, createLockObject(t, objectType, action.GetNamespace(), action.(fakeclient.GetAction).GetName(), &rl.LeaderElectionRecord{HolderIdentity: "bing", LeaseDurationSeconds: 3}), nil
},
},
{
verb: "get",
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
return true, createLockObject(t, objectType, action.GetNamespace(), action.(fakeclient.GetAction).GetName(), &rl.LeaderElectionRecord{HolderIdentity: "bing", LeaseDurationSeconds: 3}), nil
},
},
{
verb: "update",
reaction: func(action fakeclient.Action) (handled bool, ret runtime.Object, err error) {
return true, action.(fakeclient.CreateAction).GetObject(), nil
},
},
},
retryAfter: 3 * time.Second,
expectSuccess: true,
transitionLeader: true,
outHolder: "baz",
},
{ {
name: "acquire from unled object", name: "acquire from unled object",
reactors: []Reactor{ reactors: []Reactor{
@ -285,9 +313,16 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) {
observedTime: test.observedTime, observedTime: test.observedTime,
clock: clock.RealClock{}, clock: clock.RealClock{},
} }
if test.expectSuccess != le.tryAcquireOrRenew(context.Background()) {
if test.retryAfter != 0 {
time.Sleep(test.retryAfter)
if test.expectSuccess != le.tryAcquireOrRenew(context.Background()) { if test.expectSuccess != le.tryAcquireOrRenew(context.Background()) {
t.Errorf("unexpected result of tryAcquireOrRenew: [succeeded=%v]", !test.expectSuccess) t.Errorf("unexpected result of tryAcquireOrRenew: [succeeded=%v]", !test.expectSuccess)
} }
} else {
t.Errorf("unexpected result of tryAcquireOrRenew: [succeeded=%v]", !test.expectSuccess)
}
}
le.observedRecord.AcquireTime = metav1.Time{} le.observedRecord.AcquireTime = metav1.Time{}
le.observedRecord.RenewTime = metav1.Time{} le.observedRecord.RenewTime = metav1.Time{}