2006-02-18 jrandom

* Migrate the outbound packets from a central component to the individual
      per-peer components, substantially cutting down on lock contention when
      dealing with higher degrees.
    * Load balance the outbound SSU transfers evenly across peers, rather than
      across messages (so peers with few messages won't be starved by peers
      with many).
    * Reduce the frequency of router info rebuilds (thanks bar!)
This commit is contained in:
jrandom
2006-02-19 03:58:08 +00:00
committed by zzz
parent 5aa335740a
commit c94de2fbb5
4 changed files with 28 additions and 8 deletions

View File

@ -713,7 +713,8 @@ public class EstablishmentManager {
break; break;
} else { } else {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("why are we confirmed with no identity? " + inboundState); _log.warn("confirmed with invalid? " + inboundState);
inboundState.fail();
break; break;
} }
case InboundEstablishState.STATE_FAILED: case InboundEstablishState.STATE_FAILED:

View File

@ -201,19 +201,26 @@ public class OutboundMessageFragments {
*/ */
private void finishMessages() { private void finishMessages() {
int rv = 0; int rv = 0;
List peers = new ArrayList();
synchronized (_activePeers) { synchronized (_activePeers) {
peers = new ArrayList(_activePeers);
for (int i = 0; i < _activePeers.size(); i++) { for (int i = 0; i < _activePeers.size(); i++) {
PeerState state = (PeerState)_activePeers.get(i); PeerState state = (PeerState)_activePeers.get(i);
int remaining = state.finishMessages(); if (state.getOutboundMessageCount() <= 0) {
if (remaining <= 0) {
_activePeers.remove(i); _activePeers.remove(i);
if (_log.shouldLog(Log.DEBUG))
_log.debug("No more pending messages for " + state.getRemotePeer().toBase64());
i--; i--;
} }
rv += remaining;
} }
} }
for (int i = 0; i < peers.size(); i++) {
PeerState state = (PeerState)peers.get(i);
int remaining = state.finishMessages();
if (remaining <= 0) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("No more pending messages for " + state.getRemotePeer().toBase64());
}
rv += remaining;
}
} }
private long _lastCycleTime = System.currentTimeMillis(); private long _lastCycleTime = System.currentTimeMillis();
@ -231,7 +238,7 @@ public class OutboundMessageFragments {
while (_alive && (state == null) ) { while (_alive && (state == null) ) {
long now = _context.clock().now(); long now = _context.clock().now();
int nextSendDelay = -1; int nextSendDelay = -1;
finishMessages(); //finishMessages();
try { try {
synchronized (_activePeers) { synchronized (_activePeers) {
for (int i = 0; i < _activePeers.size(); i++) { for (int i = 0; i < _activePeers.size(); i++) {

View File

@ -997,6 +997,18 @@ public class PeerState {
} }
} }
public int getOutboundMessageCount() {
Map msgs = _outboundMessages;
if (_dead) return 0;
if (msgs != null) {
synchronized (msgs) {
return msgs.size();
}
} else {
return 0;
}
}
/** /**
* Expire / complete any outbound messages * Expire / complete any outbound messages
* @return number of active outbound messages remaining * @return number of active outbound messages remaining

View File

@ -808,7 +808,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
} }
void rebuildExternalAddress() { rebuildExternalAddress(true); } void rebuildExternalAddress() { rebuildExternalAddress(true); }
void rebuildExternalAddress(boolean allowuterInfo) { void rebuildExternalAddress(boolean allowRebuildRouterInfo) {
if (_context.router().isHidden()) if (_context.router().isHidden())
return; return;