mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-11 04:52:08 +00:00
Merge pull request #119661 from cartermckinnon/lease-leak-node-not-found
Handle errors when preparing lease for update
This commit is contained in:
commit
92b7905143
@ -65,9 +65,8 @@ type controller struct {
|
|||||||
latestLease *coordinationv1.Lease
|
latestLease *coordinationv1.Lease
|
||||||
|
|
||||||
// newLeasePostProcessFunc allows customizing a lease object (e.g. setting OwnerReference)
|
// newLeasePostProcessFunc allows customizing a lease object (e.g. setting OwnerReference)
|
||||||
// before every time the lease is created/refreshed(updated). Note that an error will block
|
// before every time the lease is created/refreshed(updated).
|
||||||
// a lease CREATE, causing the controller to retry next time, but an error won't block a
|
// Note that an error will block the lease operation.
|
||||||
// lease UPDATE.
|
|
||||||
newLeasePostProcessFunc ProcessLeaseFunc
|
newLeasePostProcessFunc ProcessLeaseFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +183,10 @@ func (c *controller) ensureLease(ctx context.Context) (*coordinationv1.Lease, bo
|
|||||||
// call this once you're sure the lease has been created
|
// call this once you're sure the lease has been created
|
||||||
func (c *controller) retryUpdateLease(ctx context.Context, base *coordinationv1.Lease) error {
|
func (c *controller) retryUpdateLease(ctx context.Context, base *coordinationv1.Lease) error {
|
||||||
for i := 0; i < maxUpdateRetries; i++ {
|
for i := 0; i < maxUpdateRetries; i++ {
|
||||||
leaseToUpdate, _ := c.newLease(base)
|
leaseToUpdate, err := c.newLease(base)
|
||||||
|
if err != nil {
|
||||||
|
klog.FromContext(ctx).Error(err, "Failed to prepare lease")
|
||||||
|
} else {
|
||||||
lease, err := c.leaseClient.Update(ctx, leaseToUpdate, metav1.UpdateOptions{})
|
lease, err := c.leaseClient.Update(ctx, leaseToUpdate, metav1.UpdateOptions{})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
c.latestLease = lease
|
c.latestLease = lease
|
||||||
@ -196,6 +198,7 @@ func (c *controller) retryUpdateLease(ctx context.Context, base *coordinationv1.
|
|||||||
base, _ = c.backoffEnsureLease(ctx)
|
base, _ = c.backoffEnsureLease(ctx)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if i > 0 && c.onRepeatedHeartbeatFailure != nil {
|
if i > 0 && c.onRepeatedHeartbeatFailure != nil {
|
||||||
c.onRepeatedHeartbeatFailure()
|
c.onRepeatedHeartbeatFailure()
|
||||||
}
|
}
|
||||||
|
@ -227,6 +227,7 @@ func TestRetryUpdateNodeLease(t *testing.T) {
|
|||||||
getReactor func(action clienttesting.Action) (bool, runtime.Object, error)
|
getReactor func(action clienttesting.Action) (bool, runtime.Object, error)
|
||||||
onRepeatedHeartbeatFailure func()
|
onRepeatedHeartbeatFailure func()
|
||||||
expectErr bool
|
expectErr bool
|
||||||
|
client *fake.Clientset
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
desc: "no errors",
|
desc: "no errors",
|
||||||
@ -236,6 +237,7 @@ func TestRetryUpdateNodeLease(t *testing.T) {
|
|||||||
getReactor: nil,
|
getReactor: nil,
|
||||||
onRepeatedHeartbeatFailure: nil,
|
onRepeatedHeartbeatFailure: nil,
|
||||||
expectErr: false,
|
expectErr: false,
|
||||||
|
client: fake.NewSimpleClientset(node),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "connection errors",
|
desc: "connection errors",
|
||||||
@ -245,6 +247,7 @@ func TestRetryUpdateNodeLease(t *testing.T) {
|
|||||||
getReactor: nil,
|
getReactor: nil,
|
||||||
onRepeatedHeartbeatFailure: nil,
|
onRepeatedHeartbeatFailure: nil,
|
||||||
expectErr: true,
|
expectErr: true,
|
||||||
|
client: fake.NewSimpleClientset(node),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "optimistic lock errors",
|
desc: "optimistic lock errors",
|
||||||
@ -267,12 +270,24 @@ func TestRetryUpdateNodeLease(t *testing.T) {
|
|||||||
},
|
},
|
||||||
onRepeatedHeartbeatFailure: func() { t.Fatalf("onRepeatedHeartbeatFailure called") },
|
onRepeatedHeartbeatFailure: func() { t.Fatalf("onRepeatedHeartbeatFailure called") },
|
||||||
expectErr: false,
|
expectErr: false,
|
||||||
|
client: fake.NewSimpleClientset(node),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "node not found errors",
|
||||||
|
updateReactor: func(action clienttesting.Action) (bool, runtime.Object, error) {
|
||||||
|
t.Fatalf("lease was updated when node does not exist!")
|
||||||
|
return true, nil, nil
|
||||||
|
},
|
||||||
|
getReactor: nil,
|
||||||
|
onRepeatedHeartbeatFailure: nil,
|
||||||
|
expectErr: true,
|
||||||
|
client: fake.NewSimpleClientset(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
t.Run(tc.desc, func(t *testing.T) {
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
_, ctx := ktesting.NewTestContext(t)
|
_, ctx := ktesting.NewTestContext(t)
|
||||||
cl := fake.NewSimpleClientset(node)
|
cl := tc.client
|
||||||
if tc.updateReactor != nil {
|
if tc.updateReactor != nil {
|
||||||
cl.PrependReactor("update", "leases", tc.updateReactor)
|
cl.PrependReactor("update", "leases", tc.updateReactor)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user