zrepl/rpc/dataconn
Christian Schwarz a6b578b648 rpc/dataconn/stream: Conn: handle concurrent Close calls + goroutine leak fix
* Add Close() in closeState to identify the first closer
* Non-first closers get an error
* Reads and Writes from the Conn get an error if the conn was closed
  during the Read / Write was running
* The first closer starts _separate_ goroutine draining the c.frameReads channel
* The first closer then waits for the goroutine that fills c.frameReads
  to exit

refs 3bfe0c16d0
fixes #174

readFrames would block on `reads <-`
   but only after that would stream.Conn.readFrames close c.waitReadFramesDone
   which was too late because stream.Conn.Close would wait for c.waitReadFramesDone to be closed before draining the channel
                              ^^^^^^ (not frameconn.Conn, that closed successfully)

   195 @ 0x1032ae0 0x1006cab 0x1006c81 0x1006a65 0x15505be 0x155163e 0x1060bc1
           0x15505bd       github.com/zrepl/zrepl/rpc/dataconn/stream.readFrames+0x16d             github.com/zrepl/zrepl/rpc/dataconn/stream/stream.go:220
           0x155163d       github.com/zrepl/zrepl/rpc/dataconn/stream.(*Conn).readFrames+0xbd      github.com/zrepl/zrepl/rpc/dataconn/stream/stream_conn.go:71

   195 @ 0x1032ae0 0x10078c8 0x100789e 0x100758b 0x1552678 0x1557a4b 0x1556aec 0x1060bc1
           0x1552677       github.com/zrepl/zrepl/rpc/dataconn/stream.(*Conn).Close+0x77           github.com/zrepl/zrepl/rpc/dataconn/stream/stream_conn.go:191
           0x1557a4a       github.com/zrepl/zrepl/rpc/dataconn.(*Server).serveConn.func1+0x5a      github.com/zrepl/zrepl/rpc/dataconn/dataconn_server.go:93
           0x1556aeb       github.com/zrepl/zrepl/rpc/dataconn.(*Server).serveConn+0x87b           github.com/zrepl/zrepl/rpc/dataconn/dataconn_server.go:176
2019-09-29 19:05:54 +02:00
..
base2bufpool build: drop go Dep, switch to modules, support Go 1.13 2019-09-14 13:36:44 +02:00
frameconn rpc/dataconn/stream: Conn: handle concurrent Close calls + goroutine leak fix 2019-09-29 19:05:54 +02:00
heartbeatconn rpc/dataconn: fix I/O timeout on variable receive rate 2019-03-31 14:20:06 +02:00
microbenchmark replication/driver: automatic retries on connectivity-related errors 2019-03-13 15:00:40 +01:00
stream rpc/dataconn/stream: Conn: handle concurrent Close calls + goroutine leak fix 2019-09-29 19:05:54 +02:00
timeoutconn rpc/timeoutconn: platform-independent sizes for computing syscall.Iovec.Len 2019-08-19 18:11:25 +02:00
dataconn_client.go rpc/dataconn/client: ReqRecv to log level Debug 2019-09-28 11:49:20 +02:00
dataconn_debug.go run golangci-lint and apply suggested fixes 2019-03-27 13:12:26 +01:00
dataconn_server.go run golangci-lint and apply suggested fixes 2019-03-27 13:12:26 +01:00
dataconn_shared.go replication/driver: automatic retries on connectivity-related errors 2019-03-13 15:00:40 +01:00
dataconn_test.go rpc rewrite: control RPCs using gRPC + separate RPC for data transfer 2019-03-13 13:53:48 +01:00