Skip to content

Commit

Permalink
Relay should handle error frames, and finish relays after errors
Browse files Browse the repository at this point in the history
  • Loading branch information
prashantv committed Apr 21, 2016
1 parent 5c56c73 commit 848b2f7
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
2 changes: 1 addition & 1 deletion connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ func (c *Connection) readFrames(_ uint32) {
func (c *Connection) handleFrameRelay(frame *Frame) bool {
// TODO: handle error frames.
switch frame.Header.messageType {
case messageTypeCallReq, messageTypeCallReqContinue, messageTypeCallRes, messageTypeCallResContinue:
case messageTypeCallReq, messageTypeCallReqContinue, messageTypeCallRes, messageTypeCallResContinue, messageTypeError:
if err := c.relay.Relay(frame); err != nil {
c.log.WithFields(
LogField{"header", frame.Header},
Expand Down
3 changes: 2 additions & 1 deletion relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,10 +244,11 @@ func frameTypeFor(f *Frame) frameType {
// this RPC req-res.
func finishesCall(f *Frame) bool {
switch f.messageType() {
case messageTypeError:
return true
case messageTypeCallRes, messageTypeCallResContinue:
flags := f.Payload[_flagsIndex]
return flags&hasMoreFragmentsFlag == 0
// TODO: errors should also terminate an RPC.
default:
return false
}
Expand Down
19 changes: 19 additions & 0 deletions relay_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,5 +213,24 @@ func TestRelayErrorUnknownPeer(t *testing.T) {
assert.Equal(t, ErrCodeDeclined, se.Code(), "Expected Declined error")
assert.Contains(t, err.Error(), `no peers for "random-service"`, "Unexpected error")
})
}

func TestErrorFrameEndsRelay(t *testing.T) {
// withRelayTest validates that there are no relay items left after the given func.
withRelayTest(t, func(rt *relayTest) {
rt.newServer("svc", testutils.NewOpts().AddLogFilter("Couldn't find handler", 1))
client := rt.newClient("client", nil)

err := testutils.CallEcho(client, rt.relay.PeerInfo().HostPort, "svc", nil)
if !assert.Error(t, err, "Expected error due to unknown method") {
return
}

se, ok := err.(SystemError)
if !assert.True(t, ok, "err should be a SystemError, got %T", err) {
return
}

assert.Equal(t, ErrCodeBadRequest, se.Code(), "Expected BadRequest error")
})
}

0 comments on commit 848b2f7

Please sign in to comment.