Don't stop when there is work to be done

This commit is contained in:
Neil Alexander 2020-07-01 10:41:25 +01:00
parent a9aa3c263b
commit 4cc1eaac5a
2 changed files with 44 additions and 42 deletions

View file

@ -46,7 +46,6 @@ type destinationQueue struct {
running atomic.Bool // is the queue worker running?
backingOff atomic.Bool // true if we're backing off
statistics *types.ServerStatistics // statistics about this remote server
incomingPDUs chan struct{} // signal that there are PDUs waiting
incomingInvites chan *gomatrixserverlib.InviteV2Request // invites to send
incomingEDUs chan *gomatrixserverlib.EDU // EDUs to send
transactionID gomatrixserverlib.TransactionID // last transaction ID
@ -54,6 +53,7 @@ type destinationQueue struct {
pendingPDUs atomic.Int32 // how many PDUs are waiting to be sent
pendingEDUs []*gomatrixserverlib.EDU // owned by backgroundSend
pendingInvites []*gomatrixserverlib.InviteV2Request // owned by backgroundSend
wakeServerCh chan bool // interrupts idle wait
retryServerCh chan bool // interrupts backoff
}
@ -120,7 +120,7 @@ func (oq *destinationQueue) sendEvent(nid int64) {
// Signal that we've sent a new PDU. This will cause the queue to
// wake up if it's asleep.
oq.pendingPDUs.Add(1)
oq.incomingPDUs <- struct{}{}
oq.wakeServerCh <- true
}
// sendEDU adds the EDU event to the pending queue for the destination.
@ -168,10 +168,11 @@ func (oq *destinationQueue) backgroundSend() {
// e.g. in response to EDUs.
transactionID := gomatrixserverlib.TransactionID("")
// Wait either for incoming events, or until we hit an
// idle timeout.
// If we have nothing to do then wait either for incoming events, or
// until we hit an idle timeout.
if oq.pendingPDUs.Load() == 0 {
select {
case <-oq.incomingPDUs:
case <-oq.wakeServerCh:
// We were woken up because there are new PDUs waiting in the
// database.
case edu := <-oq.incomingEDUs:
@ -209,6 +210,7 @@ func (oq *destinationQueue) backgroundSend() {
// send.
return
}
}
// If we are backing off this server then wait for the
// backoff duration to complete first, or until explicitly

View file

@ -88,9 +88,9 @@ func (oqs *OutgoingQueues) getQueue(destination gomatrixserverlib.ServerName) *d
destination: destination,
client: oqs.client,
statistics: oqs.statistics.ForServer(destination),
incomingPDUs: make(chan struct{}, 128),
incomingEDUs: make(chan *gomatrixserverlib.EDU, 128),
incomingInvites: make(chan *gomatrixserverlib.InviteV2Request, 128),
wakeServerCh: make(chan bool, 128),
retryServerCh: make(chan bool),
signing: oqs.signing,
}