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

Lines changed: 6 additions & 3 deletions
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

Lines changed: 17 additions & 5 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy