mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-09 20:17:41 +00:00
Add pro-active TTL based lease releasing when we can't communicate with etcd.
This commit is contained in:
parent
fc742f8c13
commit
6b837ae004
@ -42,6 +42,7 @@ type Config struct {
|
|||||||
src string
|
src string
|
||||||
dest string
|
dest string
|
||||||
sleep time.Duration
|
sleep time.Duration
|
||||||
|
lastLease time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
// runs the election loop. never returns.
|
// runs the election loop. never returns.
|
||||||
@ -50,7 +51,13 @@ func (c *Config) leaseAndUpdateLoop(etcdClient *etcd.Client) {
|
|||||||
master, err := c.acquireOrRenewLease(etcdClient)
|
master, err := c.acquireOrRenewLease(etcdClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error in master election: %v", err)
|
glog.Errorf("Error in master election: %v", err)
|
||||||
continue
|
if uint64(time.Now().Sub(c.lastLease).Seconds()) < c.ttl {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Our lease has expired due to our own accounting, pro-actively give it
|
||||||
|
// up, even if we couldn't contact etcd.
|
||||||
|
glog.Infof("Too much time has elapsed, giving up lease.")
|
||||||
|
master = false
|
||||||
}
|
}
|
||||||
if err := c.update(master); err != nil {
|
if err := c.update(master); err != nil {
|
||||||
glog.Errorf("Error updating files: %v", err)
|
glog.Errorf("Error updating files: %v", err)
|
||||||
@ -64,13 +71,17 @@ func (c *Config) leaseAndUpdateLoop(etcdClient *etcd.Client) {
|
|||||||
// TODO: use the master election utility once it is merged in.
|
// TODO: use the master election utility once it is merged in.
|
||||||
func (c *Config) acquireOrRenewLease(etcdClient *etcd.Client) (bool, error) {
|
func (c *Config) acquireOrRenewLease(etcdClient *etcd.Client) (bool, error) {
|
||||||
result, err := etcdClient.Get(c.key, false, false)
|
result, err := etcdClient.Get(c.key, false, false)
|
||||||
if tools.IsEtcdNotFound(err) {
|
if err != nil {
|
||||||
// there is no current master, try to become master, create will fail if the key already exists
|
if tools.IsEtcdNotFound(err) {
|
||||||
_, err := etcdClient.Create(c.key, c.whoami, c.ttl)
|
// there is no current master, try to become master, create will fail if the key already exists
|
||||||
if err != nil {
|
_, err := etcdClient.Create(c.key, c.whoami, c.ttl)
|
||||||
return false, err
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
c.lastLease = time.Now()
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
return true, nil
|
return false, err
|
||||||
}
|
}
|
||||||
if result.Node.Value == c.whoami {
|
if result.Node.Value == c.whoami {
|
||||||
glog.Infof("key already exists, we are the master (%s)", result.Node.Value)
|
glog.Infof("key already exists, we are the master (%s)", result.Node.Value)
|
||||||
@ -81,6 +92,7 @@ func (c *Config) acquireOrRenewLease(etcdClient *etcd.Client) (bool, error) {
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
c.lastLease = time.Now()
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
glog.Infof("key already exists, the master is %s, sleeping.", result.Node.Value)
|
glog.Infof("key already exists, the master is %s, sleeping.", result.Node.Value)
|
||||||
@ -97,6 +109,7 @@ func (c *Config) update(master bool) error {
|
|||||||
switch {
|
switch {
|
||||||
case master && !exists:
|
case master && !exists:
|
||||||
return copyFile(c.src, c.dest)
|
return copyFile(c.src, c.dest)
|
||||||
|
// TODO: validate sha hash for the two files and overwrite if dest is different than src.
|
||||||
case !master && exists:
|
case !master && exists:
|
||||||
return os.Remove(c.dest)
|
return os.Remove(c.dest)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user