diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index b5748f266..8149fab8c 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -1174,8 +1174,8 @@ public class PeerState { } if (!anyPending) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(_remotePeer + " nothing pending, cancelling timer"); + //if (_log.shouldLog(Log.DEBUG)) + // _log.debug(_remotePeer + " nothing pending, cancelling timer"); _retransmitTimer = 0; exitFastRetransmit(); } else { @@ -2191,7 +2191,7 @@ public class PeerState { /** * Transfer the basic activity/state from the old peer to the current peer * - * SSU 1 only. + * SSU 1 or 2. * * @param oldPeer non-null */ @@ -2203,45 +2203,49 @@ public class PeerState { _sendWindowBytes = oldPeer._sendWindowBytes; oldPeer._dead = true; - List tmp = new ArrayList(); - // AIOOBE from concurrent access - //tmp.addAll(oldPeer._currentACKs); - for (Long l : oldPeer._currentACKs) { - tmp.add(l); + if (getVersion() == 1 && oldPeer.getVersion() == 1) { + List tmp = new ArrayList(); + // AIOOBE from concurrent access + //tmp.addAll(oldPeer._currentACKs); + for (Long l : oldPeer._currentACKs) { + tmp.add(l); + } + oldPeer._currentACKs.clear(); + + if (!_dead) { + _currentACKs.addAll(tmp); + } + + List tmp3 = new ArrayList(); + tmp3.addAll(oldPeer._currentACKsResend); + oldPeer._currentACKsResend.clear(); + + if (!_dead) { + _currentACKsResend.addAll(tmp3); + } } - oldPeer._currentACKs.clear(); - if (!_dead) { - _currentACKs.addAll(tmp); - } + if (getVersion() == oldPeer.getVersion()) { + Map msgs = new HashMap(); + synchronized (oldPeer._inboundMessages) { + msgs.putAll(oldPeer._inboundMessages); + oldPeer._inboundMessages.clear(); + } + if (!_dead) { + synchronized (_inboundMessages) { _inboundMessages.putAll(msgs); } + } + msgs.clear(); - List tmp3 = new ArrayList(); - tmp3.addAll(oldPeer._currentACKsResend); - oldPeer._currentACKsResend.clear(); - - if (!_dead) { - _currentACKsResend.addAll(tmp3); - } - - Map msgs = new HashMap(); - synchronized (oldPeer._inboundMessages) { - msgs.putAll(oldPeer._inboundMessages); - oldPeer._inboundMessages.clear(); - } - if (!_dead) { - synchronized (_inboundMessages) { _inboundMessages.putAll(msgs); } - } - msgs.clear(); - - List tmp2 = new ArrayList(); - OutboundMessageState retransmitter = null; - synchronized (oldPeer._outboundMessages) { - tmp2.addAll(oldPeer._outboundMessages); - oldPeer._outboundMessages.clear(); - } - if (!_dead) { - synchronized (_outboundMessages) { - _outboundMessages.addAll(tmp2); + List tmp2 = new ArrayList(); + OutboundMessageState retransmitter = null; + synchronized (oldPeer._outboundMessages) { + tmp2.addAll(oldPeer._outboundMessages); + oldPeer._outboundMessages.clear(); + } + if (!_dead) { + synchronized (_outboundMessages) { + _outboundMessages.addAll(tmp2); + } } } }