-
Notifications
You must be signed in to change notification settings - Fork 770
Open
Description
Ever since 651dc4a, a UDPSession will not flush queued outgoing packets when the connection is closed. Instead, there is a race condition in the select call of postProcess when the s.die channel is closed in Close:
select {
case buf := <-s.chPostProcessing: // dequeue from post processing
[snip]
// notify chCork only when chPostProcessing is empty
if len(s.chPostProcessing) == 0 {
select {
case chCork <- struct{}{}:
default:
}
}
case <-chCork: // emulate a corked socket
if len(txqueue) > 0 {
s.tx(txqueue)
// recycle
for k := range txqueue {
xmitBuf.Put(txqueue[k].Buffers[0])
txqueue[k].Buffers = nil
}
txqueue = txqueue[:0]
}
case <-s.die:
return
}if Close is called immediately after a Write, the queued packets will not be sent. This wasn't an issue before because the uncork function was called from within Close.
I noticed this because one of our unit tests started failing when we tried to update the version of this library.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels