-
Notifications
You must be signed in to change notification settings - Fork 4
/
election.go
51 lines (40 loc) · 1.22 KB
/
election.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Copyright (c) 2021, R.I. Pienaar and the Choria Project contributors
//
// SPDX-License-Identifier: Apache-2.0
package hosts
import (
"context"
"sync"
"github.com/choria-io/go-choria/backoff"
"github.com/choria-io/go-choria/inter"
election "github.com/choria-io/go-choria/providers/election/streams"
"github.com/sirupsen/logrus"
)
func startElection(ctx context.Context, wg *sync.WaitGroup, conn inter.Connector, fw inter.Framework, trigger chan struct{}, logger *logrus.Entry) error {
defer wg.Done()
log := logger.WithField("election", "provisioner")
log.Infof("Starting leader election against 'provisioner'")
conf.Pause()
won := func() {
conf.Resume()
log.Warn("Became leader after winning election")
trigger <- struct{}{}
log.Info("Triggered a discovery after becoming leader")
}
lost := func() {
conf.Pause()
log.Warn("Lost leadership")
removeAllHosts()
}
elect, err := fw.NewElection(ctx, conn, "provisioner", true, election.OnWon(won), election.OnLost(lost), election.WithBackoff(backoff.TwentySec), election.WithDebug(log.Debugf))
if err != nil {
return err
}
go func() {
err := elect.Start(ctx)
if err != nil {
log.Fatalf("Leader election failed to start: %s", err)
}
}()
return nil
}