Skip to content

Commit

Permalink
Problem: Etcd3 locks are not released if shutdown improperly.
Browse files Browse the repository at this point in the history
Solution: Write the lock item with the lease.
  • Loading branch information
marshallbrekka committed Mar 27, 2017
1 parent ff85bd4 commit 9e705b2
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions physical/etcd3.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ type EtcdBackend struct {
etcd *clientv3.Client
}

// etcd default lease duration is 60s. set to 15s for faster recovery.
const etcd3LockTimeoutInSeconds = 15

// newEtcd3Backend constructs a etcd3 backend.
func newEtcd3Backend(conf map[string]string, logger log.Logger) (Backend, error) {
// Get the etcd path form the configuration.
Expand Down Expand Up @@ -228,7 +231,7 @@ type EtcdLock struct {

// Lock is used for mutual exclusion based on the given key.
func (c *EtcdBackend) LockWith(key, value string) (Lock, error) {
session, err := concurrency.NewSession(c.etcd)
session, err := concurrency.NewSession(c.etcd, concurrency.WithTTL(etcd3LockTimeoutInSeconds))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -262,7 +265,7 @@ func (c *EtcdLock) Lock(stopCh <-chan struct{}) (<-chan struct{}, error) {
}
return nil, err
}
if _, err := c.etcd.Put(ctx, c.etcdMu.Key(), c.value); err != nil {
if _, err := c.etcd.Put(ctx, c.etcdMu.Key(), c.value, clientv3.WithLease(c.etcdSession.Lease())); err != nil {
return nil, err
}

Expand Down

0 comments on commit 9e705b2

Please sign in to comment.