Skip to content

Commit 0379b05

Browse files
add logic to block messages when a rResend Request is active
1 parent d52789e commit 0379b05

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

in_session.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ func (state inSession) handleResendRequest(session *session, msg *Message) (next
210210
if err := state.resendMessages(session, int(beginSeqNo), endSeqNo, *msg); err != nil {
211211
return handleStateError(session, err)
212212
}
213+
session.isResendRequestActive = false
213214

214215
if err := session.checkTargetTooLow(msg); err != nil {
215216
return state
@@ -281,6 +282,7 @@ func (state inSession) resendMessages(session *session, beginSeqNo, endSeqNo int
281282
}
282283

283284
func (state inSession) processReject(session *session, msg *Message, rej MessageRejectError) sessionState {
285+
session.isResendRequestActive = false
284286
switch TypedError := rej.(type) {
285287
case targetTooHigh:
286288

in_session_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,26 @@ func (s *InSessionTestSuite) TestFIXMsgInResendRequestDoNotSendApp() {
373373
s.State(inSession{})
374374
}
375375

376+
func (s *InSessionTestSuite) TestIsResendRequestActive() {
377+
s.MockApp.On("FromAdmin").Return(nil)
378+
s.MockApp.On("ToApp").Return(nil)
379+
s.MockApp.On("ToAdmin")
380+
s.sendResendRequest(5, 10)
381+
s.True(s.isResendRequestActive)
382+
383+
nos := s.NewOrderSingle()
384+
err := s.session.sendInReplyTo(nos, nil)
385+
386+
s.Error(err)
387+
s.EqualError(err, "cannot send message while resend request is active")
388+
s.fixMsgIn(s.session, s.ResendRequest(5))
389+
s.False(s.isResendRequestActive)
390+
391+
err = s.session.sendInReplyTo(nos, nil)
392+
393+
s.NoError(err)
394+
}
395+
376396
func (s *InSessionTestSuite) TestFIXMsgInTargetTooLow() {
377397
s.IncrNextTargetMsgSeqNum()
378398

session.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ type session struct {
5252
sentReset bool
5353
stopOnce sync.Once
5454

55+
isResendRequestActive bool
56+
5557
targetDefaultApplVerID string
5658

5759
admin chan interface{}
@@ -305,6 +307,12 @@ func (s *session) sendInReplyTo(msg *Message, inReplyTo *Message) error {
305307
s.sendMutex.Lock()
306308
defer s.sendMutex.Unlock()
307309

310+
if blocked, err := s.isResendRequestBlocking(msg); err != nil {
311+
return err
312+
} else if blocked {
313+
return nil
314+
}
315+
308316
msgBytes, err := s.prepMessageForSend(msg, inReplyTo)
309317
if err != nil {
310318
return err
@@ -316,6 +324,20 @@ func (s *session) sendInReplyTo(msg *Message, inReplyTo *Message) error {
316324
return nil
317325
}
318326

327+
func (s *session) isResendRequestBlocking(msg *Message) (bool, error) {
328+
msgType, err := msg.Header.GetBytes(tagMsgType)
329+
if err != nil {
330+
return false, err
331+
}
332+
333+
if s.isResendRequestActive && !bytes.Equal(msgType, msgTypeResendRequest) {
334+
s.log.OnEvent("Message blocked: resend request in progress")
335+
return true, errors.New("cannot send message while resend request is active")
336+
}
337+
338+
return false, nil
339+
}
340+
319341
// dropAndReset will drop the send queue and reset the message store.
320342
func (s *session) dropAndReset() error {
321343
s.sendMutex.Lock()
@@ -477,6 +499,7 @@ func (s *session) sendResendRequest(beginSeq, endSeq int) (nextState resendState
477499
return
478500
}
479501
s.log.OnEventf("Sent ResendRequest FROM: %v TO: %v", beginSeq, endSeqNo)
502+
s.isResendRequestActive = true
480503

481504
return
482505
}

0 commit comments

Comments
 (0)