From dcc80e4553e4a9a9676d0fd35092cc1009bc148c Mon Sep 17 00:00:00 2001 From: Alexey Borzenkov Date: Sat, 26 May 2012 14:27:36 -0700 Subject: [PATCH] net/rpc: improve response reading logic CL 5956051 introduced too many call != nil checks, so attempt to improve this by splitting logic into three distinct parts. R=r CC=golang-dev https://golang.org/cl/6248048 --- src/pkg/net/rpc/client.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/pkg/net/rpc/client.go b/src/pkg/net/rpc/client.go index e19bd484bd..7d3d0bb9b8 100644 --- a/src/pkg/net/rpc/client.go +++ b/src/pkg/net/rpc/client.go @@ -116,24 +116,32 @@ func (client *Client) input() { delete(client.pending, seq) client.mutex.Unlock() - if call == nil || response.Error != "" { + switch { + case call == nil: + // We've got no pending call. That usually means that + // WriteRequest partially failed, and call was already + // removed; response is a server telling us about an + // error reading request body. We should still attempt + // to read error body, but there's no one to give it to. + err = client.codec.ReadResponseBody(nil) + if err != nil { + err = errors.New("reading error body: " + err.Error()) + } + case response.Error != "": // We've got an error response. Give this to the request; // any subsequent requests will get the ReadResponseBody // error if there is one. - if call != nil { - call.Error = ServerError(response.Error) - } + call.Error = ServerError(response.Error) err = client.codec.ReadResponseBody(nil) if err != nil { err = errors.New("reading error body: " + err.Error()) } - } else if response.Error == "" { + call.done() + default: err = client.codec.ReadResponseBody(call.Reply) if err != nil { call.Error = errors.New("reading body " + err.Error()) } - } - if call != nil { call.done() } } -- 2.48.1