Skip to content

statserver package has a flakey test #1738

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
dprotaso opened this issue Jul 27, 2018 · 3 comments
Closed

statserver package has a flakey test #1738

dprotaso opened this issue Jul 27, 2018 · 3 comments
Assignees

Comments

@dprotaso
Copy link
Member

dprotaso commented Jul 27, 2018

Test command to reproduce:
go test -v -count=1000 -run TestServerLifecycle

See example logs: https://console.cloud.google.com/storage/browser/knative-prow/pr-logs/pull/knative_serving/1704/pull-knative-serving-unit-tests/257/

I0727 13:58:42.573] === RUN   TestServerLifecycle
I0727 13:58:42.573] SIGQUIT: quit
I0727 13:58:42.573] PC=0x48a0b0 m=0 sigcode=0
I0727 13:58:42.573] 
I0727 13:58:42.573] goroutine 0 [idle]:
I0727 13:58:42.573] runtime.epollwait(0x5, 0x7ffc21b1ac90, 0xffffffff00000080, 0x0, 0xfffffffffda6c04f, 0x7ffc00000000, 0x0, 0x0, 0x0, 0x0, ...)
I0727 13:58:42.573] 	/usr/local/go/src/runtime/sys_linux_amd64.s:670 +0x20
I0727 13:58:42.573] runtime.netpoll(0xc420054f01, 0xc42004e001)
I0727 13:58:42.573] 	/usr/local/go/src/runtime/netpoll_epoll.go:71 +0x12c
I0727 13:58:42.573] runtime.findrunnable(0xc420050500, 0x0)
I0727 13:58:42.573] 	/usr/local/go/src/runtime/proc.go:2397 +0x3f0
I0727 13:58:42.573] runtime.schedule()
I0727 13:58:42.574] 	/usr/local/go/src/runtime/proc.go:2541 +0x151
I0727 13:58:42.574] runtime.park_m(0xc4202ded80)
I0727 13:58:42.574] 	/usr/local/go/src/runtime/proc.go:2604 +0x81
I0727 13:58:42.574] runtime.mcall(0x0)
I0727 13:58:42.574] 	/usr/local/go/src/runtime/asm_amd64.s:351 +0x5b
I0727 13:58:42.574] 
I0727 13:58:42.574] goroutine 1 [chan receive]:
I0727 13:58:42.574] testing.(*T).Run(0xc42031e000, 0x15ef462, 0x13, 0x165b5c8, 0xc420163c68)
I0727 13:58:42.574] 	/usr/local/go/src/testing/testing.go:825 +0x597
I0727 13:58:42.574] testing.runTests.func1(0xc42031e000)
I0727 13:58:42.575] 	/usr/local/go/src/testing/testing.go:1063 +0xa5
I0727 13:58:42.575] testing.tRunner(0xc42031e000, 0xc420163db0)
I0727 13:58:42.575] 	/usr/local/go/src/testing/testing.go:777 +0x16e
I0727 13:58:42.575] testing.runTests(0xc4202dc6a0, 0x1e1c920, 0x4, 0x4, 0xc4202f4f80)
I0727 13:58:42.575] 	/usr/local/go/src/testing/testing.go:1061 +0x4e2
I0727 13:58:42.575] testing.(*M).Run(0xc4202f4f80, 0x0)
I0727 13:58:42.575] 	/usr/local/go/src/testing/testing.go:978 +0x2ce
I0727 13:58:42.575] main.main()
I0727 13:58:42.575] 	_testmain.go:50 +0x22b
I0727 13:58:42.575] 
I0727 13:58:42.575] goroutine 19 [chan receive]:
I0727 13:58:42.575] github.com/knative/serving/vendor/github.com/golang/glog.(*loggingT).flushDaemon(0x1e27080)
I0727 13:58:42.576] 	/go/src/github.com/knative/serving/vendor/github.com/golang/glog/glog.go:882 +0xac
I0727 13:58:42.576] created by github.com/knative/serving/vendor/github.com/golang/glog.init.0
I0727 13:58:42.576] 	/go/src/github.com/knative/serving/vendor/github.com/golang/glog/glog.go:410 +0x231
I0727 13:58:42.576] 
I0727 13:58:42.576] goroutine 21 [select]:
I0727 13:58:42.576] github.com/knative/serving/vendor/go.opencensus.io/stats/view.(*worker).start(0xc4202f6e40)
I0727 13:58:42.576] 	/go/src/github.com/knative/serving/vendor/go.opencensus.io/stats/view/worker.go:144 +0x18f
I0727 13:58:42.576] created by github.com/knative/serving/vendor/go.opencensus.io/stats/view.init.0
I0727 13:58:42.576] 	/go/src/github.com/knative/serving/vendor/go.opencensus.io/stats/view/worker.go:29 +0x9b
I0727 13:58:42.576] 
I0727 13:58:42.576] goroutine 22 [semacquire]:
I0727 13:58:42.576] sync.runtime_Semacquire(0xc4200bd5ec)
I0727 13:58:42.576] 	/usr/local/go/src/runtime/sema.go:56 +0x39
I0727 13:58:42.577] sync.(*WaitGroup).Wait(0xc4200bd5e0)
I0727 13:58:42.577] 	/usr/local/go/src/sync/waitgroup.go:129 +0xb3
I0727 13:58:42.577] github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle(0xc42031e0f0)
I0727 13:58:42.577] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:53 +0x268
I0727 13:58:42.577] testing.tRunner(0xc42031e0f0, 0x165b5c8)
I0727 13:58:42.577] 	/usr/local/go/src/testing/testing.go:777 +0x16e
I0727 13:58:42.577] created by testing.(*T).Run
I0727 13:58:42.577] 	/usr/local/go/src/testing/testing.go:824 +0x565
I0727 13:58:42.577] 
I0727 13:58:42.578] goroutine 23 [IO wait]:
I0727 13:58:42.578] internal/poll.runtime_pollWait(0x7fc3b0777f00, 0x72, 0xc420324b80)
I0727 13:58:42.578] 	/usr/local/go/src/runtime/netpoll.go:173 +0x5e
I0727 13:58:42.578] internal/poll.(*pollDesc).wait(0xc4202f5118, 0x72, 0xc4202f7100, 0x0, 0x0)
I0727 13:58:42.578] 	/usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0xe5
I0727 13:58:42.578] internal/poll.(*pollDesc).waitRead(0xc4202f5118, 0xffffffffffffff00, 0x0, 0x0)
I0727 13:58:42.578] 	/usr/local/go/src/internal/poll/fd_poll_runtime.go:90 +0x4b
I0727 13:58:42.578] internal/poll.(*FD).Accept(0xc4202f5100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
I0727 13:58:42.578] 	/usr/local/go/src/internal/poll/fd_unix.go:372 +0x2e2
I0727 13:58:42.579] net.(*netFD).accept(0xc4202f5100, 0x30, 0x30, 0xc4203133b0)
I0727 13:58:42.579] 	/usr/local/go/src/net/fd_unix.go:238 +0x53
I0727 13:58:42.579] net.(*TCPListener).accept(0xc4200be900, 0xc4ffffffff, 0xc400000000, 0xc4202ded80)
I0727 13:58:42.579] 	/usr/local/go/src/net/tcpsock_posix.go:136 +0x4e
I0727 13:58:42.579] net.(*TCPListener).AcceptTCP(0xc4200be900, 0x5ae513, 0xc4203133d0, 0xc4203133b0)
I0727 13:58:42.579] 	/usr/local/go/src/net/tcpsock.go:246 +0x50
I0727 13:58:42.579] github.com/knative/serving/pkg/autoscaler/statserver.keepAlive.Accept(0xc4200be900, 0xc4200bc050, 0x14bc8e0, 0x1e14c30, 0x15b8f00)
I0727 13:58:42.579] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:96 +0x3d
I0727 13:58:42.579] net/http.(*Server).Serve(0xc4202c5450, 0x17212c0, 0xc4200be900, 0x0, 0x0)
I0727 13:58:42.579] 	/usr/local/go/src/net/http/server.go:2770 +0x1f6
I0727 13:58:42.580] github.com/knative/serving/pkg/autoscaler/statserver.(*Server).serve(0xc4202c5440, 0x1720e00, 0xc4200be900, 0x0, 0x0)
I0727 13:58:42.580] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:84 +0x96
I0727 13:58:42.580] github.com/knative/serving/pkg/autoscaler/statserver.(*Server).ListenAndServe(0xc4202c5440, 0x165d050, 0xc4200bd5e0)
I0727 13:58:42.580] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:74 +0x87
I0727 13:58:42.580] github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle.func1(0xc4200bd5e0, 0xc4202c5440, 0xc42031e0f0)
I0727 13:58:42.580] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:45 +0x67
I0727 13:58:42.580] created by github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle
I0727 13:58:42.580] 	/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:43 +0x243
I0727 13:58:42.580] 
I0727 13:58:42.581] rax    0xfffffffffffffffc
I0727 13:58:42.581] rbx    0xffffffff
I0727 13:58:42.581] rcx    0x48a0b0
I0727 13:58:42.581] rdx    0x80
I0727 13:58:42.581] rdi    0x5
I0727 13:58:42.581] rsi    0x7ffc21b1ac90
I0727 13:58:42.581] rbp    0x7ffc21b1b290
I0727 13:58:42.581] rsp    0x7ffc21b1ac50
I0727 13:58:42.581] r8     0x0
I0727 13:58:42.581] r9     0x0
I0727 13:58:42.581] r10    0xffffffff
I0727 13:58:42.581] r11    0x246
I0727 13:58:42.581] r12    0xc420324af8
I0727 13:58:42.581] r13    0x1e27a20
I0727 13:58:42.581] r14    0xc4202ded80
I0727 13:58:42.581] r15    0x4c63a4
I0727 13:58:42.582] rip    0x48a0b0
I0727 13:58:42.582] rflags 0x246
I0727 13:58:42.582] cs     0x33
I0727 13:58:42.582] fs     0x0
I0727 13:58:42.582] gs     0x0
I0727 13:58:42.582] *** Test killed with quit: ran too long (10m0s).
I0727 13:58:42.582] FAIL	github.com/knative/serving/pkg/autoscaler/statserver	600.268s
I0727 13:58:42.582] ?   	github.com/knative/serving/pkg/client/clientset/versioned	[no test files]
I0727 13:58:42.582] ?   	github.com/knative/serving/pkg/client/clientset/versioned/fake	[no test files]
I0727 13:58:42.582] ?   	github.com/knative/serving/pkg/client/clientset/versioned/scheme	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/clientset/versioned/typed/istio/v1alpha3	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/clientset/versioned/typed/istio/v1alpha3/fake	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1/fake	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/informers/externalversions	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/informers/externalversions/internalinterfaces	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/informers/externalversions/istio	[no test files]
I0727 13:58:42.583] ?   	github.com/knative/serving/pkg/client/informers/externalversions/istio/v1alpha3	[no test files]
I0727 13:58:42.584] ?   	github.com/knative/serving/pkg/client/informers/externalversions/serving	[no test files]
I0727 13:58:42.584] ?   	github.com/knative/serving/pkg/client/informers/externalversions/serving/v1alpha1	[no test files]
I0727 13:58:42.584] ?   	github.com/knative/serving/pkg/client/listers/istio/v1alpha3	[no test files]
I0727 13:58:42.584] ?   	github.com/knative/serving/pkg/client/listers/serving/v1alpha1	[no test files]
I0727 13:58:42.584] ?   	github.com/knative/serving/pkg/controller	[no test files]
@glyn
Copy link
Contributor

glyn commented Jul 27, 2018

Thanks for spotting this @dprotaso.

go test -v -count=1000 -run TestServerLifecycle -timeout 10s reproduces it more quickly.

@glyn
Copy link
Contributor

glyn commented Jul 27, 2018

tl;dr: looks like this is caused by Go bug 20239.
See this example which reproduces the deadlock in the Go playground.

By adding various log statements both in statsserver/server.go and in http/server.go it seems that, in the failing case, the server does not return from Accept().

Compare a passing case:

=== RUN   TestServerLifecycle
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:81	Starting	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:74	ListenAndServe about to serve	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:87	serve() about to call s.wsSrv.Serve	{"address": "127.0.0.1:0"}
2018/07/27 16:52:55 http/server.go Server() about to call srv.trackListener
2018/07/27 16:52:55 http/server.go Server() about to call l.Accept()
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:168	Shutting down	{"address": "127.0.0.1:0"}
2018/07/27 16:52:55 http/server.go Shutdown() entered
2018/07/27 16:52:55 http/server.go Server() Accept returned: accept tcp 127.0.0.1:57240: use of closed network connection
2018/07/27 16:52:55 http/server.go closeListenersLocked() returned: <nil>
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:182	Listener shut down	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:194	Waiting for shutdown to complete	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:89	s.wsSrv.Serve returned http: Server closed	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:188	Waiting for open connections to close	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:190	Open connections closed	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:76	ListenAndServe returning: <nil>	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:197	Shutdown complete	{"address": "127.0.0.1:0"}
--- PASS: TestServerLifecycle (0.00s)

with a failing case:

=== RUN   TestServerLifecycle
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:81	Starting	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:74	ListenAndServe about to serve	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:168	Shutting down	{"address": "127.0.0.1:0"}
2018/07/27 16:52:55 http/server.go Shutdown() entered
2018/07/27 16:52:55 http/server.go closeListenersLocked() returned: <nil>
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:87	serve() about to call s.wsSrv.Serve	{"address": "127.0.0.1:0"}
2018/07/27 16:52:55 http/server.go Server() about to call srv.trackListener
2018/07/27 16:52:55 http/server.go Server() about to call l.Accept()
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:182	Listener shut down	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:194	Waiting for shutdown to complete	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:188	Waiting for open connections to close	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.739+0100	INFO	stats-websocket-server	statserver/server.go:190	Open connections closed	{"address": "127.0.0.1:0"}
2018-07-27T16:52:55.740+0100	INFO	stats-websocket-server	statserver/server.go:197	Shutdown complete	{"address": "127.0.0.1:0"}
panic: test timed out after 10s

goroutine 925 [running]:
testing.(*M).startAlarm.func1()
	/usr/local/opt/go/libexec/src/testing/testing.go:1240 +0xfc
created by time.goFunc
	/usr/local/opt/go/libexec/src/time/sleep.go:172 +0x44

goroutine 1 [chan receive]:
testing.(*T).Run(0xc420347950, 0x1bd1336, 0x13, 0x1c3d288, 0x107a5d6)
	/usr/local/opt/go/libexec/src/testing/testing.go:825 +0x301
testing.runTests.func1(0xc420347860)
	/usr/local/opt/go/libexec/src/testing/testing.go:1063 +0x64
testing.tRunner(0xc420347860, 0xc420095df8)
	/usr/local/opt/go/libexec/src/testing/testing.go:777 +0xd0
testing.runTests(0xc420172220, 0x22b2420, 0x4, 0x4, 0x1012549)
	/usr/local/opt/go/libexec/src/testing/testing.go:1061 +0x2c4
testing.(*M).Run(0xc42033e000, 0x0)
	/usr/local/opt/go/libexec/src/testing/testing.go:978 +0x171
main.main()
	_testmain.go:50 +0x151

goroutine 19 [chan receive]:
github.com/knative/serving/vendor/github.com/golang/glog.(*loggingT).flushDaemon(0x22bc660)
	/Users/gnormington/go/src/github.com/knative/serving/vendor/github.com/golang/glog/glog.go:882 +0x8b
created by github.com/knative/serving/vendor/github.com/golang/glog.init.0
	/Users/gnormington/go/src/github.com/knative/serving/vendor/github.com/golang/glog/glog.go:410 +0x203

goroutine 21 [select]:
github.com/knative/serving/vendor/go.opencensus.io/stats/view.(*worker).start(0xc420306e80)
	/Users/gnormington/go/src/github.com/knative/serving/vendor/go.opencensus.io/stats/view/worker.go:144 +0x11d
created by github.com/knative/serving/vendor/go.opencensus.io/stats/view.init.0
	/Users/gnormington/go/src/github.com/knative/serving/vendor/go.opencensus.io/stats/view/worker.go:29 +0x58

goroutine 923 [semacquire]:
sync.runtime_Semacquire(0xc420042d1c)
	/usr/local/opt/go/libexec/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc420042d10)
	/usr/local/opt/go/libexec/src/sync/waitgroup.go:129 +0x72
github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle(0xc420347950)
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:54 +0x176
testing.tRunner(0xc420347950, 0x1c3d288)
	/usr/local/opt/go/libexec/src/testing/testing.go:777 +0xd0
created by testing.(*T).Run
	/usr/local/opt/go/libexec/src/testing/testing.go:824 +0x2e0

goroutine 924 [IO wait]:
internal/poll.runtime_pollWait(0x2795080, 0x72, 0x0)
	/usr/local/opt/go/libexec/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc42038ae18, 0x72, 0x0, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/internal/poll/fd_poll_runtime.go:85 +0x9b
internal/poll.(*pollDesc).waitRead(0xc42038ae18, 0xffffffffffffff00, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Accept(0xc42038ae00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/internal/poll/fd_unix.go:372 +0x1a8
net.(*netFD).accept(0xc42038ae00, 0x22bc480, 0xc4203c8d70, 0x125fdf0)
	/usr/local/opt/go/libexec/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc4203c22a0, 0x30, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/net/tcpsock_posix.go:136 +0x2e
net.(*TCPListener).AcceptTCP(0xc4203c22a0, 0x0, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/net/tcpsock.go:246 +0x49
github.com/knative/serving/pkg/autoscaler/statserver.keepAlive.Accept(0xc4203c22a0, 0x1bee406, 0x30, 0x0, 0x0)
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:101 +0x2f
net/http.(*Server).Serve(0xc420454910, 0x1cb3a20, 0xc4203c22a0, 0x0, 0x0)
	/usr/local/opt/go/libexec/src/net/http/server.go:2776 +0x213
github.com/knative/serving/pkg/autoscaler/statserver.(*Server).serve(0xc420454900, 0x1cb3560, 0xc4203c22a0, 0x1, 0x0)
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:88 +0xc7
github.com/knative/serving/pkg/autoscaler/statserver.(*Server).ListenAndServe(0xc420454900, 0x1c3eb98, 0xc420042d10)
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server.go:75 +0xd2
github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle.func1(0xc420042d10, 0xc420454900, 0xc420347950)
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:46 +0x59
created by github.com/knative/serving/pkg/autoscaler/statserver_test.TestServerLifecycle
	/Users/gnormington/go/src/github.com/knative/serving/pkg/autoscaler/statserver/server_test.go:44 +0x151
exit status 2
FAIL	github.com/knative/serving/pkg/autoscaler/statserver	10.033s

Notice that in the successful case, srv.trackListener is called before closeListenersLocked, whereas in the failing case, these occur in the opposite order. In that case, the listener is not tracked and so is not closed by Shutdown and so Accept blocks indefinitely.

This is essentially the bug mentioned at the start of this comment, http/server.go has a race: Server.Serve() does not shutdown reliably if called after Server.Shutdown().

Interestingly, the test passes reliably if it waits for the server to get going before shutting it down, thus, which isn't a terrible workaround:

func TestServerLifecycle(t *testing.T) {
	statsCh := make(chan *autoscaler.StatMessage)
	server := stats.NewTestServer(statsCh)

	wg := sync.WaitGroup{}
	wg.Add(1)
	go func() {
		defer wg.Done()
		err := server.ListenAndServe()
		if err != nil {
			t.Fatal("ListenAndServe failed.", err)
		}
	}()

	// Ensure server is stable before shutting it down
	statSink := dialOk(server.ListenAddr(), t)
	closeSink(statSink, t)

	server.Shutdown(time.Second)

	wg.Wait()
}

@dprotaso
Copy link
Member Author

/assign @dprotaso

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants