@@ -14,7 +14,7 @@ import (
14
14
eventsql "github.com/nais/api/internal/kubernetes/event/searchsql"
15
15
"github.com/nais/api/internal/leaderelection"
16
16
"github.com/sirupsen/logrus"
17
- "golang.org/x/sync/errgroup "
17
+ "github.com/sourcegraph/conc/pool "
18
18
eventv1 "k8s.io/api/events/v1"
19
19
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20
20
"k8s.io/apimachinery/pkg/watch"
@@ -26,6 +26,9 @@ type Watcher struct {
26
26
clients map [string ]kubernetes.Interface
27
27
events chan eventsql.UpsertParams
28
28
log logrus.FieldLogger
29
+ wg * pool.ContextPool
30
+
31
+ cancel context.CancelFunc
29
32
}
30
33
31
34
func NewWatcher (pool * pgxpool.Pool , clients map [string ]kubernetes.Interface , log logrus.FieldLogger ) * Watcher {
@@ -38,25 +41,50 @@ func NewWatcher(pool *pgxpool.Pool, clients map[string]kubernetes.Interface, log
38
41
}
39
42
40
43
func (w * Watcher ) Run (ctx context.Context ) {
41
- wg , ctx := errgroup .WithContext (ctx )
42
- for env , client := range w .clients {
43
- wg .Go (func () error {
44
- return w .run (ctx , env , client )
45
- })
44
+ w .wg = pool .New ().WithErrors ().WithContext (ctx )
45
+
46
+ leaderelection .RegisterOnStartedLeading (w .onStartedLeading )
47
+ leaderelection .RegisterOnStoppedLeading (w .onStoppedLeading )
48
+ if leaderelection .IsLeader () {
49
+ w .onStartedLeading (ctx )
46
50
}
47
51
48
- wg .Go (func () error {
52
+ w . wg .Go (func (ctx context. Context ) error {
49
53
return w .batchInsert (ctx )
50
54
})
51
55
52
- if err := wg .Wait (); err != nil {
56
+ if err := w . wg .Wait (); err != nil {
53
57
w .log .WithError (err ).Error ("error running events watcher" )
54
58
}
55
59
}
56
60
61
+ func (w * Watcher ) onStoppedLeading () {
62
+ if w .cancel != nil {
63
+ w .cancel ()
64
+ }
65
+ }
66
+
67
+ func (w * Watcher ) onStartedLeading (_ context.Context ) {
68
+ if w .cancel != nil {
69
+ w .cancel ()
70
+ }
71
+
72
+ cancel := make (chan struct {})
73
+
74
+ w .cancel = func () {
75
+ close (cancel )
76
+ }
77
+
78
+ for env , client := range w .clients {
79
+ w .wg .Go (func (ctx context.Context ) error {
80
+ return w .run (ctx , env , client , cancel )
81
+ })
82
+ }
83
+ }
84
+
57
85
var regHorizontalPodAutoscaler = regexp .MustCompile (`New size: (\d+); reason: (\w+).*(below|above) target` )
58
86
59
- func (w * Watcher ) run (ctx context.Context , env string , client kubernetes.Interface ) error {
87
+ func (w * Watcher ) run (ctx context.Context , env string , client kubernetes.Interface , cancel chan struct {} ) error {
60
88
// Events we want to watch for
61
89
// SuccessfulRescale - Check for successful rescale events
62
90
// Killing - Check for liveness failures
@@ -103,6 +131,8 @@ func (w *Watcher) run(ctx context.Context, env string, client kubernetes.Interfa
103
131
select {
104
132
case <- ctx .Done ():
105
133
return nil
134
+ case <- cancel :
135
+ return nil
106
136
case event := <- rescale .ResultChan ():
107
137
handleEvent (event , func (e * eventv1.Event ) (eventsql.UpsertParams , bool ) {
108
138
if ! strings .HasPrefix (e .Note , "New size" ) {
0 commit comments