Skip to content

Commit 2fa5447

Browse files
authored
BUGFIX: process incoming response correctly if request has been cancelled. (#70)
1 parent e5e6690 commit 2fa5447

File tree

4 files changed

+42
-32
lines changed

4 files changed

+42
-32
lines changed

core/transport/transport.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (p *Transport) Start(ctx context.Context) error {
164164
if err == io.EOF {
165165
return nil
166166
}
167-
return errors.Wrap(err, "read and delivery frame failed")
167+
return errors.Wrap(err, "dispatch incoming frame failed")
168168
}
169169
}
170170
}
@@ -177,54 +177,51 @@ func (p *Transport) DispatchFrame(_ context.Context, frame core.Frame) (err erro
177177

178178
var handler FrameHandler
179179

180-
p.RLock()
181-
defer p.RUnlock()
182-
183180
switch t {
184181
case core.FrameTypeSetup:
185182
p.maxLifetime = frame.(*framing.SetupFrame).MaxLifetime()
186-
handler = p.handlers[OnSetup]
183+
handler = p.getHandler(OnSetup)
187184
case core.FrameTypeResume:
188-
handler = p.handlers[OnResume]
185+
handler = p.getHandler(OnResume)
189186
case core.FrameTypeResumeOK:
190187
p.lastRcvPos = frame.(*framing.ResumeOKFrame).LastReceivedClientPosition()
191-
handler = p.handlers[OnResumeOK]
188+
handler = p.getHandler(OnResumeOK)
192189
case core.FrameTypeRequestFNF:
193-
handler = p.handlers[OnFireAndForget]
190+
handler = p.getHandler(OnFireAndForget)
194191
case core.FrameTypeMetadataPush:
195192
if sid != 0 {
196193
// skip invalid metadata push
197-
logger.Warnf("rsocket.Transport: omit MetadataPush with non-zero stream id %d\n", sid)
194+
logger.Warnf("rsocket: omit MetadataPush with non-zero stream id %d\n", sid)
198195
return
199196
}
200-
handler = p.handlers[OnMetadataPush]
197+
handler = p.getHandler(OnMetadataPush)
201198
case core.FrameTypeRequestResponse:
202-
handler = p.handlers[OnRequestResponse]
199+
handler = p.getHandler(OnRequestResponse)
203200
case core.FrameTypeRequestStream:
204-
handler = p.handlers[OnRequestStream]
201+
handler = p.getHandler(OnRequestStream)
205202
case core.FrameTypeRequestChannel:
206-
handler = p.handlers[OnRequestChannel]
203+
handler = p.getHandler(OnRequestChannel)
207204
case core.FrameTypePayload:
208-
handler = p.handlers[OnPayload]
205+
handler = p.getHandler(OnPayload)
209206
case core.FrameTypeRequestN:
210-
handler = p.handlers[OnRequestN]
207+
handler = p.getHandler(OnRequestN)
211208
case core.FrameTypeError:
212209
if sid == 0 {
213210
err = errors.New(frame.(*framing.ErrorFrame).Error())
214-
if call := p.handlers[OnErrorWithZeroStreamID]; call != nil {
211+
if call := p.getHandler(OnErrorWithZeroStreamID); call != nil {
215212
_ = call(frame)
216213
}
217214
return
218215
}
219-
handler = p.handlers[OnError]
216+
handler = p.getHandler(OnError)
220217
case core.FrameTypeCancel:
221-
handler = p.handlers[OnCancel]
218+
handler = p.getHandler(OnCancel)
222219
case core.FrameTypeKeepalive:
223220
ka := frame.(*framing.KeepaliveFrame)
224221
p.lastRcvPos = ka.LastReceivedPosition()
225-
handler = p.handlers[OnKeepalive]
222+
handler = p.getHandler(OnKeepalive)
226223
case core.FrameTypeLease:
227-
handler = p.handlers[OnLease]
224+
handler = p.getHandler(OnLease)
228225
}
229226

230227
// Set deadline.
@@ -248,6 +245,12 @@ func (p *Transport) DispatchFrame(_ context.Context, frame core.Frame) (err erro
248245
return
249246
}
250247

248+
func (p *Transport) getHandler(t EventType) FrameHandler {
249+
p.RLock()
250+
defer p.RUnlock()
251+
return p.handlers[t]
252+
}
253+
251254
// NewTransport creates a new transport.
252255
func NewTransport(c Conn) *Transport {
253256
return &Transport{

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/golang/mock v1.4.3
77
github.com/google/uuid v1.1.1
88
github.com/gorilla/websocket v1.4.1
9-
github.com/jjeffcaii/reactor-go v0.2.4
9+
github.com/jjeffcaii/reactor-go v0.2.5
1010
github.com/pkg/errors v0.9.1
1111
github.com/stretchr/testify v1.4.0
1212
github.com/urfave/cli/v2 v2.1.1

go.sum

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
1010
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1111
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
1212
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
13-
github.com/jjeffcaii/reactor-go v0.2.4 h1:Q3N/0Ngt1Ywi7ezye2LQ+mU1vNdHxyG5ZRk3W2EWmYA=
14-
github.com/jjeffcaii/reactor-go v0.2.4/go.mod h1:I4qZrpZcsqjzo3pjq0XWGBTpdFXB95XeYinrPYETNL4=
13+
github.com/jjeffcaii/reactor-go v0.2.5 h1:6jVIWgaVBUx1qiWLZNWU/j+dbbirje6GntS/I8RKARI=
14+
github.com/jjeffcaii/reactor-go v0.2.5/go.mod h1:I4qZrpZcsqjzo3pjq0XWGBTpdFXB95XeYinrPYETNL4=
1515
github.com/panjf2000/ants/v2 v2.4.1 h1:7RtUqj5lGOw0WnZhSKDZ2zzJhaX5490ZW1sUolRXCxY=
1616
github.com/panjf2000/ants/v2 v2.4.1/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
1717
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -31,6 +31,7 @@ github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2
3131
go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM=
3232
go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
3333
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
34+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
3435
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
3536
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
3637
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -40,8 +41,10 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq
4041
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
4142
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
4243
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
44+
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U=
4345
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
4446
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
47+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
4548
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
4649
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
4750
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=

internal/socket/duplex.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,10 @@ func (dc *DuplexConnection) onFrameCancel(frame core.Frame) (err error) {
659659

660660
v, ok := dc.messages.Load(sid)
661661
if !ok {
662-
logger.Warnf("nothing cancelled: sid=%d\n", sid)
662+
dc.fragments.Delete(sid)
663+
if logger.IsDebugEnabled() {
664+
logger.Debugf("unmatched frame CANCEL(id=%d), maybe original request has been cancelled\n", sid)
665+
}
663666
return
664667
}
665668

@@ -680,12 +683,14 @@ func (dc *DuplexConnection) onFrameCancel(frame core.Frame) (err error) {
680683

681684
func (dc *DuplexConnection) onFrameError(input core.Frame) (err error) {
682685
f := input.(*framing.ErrorFrame)
683-
logger.Errorf("handle error frame: %s\n", f)
684686
sid := f.Header().StreamID()
685687

686688
v, ok := dc.messages.Load(sid)
687689
if !ok {
688-
err = fmt.Errorf("invalid stream id: %d", sid)
690+
dc.fragments.Delete(sid)
691+
if logger.IsDebugEnabled() {
692+
logger.Debugf("unmatched frame ERROR(id=%d), maybe original request has been cancelled\n", sid)
693+
}
689694
return
690695
}
691696

@@ -707,8 +712,9 @@ func (dc *DuplexConnection) onFrameRequestN(input core.Frame) (err error) {
707712
sid := f.Header().StreamID()
708713
v, ok := dc.messages.Load(sid)
709714
if !ok {
715+
dc.fragments.Delete(sid)
710716
if logger.IsDebugEnabled() {
711-
logger.Debugf("ignore non-exists RequestN: id=%d\n", sid)
717+
logger.Debugf("unmatched frame REQUEST_N(id=%d), maybe original request has been cancelled\n", sid)
712718
}
713719
return
714720
}
@@ -720,8 +726,6 @@ func (dc *DuplexConnection) onFrameRequestN(input core.Frame) (err error) {
720726
vv.snd.Request(n)
721727
case requestChannelCallbackReverse:
722728
vv.snd.Request(n)
723-
default:
724-
panic(fmt.Errorf("illegal requestN for %+v", vv))
725729
}
726730
return
727731
}
@@ -771,7 +775,9 @@ func (dc *DuplexConnection) onFramePayload(frame core.Frame) error {
771775
sid := h.StreamID()
772776
v, ok := dc.messages.Load(sid)
773777
if !ok {
774-
logger.Warnf("unoccupied Payload(id=%d), maybe it has been canceled(server=%T)\n", sid, dc.sids)
778+
if logger.IsDebugEnabled() {
779+
logger.Debugf("unmatched frame PAYLOAD(id=%d), maybe original request has been cancelled\n", sid)
780+
}
775781
return nil
776782
}
777783

@@ -806,8 +812,6 @@ func (dc *DuplexConnection) onFramePayload(frame core.Frame) error {
806812
if fg.Check(core.FlagComplete) {
807813
vv.rcv.Complete()
808814
}
809-
default:
810-
panic(fmt.Errorf("illegal Payload for %v", vv))
811815
}
812816
return nil
813817
}

0 commit comments

Comments
 (0)