SSU: Fix calculation of nextSendDelay (ticket #2714)

patch from zlatinb
This commit is contained in:
zzz
2020-10-17 12:12:15 +00:00
parent 7a77f48963
commit 4d82917b94

View File

@ -270,8 +270,8 @@ class OutboundMessageFragments {
List<OutboundMessageState> states = null; List<OutboundMessageState> states = null;
// Keep track of how many we've looked at, since we don't start the iterator at the beginning. // Keep track of how many we've looked at, since we don't start the iterator at the beginning.
int peersProcessed = 0; int peersProcessed = 0;
int nextSendDelay = Integer.MAX_VALUE;
while (_alive && (states == null) ) { while (_alive && (states == null) ) {
int nextSendDelay = Integer.MAX_VALUE;
// no, not every time - O(n**2) - do just before waiting below // no, not every time - O(n**2) - do just before waiting below
//finishMessages(); //finishMessages();
@ -288,8 +288,8 @@ class OutboundMessageFragments {
// Otherwise, wait() // Otherwise, wait()
long now = _context.clock().now(); long now = _context.clock().now();
while (_iterator.hasNext()) { while (_iterator.hasNext()) {
peer = _iterator.next(); PeerState p = _iterator.next();
int remaining = peer.finishMessages(now); int remaining = p.finishMessages(now);
if (remaining <= 0) { if (remaining <= 0) {
// race with add() // race with add()
_iterator.remove(); _iterator.remove();
@ -298,20 +298,19 @@ class OutboundMessageFragments {
continue; continue;
} }
peersProcessed++; peersProcessed++;
states = peer.allocateSend(); states = p.allocateSend();
if (states != null) { if (states != null) {
peer = p;
// we have something to send and we will be returning it // we have something to send and we will be returning it
break; break;
} else if (peersProcessed >= _activePeers.size()) { }
int delay = p.getNextDelay();
if (delay < nextSendDelay)
nextSendDelay = delay;
if (peersProcessed >= _activePeers.size()) {
// we've gone all the way around, time to sleep // we've gone all the way around, time to sleep
break; break;
} else {
// Update the minimum delay for all peers
// which will be used if we found nothing to send across all peers
int delay = peer.getNextDelay();
if (delay < nextSendDelay)
nextSendDelay = delay;
peer = null;
} }
} }
@ -329,8 +328,10 @@ class OutboundMessageFragments {
// use max of 1 second so finishMessages() and/or PeerState.finishMessages() // use max of 1 second so finishMessages() and/or PeerState.finishMessages()
// gets called regularly // gets called regularly
int toWait = Math.min(Math.max(nextSendDelay, 10), MAX_WAIT); int toWait = Math.min(Math.max(nextSendDelay, 10), MAX_WAIT);
//if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
// _log.debug("wait for " + toWait); _log.debug("wait for " + toWait);
nextSendDelay = Integer.MAX_VALUE;
// wait.. or somethin' // wait.. or somethin'
synchronized (_activePeers) { synchronized (_activePeers) {
try { try {