Skip to content

Commit b7b2f17

Browse files
authored
Merge pull request #459 from adam-talos/doNotCheckStalenessOnResend
Prevent staleness check from happening during replay
2 parents 8e701cc + 6dbde4a commit b7b2f17

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

resend_state_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package quickfix
1717

1818
import (
1919
"testing"
20+
"time"
2021

2122
"github.com/stretchr/testify/suite"
2223

@@ -189,3 +190,32 @@ func (s *resendStateTestSuite) TestFixMsgInResendChunk() {
189190
s.FieldEquals(tagBeginSeqNo, 3, s.MockApp.lastToAdmin.Body)
190191
s.FieldEquals(tagEndSeqNo, 0, s.MockApp.lastToAdmin.Body)
191192
}
193+
194+
// TestFixMsgResendWithOldSendingTime tests that we suspend staleness checks during replay
195+
// as a replayed message may be arbitrarily old.
196+
func (s *resendStateTestSuite) TestFixMsgResendWithOldSendingTime() {
197+
s.session.State = inSession{}
198+
s.ResendRequestChunkSize = 2
199+
200+
// In session expects seq number 1, send too high.
201+
s.MessageFactory.SetNextSeqNum(4)
202+
s.MockApp.On("ToAdmin")
203+
204+
msgSeqNum4 := s.NewOrderSingle()
205+
s.fixMsgIn(s.session, msgSeqNum4)
206+
207+
s.MockApp.AssertExpectations(s.T())
208+
s.State(resendState{})
209+
s.LastToAdminMessageSent()
210+
s.MessageType(string(msgTypeResendRequest), s.MockApp.lastToAdmin)
211+
s.FieldEquals(tagBeginSeqNo, 1, s.MockApp.lastToAdmin.Body)
212+
s.FieldEquals(tagEndSeqNo, 2, s.MockApp.lastToAdmin.Body)
213+
s.NextTargetMsgSeqNum(1)
214+
215+
msgSeqNum5 := s.NewOrderSingle()
216+
// Set the sending time far enough in the past to trip the staleness check.
217+
msgSeqNum5.Header.SetField(tagSendingTime, FIXUTCTimestamp{Time: time.Now().Add(-s.MaxLatency)})
218+
s.fixMsgIn(s.session, msgSeqNum5)
219+
s.State(resendState{})
220+
s.NextTargetMsgSeqNum(1)
221+
}

session.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -516,10 +516,14 @@ func (s *session) verifySelect(msg *Message, checkTooHigh bool, checkTooLow bool
516516
return reject
517517
}
518518

519-
if reject := s.checkSendingTime(msg); reject != nil {
520-
return reject
519+
switch s.stateMachine.State.(type) {
520+
case resendState:
521+
//Don't check staleness of a replay
522+
default:
523+
if reject := s.checkSendingTime(msg); reject != nil {
524+
return reject
525+
}
521526
}
522-
523527
if checkTooLow {
524528
if reject := s.checkTargetTooLow(msg); reject != nil {
525529
return reject

0 commit comments

Comments
 (0)