From f0e8eef1add643292140fd638f4145eabd877aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=B0=91=E6=9E=97?= Date: Wed, 18 Aug 2021 17:56:24 +0800 Subject: [PATCH] fix:lock timeout unlock bug --- mutex.go | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/mutex.go b/mutex.go index fc60557..904dfdc 100644 --- a/mutex.go +++ b/mutex.go @@ -151,20 +151,30 @@ func (m *Mutex) lock() (err error) { // arrange for another goroutine to unlock it. func (m *Mutex) Unlock() (err error) { defer m.mutex.Unlock() - for i := 1; i <= defaultTry; i++ { - var resp *client.Response - resp, err = m.kapi.Delete(m.ctx, m.key, nil) - if err == nil { - m.debug("Delete %v OK", m.key) - return nil - } - m.debug("Delete %v falied: %q", m.key, resp) - e, ok := err.(client.Error) - if ok && e.Code == client.ErrorCodeKeyNotFound { - return nil + resp, err := m.kapi.Get(m.ctx, m.key, nil) + if err != nil { + return err + } + + if resp.Node.Value == m.id { + for i := 1; i <= defaultTry; i++ { + var resp *client.Response + resp, err = m.kapi.Delete(m.ctx, m.key, nil) + if err == nil { + m.debug("Delete %v OK", m.key) + return nil + } + m.debug("Delete %v falied: %q", m.key, resp) + e, ok := err.(client.Error) + if ok && e.Code == client.ErrorCodeKeyNotFound { + return nil + } } + + return err } - return err + + return errors.New("lock timeout") } func (m *Mutex) RefreshLockTTL(ttl time.Duration) (err error) {