From 85a43c519dbcbdbb19fd26123c66d43ced6c70e4 Mon Sep 17 00:00:00 2001 From: Antonio Navarro Perez Date: Fri, 5 Mar 2021 14:34:53 +0100 Subject: [PATCH] Fix problem with context errors. Signed-off-by: Antonio Navarro Perez --- etcd/leasedkv.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/etcd/leasedkv.go b/etcd/leasedkv.go index ad1a46514..b8db8c194 100644 --- a/etcd/leasedkv.go +++ b/etcd/leasedkv.go @@ -89,19 +89,23 @@ func (l *leasedKV) consumeLease(ch <-chan *clientv3.LeaseKeepAliveResponse) { for { kresp, ok := <-ch if !ok { + l.mu.Lock() + if l.stopped { + l.mu.Unlock() return } - l.mu.Lock() - defer l.mu.Unlock() - - retry(1*time.Second, func() error { + if ok := retry(1*time.Second, func() error { return l.create(l.value) - }) + }); !ok { + log.Println("lease cannot be recreated. Key:", l.key) + l.mu.Unlock() + return + } log.Println("lease recreated after a problem. Key:", l.key) - + l.mu.Unlock() return } @@ -162,11 +166,16 @@ func (l *leasedKV) Get(ctx context.Context) (string, error) { return l.value, nil } -func retry(sleep time.Duration, f func() error) { +func retry(sleep time.Duration, f func() error) bool { for { err := f() if err == nil { - return + return true + } + + // sometimes the element in charge of stopping the lease renewal doesn't do it, causing context errors. + if errors.Is(err, context.DeadlineExceeded) { + return false } time.Sleep(sleep)