Skip to content

Commit 6eaa8ce

Browse files
Bug: For Logon/Logout/Resend/SequenceReset messages we should wait until sent (#21)
## Issue When log on request was queued because cannot be send due to connection not ready, Then it goes through the [main session loop](https://github.com/alpacahq/quickfix/blob/5dcde41f3e6e68e93e1fd381761cd9c7843aec43/session.go#L821-L841) which leads to [SendAppMessages](https://github.com/alpacahq/quickfix/blob/5dcde41f3e6e68e93e1fd381761cd9c7843aec43/session_state.go#L107-L111) But, since session is not logged on yet because the message queued is the log on message, we drop the `toSend` queued messages so we lose the log on message itself. ## Proposed solution For important messages like Logon/Logout/Resend/SequenceReset we block until sent.
1 parent 3594015 commit 6eaa8ce

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

logon_state_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooHigh() {
333333
s.Require().Nil(err)
334334
s.MessageType(string(msgTypeLogon), sentMessage)
335335

336-
s.session.sendQueued()
336+
s.session.sendQueued(true)
337337
s.MessageType(string(msgTypeResendRequest), s.MockApp.lastToAdmin)
338338
s.FieldEquals(tagBeginSeqNo, 1, s.MockApp.lastToAdmin.Body)
339339

@@ -373,7 +373,7 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooLow() {
373373
s.Require().Nil(err)
374374
s.MessageType(string(msgTypeLogout), sentMessage)
375375

376-
s.session.sendQueued()
376+
s.session.sendQueued(true)
377377
s.MessageType(string(msgTypeLogout), s.MockApp.lastToAdmin)
378378
s.FieldEquals(tagText, "MsgSeqNum too low, expecting 2 but received 1", s.MockApp.lastToAdmin.Body)
379379
}

session.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ func (s *session) sendInReplyTo(msg *Message, inReplyTo *Message) error {
265265
}
266266

267267
s.toSend = append(s.toSend, msgBytes)
268-
s.sendQueued()
268+
s.sendQueued(true)
269269

270270
return nil
271271
}
@@ -294,7 +294,7 @@ func (s *session) dropAndSendInReplyTo(msg *Message, inReplyTo *Message) error {
294294

295295
s.dropQueued()
296296
s.toSend = append(s.toSend, msgBytes)
297-
s.sendQueued()
297+
s.sendQueued(true)
298298

299299
return nil
300300
}
@@ -350,9 +350,9 @@ func (s *session) persist(seqNum int, msgBytes []byte) error {
350350
return s.store.IncrNextSenderMsgSeqNum()
351351
}
352352

353-
func (s *session) sendQueued() {
353+
func (s *session) sendQueued(blockUntilSent bool) {
354354
for i, msgBytes := range s.toSend {
355-
if !s.sendBytes(msgBytes) {
355+
if !s.sendBytes(msgBytes, blockUntilSent) {
356356
s.toSend = s.toSend[i:]
357357
s.notifyMessageOut()
358358
return
@@ -371,15 +371,22 @@ func (s *session) EnqueueBytesAndSend(msg []byte) {
371371
defer s.sendMutex.Unlock()
372372

373373
s.toSend = append(s.toSend, msg)
374-
s.sendQueued()
374+
s.sendQueued(true)
375375
}
376376

377-
func (s *session) sendBytes(msg []byte) bool {
377+
func (s *session) sendBytes(msg []byte, blockUntilSent bool) bool {
378378
if s.messageOut == nil {
379379
s.log.OnEventf("Failed to send: disconnected")
380380
return false
381381
}
382382

383+
if blockUntilSent {
384+
s.messageOut <- msg
385+
s.log.OnOutgoing(msg)
386+
s.stateTimer.Reset(s.HeartBtInt)
387+
return true
388+
}
389+
383390
select {
384391
case s.messageOut <- msg:
385392
s.log.OnOutgoing(msg)

session_state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (sm *stateMachine) SendAppMessages(session *session) {
105105
defer session.sendMutex.Unlock()
106106

107107
if session.IsLoggedOn() {
108-
session.sendQueued()
108+
session.sendQueued(false)
109109
} else {
110110
session.dropQueued()
111111
}

0 commit comments

Comments
 (0)