From e19e1ac3accb62a6214513032dd46c177208690c Mon Sep 17 00:00:00 2001 From: Ewan Chou Date: Tue, 26 Sep 2017 10:49:33 +0800 Subject: [PATCH] owner: revoke on ctx.Done. (#4624) --- owner/manager.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/owner/manager.go b/owner/manager.go index 2d030be18bf15..fc5778413367b 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -164,19 +164,15 @@ func (m *ownerManager) campaignLoop(ctx goctx.Context, etcdSession *concurrency. select { case <-etcdSession.Done(): log.Infof("%s etcd session is done, creates a new one", logPrefix) + leaseID := etcdSession.Lease() etcdSession, err = NewSession(ctx, logPrefix, m.etcdCli, NewSessionRetryUnlimited, ManagerSessionTTL) if err != nil { - log.Infof("%s break campaign loop, err %v", logPrefix, err) + log.Infof("%s break campaign loop, NewSession err %v", logPrefix, err) + m.revokeSession(logPrefix, leaseID) return } case <-ctx.Done(): - // Revoke the session lease. - // If revoke takes longer than the ttl, lease is expired anyway. - cancelCtx, cancel := goctx.WithTimeout(goctx.Background(), - time.Duration(ManagerSessionTTL)*time.Second) - _, err = m.etcdCli.Revoke(cancelCtx, etcdSession.Lease()) - cancel() - log.Infof("%s break campaign loop err %v", logPrefix, err) + m.revokeSession(logPrefix, etcdSession.Lease()) return default: } @@ -203,12 +199,21 @@ func (m *ownerManager) campaignLoop(ctx goctx.Context, etcdSession *concurrency. continue } m.SetOwner(true) - m.watchOwner(ctx, etcdSession, ownerKey) m.SetOwner(false) } } +func (m *ownerManager) revokeSession(logPrefix string, leaseID clientv3.LeaseID) { + // Revoke the session lease. + // If revoke takes longer than the ttl, lease is expired anyway. + cancelCtx, cancel := goctx.WithTimeout(goctx.Background(), + time.Duration(ManagerSessionTTL)*time.Second) + _, err := m.etcdCli.Revoke(cancelCtx, leaseID) + cancel() + log.Infof("%s break campaign loop, revoke err %v", logPrefix, err) +} + // GetOwnerID implements Manager.GetOwnerID interface. func (m *ownerManager) GetOwnerID(ctx goctx.Context) (string, error) { resp, err := m.etcdCli.Get(ctx, m.key, clientv3.WithFirstCreate()...)