From 8da518f0d73a0cca607f1a6eaf5d506dbc421d51 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 1 May 2017 14:12:40 -0700 Subject: [PATCH] embed: fix blocking Close before gRPC server start If 'StartEtcd' returns before starting gRPC server (e.g. mismatch snapshot, misconfiguration), receiving from grpcServerC blocks forever. This patch just closes the channel to not block on grpcServerC, and proceeds to next stop operations in Close. This was masking the issues in https://github.com/coreos/etcd/issues/7834 Signed-off-by: Gyu-Ho Lee --- embed/etcd.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/embed/etcd.go b/embed/etcd.go index 4d23a04009c3..06dd442bf767 100644 --- a/embed/etcd.go +++ b/embed/etcd.go @@ -83,6 +83,10 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { return } if e.sctxs, err = startClientListeners(cfg); err != nil { + // errored before starting gRPC server for serveCtx.grpcServerC + for _, sctx := range e.sctxs { + close(sctx.grpcServerC) + } return } for _, sctx := range e.sctxs { @@ -127,6 +131,10 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { } if e.Server, err = etcdserver.NewServer(srvcfg); err != nil { + // errored before starting gRPC server for serveCtx.grpcServerC + for _, sctx := range e.sctxs { + close(sctx.grpcServerC) + } return }