Skip to content

Commit 885371b

Browse files
authored
fix: a race condition with election hijacking (#101)
* feat: Emit events when finalizers complete * fix: a race condition with election hijacking
1 parent 94c42ff commit 885371b

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ require (
1717
k8s.io/apimachinery v0.31.2
1818
k8s.io/client-go v0.31.2
1919
k8s.io/klog/v2 v2.130.1
20+
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
2021
sigs.k8s.io/controller-runtime v0.19.1
2122
sigs.k8s.io/yaml v1.4.0
2223
)
@@ -71,7 +72,6 @@ require (
7172
gopkg.in/yaml.v3 v3.0.1 // indirect
7273
k8s.io/apiextensions-apiserver v0.31.0 // indirect
7374
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
74-
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
7575
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
7676
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
7777
)

leaderelection/leasehijacker.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"os"
7+
"time"
78

89
"github.com/samber/lo"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -40,12 +41,21 @@ func LeaseHijacker(ctx context.Context, config *rest.Config, namespace string, n
4041
if os.Getenv("HIJACK_LEASE") != "true" {
4142
return nil // If not set, fallback to other controller-runtime lease settings
4243
}
43-
log.FromContext(ctx).Info("hijacking lease", "namespace", namespace, "name", name)
4444
kubeClient := coordinationv1client.NewForConfigOrDie(config)
4545
lease := lo.Must(kubeClient.Leases(namespace).Get(ctx, name, metav1.GetOptions{}))
46+
47+
untilElection := time.Until(lease.Spec.RenewTime.Add(time.Duration(*lease.Spec.LeaseDurationSeconds) * time.Second))
48+
4649
lease.Spec.HolderIdentity = lo.ToPtr(fmt.Sprintf("%s_%s", lo.Must(os.Hostname()), uuid.NewUUID()))
4750
lease.Spec.AcquireTime = lo.ToPtr(metav1.NowMicro())
51+
lease.Spec.RenewTime = lo.ToPtr(metav1.NowMicro())
52+
*lease.Spec.LeaseDurationSeconds += 5 // Make our lease longer to guarantee we win the next election
53+
*lease.Spec.LeaseTransitions += 1
4854
lo.Must(kubeClient.Leases(namespace).Update(ctx, lease, metav1.UpdateOptions{}))
55+
56+
log.FromContext(ctx).Info(fmt.Sprintf("hijacked lease, waiting %s for election", untilElection), "namespace", namespace, "name", name)
57+
time.Sleep(untilElection)
58+
4959
return lo.Must(resourcelock.New(
5060
resourcelock.LeasesResourceLock,
5161
namespace,

0 commit comments

Comments
 (0)