Skip to content

Commit 51e2cde

Browse files
authored
Merge pull request #615 from alpacahq/escape-send-queued-when-blocked
Escape send queued when blocked on connection side
2 parents e155413 + 5dcde41 commit 51e2cde

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
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: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,16 @@ func (s *session) queueForSend(msg *Message) error {
235235

236236
s.toSend = append(s.toSend, msgBytes)
237237

238+
s.notifyMessageOut()
239+
240+
return nil
241+
}
242+
243+
func (s *session) notifyMessageOut() {
238244
select {
239245
case s.messageEvent <- true:
240246
default:
241247
}
242-
243-
return nil
244248
}
245249

246250
// send will validate, persist, queue the message. If the session is logged on, send all messages in the queue.
@@ -261,7 +265,7 @@ func (s *session) sendInReplyTo(msg *Message, inReplyTo *Message) error {
261265
}
262266

263267
s.toSend = append(s.toSend, msgBytes)
264-
s.sendQueued()
268+
s.sendQueued(true)
265269

266270
return nil
267271
}
@@ -290,7 +294,7 @@ func (s *session) dropAndSendInReplyTo(msg *Message, inReplyTo *Message) error {
290294

291295
s.dropQueued()
292296
s.toSend = append(s.toSend, msgBytes)
293-
s.sendQueued()
297+
s.sendQueued(true)
294298

295299
return nil
296300
}
@@ -346,9 +350,13 @@ func (s *session) persist(seqNum int, msgBytes []byte) error {
346350
return s.store.IncrNextSenderMsgSeqNum()
347351
}
348352

349-
func (s *session) sendQueued() {
350-
for _, msgBytes := range s.toSend {
351-
s.sendBytes(msgBytes)
353+
func (s *session) sendQueued(blockUntilSent bool) {
354+
for i, msgBytes := range s.toSend {
355+
if !s.sendBytes(msgBytes, blockUntilSent) {
356+
s.toSend = s.toSend[i:]
357+
s.notifyMessageOut()
358+
return
359+
}
352360
}
353361

354362
s.dropQueued()
@@ -363,18 +371,30 @@ func (s *session) EnqueueBytesAndSend(msg []byte) {
363371
defer s.sendMutex.Unlock()
364372

365373
s.toSend = append(s.toSend, msg)
366-
s.sendQueued()
374+
s.sendQueued(true)
367375
}
368376

369-
func (s *session) sendBytes(msg []byte) {
377+
func (s *session) sendBytes(msg []byte, blockUntilSent bool) bool {
370378
if s.messageOut == nil {
371379
s.log.OnEventf("Failed to send: disconnected")
372-
return
380+
return false
381+
}
382+
383+
if blockUntilSent {
384+
s.messageOut <- msg
385+
s.log.OnOutgoing(msg)
386+
s.stateTimer.Reset(s.HeartBtInt)
387+
return true
373388
}
374389

375-
s.log.OnOutgoing(msg)
376-
s.messageOut <- msg
377-
s.stateTimer.Reset(s.HeartBtInt)
390+
select {
391+
case s.messageOut <- msg:
392+
s.log.OnOutgoing(msg)
393+
s.stateTimer.Reset(s.HeartBtInt)
394+
return true
395+
default:
396+
return false
397+
}
378398
}
379399

380400
func (s *session) doTargetTooHigh(reject targetTooHigh) (nextState resendState, err error) {

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)