Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cec2de3

Browse files
committed
fix: Race when writing to a closed pipe
This is such an intermittent race it's difficult to track, but regardless this is an improvement to the code.
1 parent 9b19dc9 commit cec2de3

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

provisionersdk/serve.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser
3131
if options.Listener == nil {
3232
config := yamux.DefaultConfig()
3333
config.LogOutput = io.Discard
34-
stdio, err := yamux.Server(readWriteCloser{
35-
ReadCloser: os.Stdin,
36-
Writer: os.Stdout,
34+
stdio, err := yamux.Server(&readWriteCloser{
35+
ReadCloser: os.Stdin,
36+
WriteCloser: os.Stdout,
3737
}, config)
3838
if err != nil {
3939
return xerrors.Errorf("create yamux: %w", err)
@@ -54,6 +54,9 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser
5454
// short-lived processes that can be executed concurrently.
5555
err = srv.Serve(ctx, options.Listener)
5656
if err != nil {
57+
if errors.Is(err, io.EOF) {
58+
return nil
59+
}
5760
if errors.Is(err, context.Canceled) {
5861
return nil
5962
}

provisionersdk/transport.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ func TransportPipe() (*yamux.Session, *yamux.Session) {
2222
yamuxConfig := yamux.DefaultConfig()
2323
yamuxConfig.LogOutput = io.Discard
2424
client, err := yamux.Client(&readWriteCloser{
25-
ReadCloser: clientReader,
26-
Writer: serverWriter,
25+
ReadCloser: clientReader,
26+
WriteCloser: serverWriter,
2727
}, yamuxConfig)
2828
if err != nil {
2929
panic(err)
3030
}
3131

3232
server, err := yamux.Server(&readWriteCloser{
33-
ReadCloser: serverReader,
34-
Writer: clientWriter,
33+
ReadCloser: serverReader,
34+
WriteCloser: clientWriter,
3535
}, yamuxConfig)
3636
if err != nil {
3737
panic(err)
@@ -46,7 +46,15 @@ func Conn(session *yamux.Session) drpc.Conn {
4646

4747
type readWriteCloser struct {
4848
io.ReadCloser
49-
io.Writer
49+
io.WriteCloser
50+
}
51+
52+
func (c *readWriteCloser) Close() error {
53+
err := c.ReadCloser.Close()
54+
if err != nil {
55+
return err
56+
}
57+
return c.WriteCloser.Close()
5058
}
5159

5260
// Allows concurrent requests on a single dRPC connection.

0 commit comments

Comments
 (0)