From d795206c5e3eaffe1ec42e0390b5eb56d1d900cb Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 6 Feb 2020 21:43:47 +0000 Subject: [PATCH 1/4] Prevent double waitgroup decrement --- modules/graceful/server.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/graceful/server.go b/modules/graceful/server.go index 19ce8a866f3d..0a7e4d8beaa4 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -12,6 +12,7 @@ import ( "os" "strings" "sync" + "sync/atomic" "syscall" "time" @@ -241,12 +242,12 @@ func (wl *wrappedListener) File() (*os.File, error) { type wrappedConn struct { net.Conn server *Server + closed int32 } func (w wrappedConn) Close() error { - err := w.Conn.Close() - if err == nil { + if atomic.CompareAndSwapInt32(&w.closed, 0, 1) { w.server.wg.Done() } - return err + return w.Conn.Close() } From d5478a2eb72c8003dfeefc905606d6154e4f54c2 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 6 Feb 2020 22:19:16 +0000 Subject: [PATCH 2/4] Update modules/graceful/server.go --- modules/graceful/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/graceful/server.go b/modules/graceful/server.go index 0a7e4d8beaa4..2be7cd2fda92 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -245,7 +245,7 @@ type wrappedConn struct { closed int32 } -func (w wrappedConn) Close() error { +func (w *wrappedConn) Close() error { if atomic.CompareAndSwapInt32(&w.closed, 0, 1) { w.server.wg.Done() } From 54cd178e8491a15f3381fa289158e92364b4b191 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 6 Feb 2020 22:29:34 +0000 Subject: [PATCH 3/4] Update server.go --- modules/graceful/server.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/graceful/server.go b/modules/graceful/server.go index 2be7cd2fda92..25b93cc51a97 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -216,9 +216,12 @@ func (wl *wrappedListener) Accept() (net.Conn, error) { } } + closed := int32(0) + c = wrappedConn{ Conn: c, server: wl.server, + closed: &closed, } wl.server.wg.Add(1) @@ -242,11 +245,11 @@ func (wl *wrappedListener) File() (*os.File, error) { type wrappedConn struct { net.Conn server *Server - closed int32 + closed *int32 } func (w *wrappedConn) Close() error { - if atomic.CompareAndSwapInt32(&w.closed, 0, 1) { + if atomic.CompareAndSwapInt32(w.closed, 0, 1) { w.server.wg.Done() } return w.Conn.Close() From 014f9c065c49f014712d0e6be3e13ece20cf4a7f Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 6 Feb 2020 22:30:34 +0000 Subject: [PATCH 4/4] Update modules/graceful/server.go --- modules/graceful/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/graceful/server.go b/modules/graceful/server.go index 25b93cc51a97..09be9339997b 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -248,7 +248,7 @@ type wrappedConn struct { closed *int32 } -func (w *wrappedConn) Close() error { +func (w wrappedConn) Close() error { if atomic.CompareAndSwapInt32(w.closed, 0, 1) { w.server.wg.Done() }