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

Skip to content

Commit 8e61cac

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 8e61cac

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-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

+17-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package provisionersdk
33
import (
44
"context"
55
"io"
6+
"sync"
67

78
"github.com/hashicorp/yamux"
89
"storj.io/drpc"
@@ -22,16 +23,16 @@ func TransportPipe() (*yamux.Session, *yamux.Session) {
2223
yamuxConfig := yamux.DefaultConfig()
2324
yamuxConfig.LogOutput = io.Discard
2425
client, err := yamux.Client(&readWriteCloser{
25-
ReadCloser: clientReader,
26-
Writer: serverWriter,
26+
ReadCloser: clientReader,
27+
WriteCloser: serverWriter,
2728
}, yamuxConfig)
2829
if err != nil {
2930
panic(err)
3031
}
3132

3233
server, err := yamux.Server(&readWriteCloser{
33-
ReadCloser: serverReader,
34-
Writer: clientWriter,
34+
ReadCloser: serverReader,
35+
WriteCloser: clientWriter,
3536
}, yamuxConfig)
3637
if err != nil {
3738
panic(err)
@@ -45,8 +46,19 @@ func Conn(session *yamux.Session) drpc.Conn {
4546
}
4647

4748
type readWriteCloser struct {
49+
closeMutex sync.Mutex
4850
io.ReadCloser
49-
io.Writer
51+
io.WriteCloser
52+
}
53+
54+
func (c *readWriteCloser) Close() error {
55+
c.closeMutex.Lock()
56+
defer c.closeMutex.Unlock()
57+
err := c.ReadCloser.Close()
58+
if err != nil {
59+
return err
60+
}
61+
return c.WriteCloser.Close()
5062
}
5163

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

0 commit comments

Comments
 (0)