Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8e61cac

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 parent9b19dc9 commit8e61cac

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
ifoptions.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
iferr!=nil {
3939
returnxerrors.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
iferr!=nil {
57+
iferrors.Is(err,io.EOF) {
58+
returnnil
59+
}
5760
iferrors.Is(err,context.Canceled) {
5861
returnnil
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
iferr!=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
iferr!=nil {
3738
panic(err)
@@ -45,8 +46,19 @@ func Conn(session *yamux.Session) drpc.Conn {
4546
}
4647

4748
typereadWriteCloserstruct {
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+
deferc.closeMutex.Unlock()
57+
err:=c.ReadCloser.Close()
58+
iferr!=nil {
59+
returnerr
60+
}
61+
returnc.WriteCloser.Close()
5062
}
5163

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp