1 Star 0 Fork 0

Rossil2012 / zkWrap

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
elector.go 1.52 KB
一键复制 编辑 原始数据 按行查看 历史
Rossil2012 提交于 2021-06-11 21:22 . init: basic functions with tests
package zkWrap
import (
"github.com/Rossil2012/go-leaderelection"
"github.com/go-zookeeper/zk"
)
type Elector struct {
elect *leaderelection.Election
IsLeader bool
IsRunning bool
ElectionName string
Me string
}
type ElectionCallback func(*Elector)
func NewElector(electionName string, me string, onElectedCallback ElectionCallback) (*Elector, error) {
conn, _, err := zk.Connect(hosts, sessionTimeout)
if err != nil {
return nil, err
}
path := pathWithChroot(electionRoot + "/" + electionName)
if pExists, _, err := conn.Exists(path); err != nil {
return nil, err
} else if !pExists {
if _, err := conn.CreateContainer(path, nil, zk.FlagTTL, zk.WorldACL(zk.PermAll)); err != nil {
return nil, err
}
}
election, err := leaderelection.NewElection(conn, path, me)
if err != nil {
return nil, err
}
elector := Elector{
elect: election,
IsLeader: false,
IsRunning: true,
ElectionName: electionName,
Me: me,
}
go election.ElectLeader()
go func() {
for {
select {
case status, ok := <-election.Status():
if ok {
if status.Err != nil {
election.EndElection()
elector.IsLeader = false
elector.IsRunning = false
}
if status.Role == leaderelection.Leader {
elector.IsLeader = true
onElectedCallback(&elector)
}
} else {
}
}
}
}()
return &elector, nil
}
func (el *Elector) Resign() {
el.elect.Resign()
el.IsLeader = false
}
func (el *Elector) StopElection() {
el.elect.EndElection()
el.IsLeader = false
el.IsRunning = false
}
Go
1
https://gitee.com/Rossil2012/zkWrap.git
git@gitee.com:Rossil2012/zkWrap.git
Rossil2012
zkWrap
zkWrap
v0.0.2

搜索帮助