Skip to content

Commit

Permalink
[fix] etcd registry lifecycle
Browse files Browse the repository at this point in the history
  • Loading branch information
Disdjj authored and demoManito committed Mar 16, 2024
1 parent 3110168 commit 501efe8
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion contrib/registry/etcd/registry.go
Expand Up @@ -51,6 +51,11 @@ type Registry struct {
client *clientv3.Client
kv clientv3.KV
lease clientv3.Lease
/*
ctxMap is used to store the context cancel function of each service instance.
When the service instance is deregistered, the corresponding context cancel function is called to stop the heartbeat.
*/
ctxMap map[*registry.ServiceInstance]context.CancelFunc
}

// New creates etcd registry
Expand All @@ -68,6 +73,7 @@ func New(client *clientv3.Client, opts ...Option) (r *Registry) {
opts: op,
client: client,
kv: clientv3.NewKV(client),
ctxMap: make(map[*registry.ServiceInstance]context.CancelFunc),
}
}

Expand All @@ -87,7 +93,9 @@ func (r *Registry) Register(ctx context.Context, service *registry.ServiceInstan
return err
}

go r.heartBeat(r.opts.ctx, leaseID, key, value)
hctx, cancel := context.WithCancel(r.opts.ctx)
r.ctxMap[service] = cancel
go r.heartBeat(hctx, leaseID, key, value)
return nil
}

Expand All @@ -98,6 +106,11 @@ func (r *Registry) Deregister(ctx context.Context, service *registry.ServiceInst
r.lease.Close()
}
}()
// cancel heartbeat
if cancel, ok := r.ctxMap[service]; ok {
cancel()
delete(r.ctxMap, service)
}
key := fmt.Sprintf("%s/%s/%s", r.opts.namespace, service.Name, service.ID)
_, err := r.client.Delete(ctx, key)
return err
Expand Down

0 comments on commit 501efe8

Please sign in to comment.