]> Cypherpunks repositories - gostls13.git/commitdiff
net/rpc: improve response reading logic
authorAlexey Borzenkov <snaury@gmail.com>
Sat, 26 May 2012 21:27:36 +0000 (14:27 -0700)
committerRob Pike <r@golang.org>
Sat, 26 May 2012 21:27:36 +0000 (14:27 -0700)
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

index e19bd484bd8be198ecda1e55cfc82cd1d83ac4af..7d3d0bb9b8761331a4bc6bab321508a8fbcf2b66 100644 (file)
@@ -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()
                }
        }