From 46b24f78ab537fba6d5e43ce6ee9c5dbbb3e73bb Mon Sep 17 00:00:00 2001 From: kylecarbs Date: Tue, 31 May 2022 14:39:24 +0000 Subject: [PATCH] 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. --- provisionersdk/serve.go | 10 +++++++++- provisionersdk/transport.go | 20 ++++---------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/provisionersdk/serve.go b/provisionersdk/serve.go index 1fbe50d506850..0ecbf4d841eec 100644 --- a/provisionersdk/serve.go +++ b/provisionersdk/serve.go @@ -31,7 +31,7 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser if options.Listener == nil { config := yamux.DefaultConfig() config.LogOutput = io.Discard - stdio, err := yamux.Server(readWriteCloser{ + stdio, err := yamux.Server(&readWriteCloser{ ReadCloser: os.Stdin, Writer: os.Stdout, }, config) @@ -54,6 +54,9 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser // short-lived processes that can be executed concurrently. err = srv.Serve(ctx, options.Listener) if err != nil { + if errors.Is(err, io.EOF) { + return nil + } if errors.Is(err, context.Canceled) { return nil } @@ -67,3 +70,8 @@ func Serve(ctx context.Context, server proto.DRPCProvisionerServer, options *Ser } return nil } + +type readWriteCloser struct { + io.ReadCloser + io.Writer +} diff --git a/provisionersdk/transport.go b/provisionersdk/transport.go index 8e1a0069cf17a..39246622e6ce7 100644 --- a/provisionersdk/transport.go +++ b/provisionersdk/transport.go @@ -3,6 +3,7 @@ package provisionersdk import ( "context" "io" + "net" "github.com/hashicorp/yamux" "storj.io/drpc" @@ -17,22 +18,14 @@ const ( // TransportPipe creates an in-memory pipe for dRPC transport. func TransportPipe() (*yamux.Session, *yamux.Session) { - clientReader, clientWriter := io.Pipe() - serverReader, serverWriter := io.Pipe() + c1, c2 := net.Pipe() yamuxConfig := yamux.DefaultConfig() yamuxConfig.LogOutput = io.Discard - client, err := yamux.Client(&readWriteCloser{ - ReadCloser: clientReader, - Writer: serverWriter, - }, yamuxConfig) + client, err := yamux.Client(c1, yamuxConfig) if err != nil { panic(err) } - - server, err := yamux.Server(&readWriteCloser{ - ReadCloser: serverReader, - Writer: clientWriter, - }, yamuxConfig) + server, err := yamux.Server(c2, yamuxConfig) if err != nil { panic(err) } @@ -44,11 +37,6 @@ func Conn(session *yamux.Session) drpc.Conn { return &multiplexedDRPC{session} } -type readWriteCloser struct { - io.ReadCloser - io.Writer -} - // Allows concurrent requests on a single dRPC connection. // Required for calling functions concurrently. type multiplexedDRPC struct { 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