NTCP: Fix handling of multiple connections,

change termination code for expired RI, log tweaks
This commit is contained in:
zzz
2018-09-22 12:13:51 +00:00
parent 4369b7d122
commit 829eb665e9
5 changed files with 23 additions and 11 deletions

View File

@ -1,3 +1,8 @@
2018-09-22 zzz
* NTCP:
- Fix handling of multiple connections
- Change termination code for expired RI
2018-09-16 zzz 2018-09-16 zzz
* Build: Fix hang with Tomcat 8.5.33+ (ticket #2307) * Build: Fix hang with Tomcat 8.5.33+ (ticket #2307)
* Tomcat 8.5.34 * Tomcat 8.5.34

View File

@ -18,10 +18,10 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 4; public final static long BUILD = 5;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "-rc";
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("I2P Router version: " + FULL_VERSION); System.out.println("I2P Router version: " + FULL_VERSION);

View File

@ -1002,8 +1002,9 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa
} }
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
// hash collision? // hash collision?
_msg3p2FailReason = NTCPConnection.REASON_UNSPEC; // expired RI?
throw new DataFormatException("RI store fail", iae); _msg3p2FailReason = NTCPConnection.REASON_MSG3;
throw new DataFormatException("RI store fail: " + ri, iae);
} }
_con.setRemotePeer(_aliceIdent); _con.setRemotePeer(_aliceIdent);
} }

View File

@ -488,6 +488,7 @@ public class NTCPConnection implements Closeable {
} }
NTCPConnection toClose = locked_close(allowRequeue); NTCPConnection toClose = locked_close(allowRequeue);
if (toClose != null && toClose != this) { if (toClose != null && toClose != this) {
// won't happen as of 0.9.37
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Multiple connections on remove, closing " + toClose + " (already closed " + this + ")"); _log.warn("Multiple connections on remove, closing " + toClose + " (already closed " + this + ")");
_context.statManager().addRateData("ntcp.multipleCloseOnRemove", toClose.getUptime()); _context.statManager().addRateData("ntcp.multipleCloseOnRemove", toClose.getUptime());
@ -507,7 +508,8 @@ public class NTCPConnection implements Closeable {
} }
/** /**
* @return a second connection with the same peer... * @return usually this, but could be a second connection with the same peer...
* only this or null as of 0.9.37
*/ */
private synchronized NTCPConnection locked_close(boolean allowRequeue) { private synchronized NTCPConnection locked_close(boolean allowRequeue) {
if (_chan != null) try { _chan.close(); } catch (IOException ioe) { } if (_chan != null) try { _chan.close(); } catch (IOException ioe) { }
@ -1834,9 +1836,9 @@ public class NTCPConnection implements Closeable {
_paddingConfig = OUR_PADDING; _paddingConfig = OUR_PADDING;
} }
NTCPConnection toClose = _transport.inboundEstablished(this); NTCPConnection toClose = _transport.inboundEstablished(this);
if (toClose != null) { if (toClose != null && toClose != this) {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldWarn())
_log.debug("Old connection closed: " + toClose + " replaced by " + this); _log.warn("Old connection closed: " + toClose + " replaced by " + this);
_context.statManager().addRateData("ntcp.inboundEstablishedDuplicate", toClose.getUptime()); _context.statManager().addRateData("ntcp.inboundEstablishedDuplicate", toClose.getUptime());
toClose.close(); toClose.close();
} }
@ -2107,7 +2109,7 @@ public class NTCPConnection implements Closeable {
} }
} }
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
throw new DataFormatException("RI store fail", iae); throw new DataFormatException("RI store fail: " + ri, iae);
} }
} }

View File

@ -73,7 +73,7 @@ public class NTCPTransport extends TransportImpl {
private final SharedBid _nearCapacityCostBid; private final SharedBid _nearCapacityCostBid;
private final SharedBid _transientFail; private final SharedBid _transientFail;
private final Object _conLock; private final Object _conLock;
private final Map<Hash, NTCPConnection> _conByIdent; private final ConcurrentHashMap<Hash, NTCPConnection> _conByIdent;
private final EventPumper _pumper; private final EventPumper _pumper;
private final Reader _reader; private final Reader _reader;
private net.i2p.router.transport.ntcp.Writer _writer; private net.i2p.router.transport.ntcp.Writer _writer;
@ -641,13 +641,17 @@ public class NTCPTransport extends TransportImpl {
/** /**
* @return usually the con passed in, but possibly a second connection with the same peer... * @return usually the con passed in, but possibly a second connection with the same peer...
* only con or null as of 0.9.37
*/ */
NTCPConnection removeCon(NTCPConnection con) { NTCPConnection removeCon(NTCPConnection con) {
NTCPConnection removed = null; NTCPConnection removed = null;
RouterIdentity ident = con.getRemotePeer(); RouterIdentity ident = con.getRemotePeer();
if (ident != null) { if (ident != null) {
synchronized (_conLock) { synchronized (_conLock) {
removed = _conByIdent.remove(ident.calculateHash()); // only remove the con passed in
//removed = _conByIdent.remove(ident.calculateHash());
if (_conByIdent.remove(ident.calculateHash(), con))
removed = con;
} }
} }
return removed; return removed;