From 8655988c66bebeb51db756758ff2ef35845b9d51 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Fri, 30 Aug 2013 12:01:51 +0000 Subject: [PATCH] * NTCP: Handle race where peer's NTCP address goes away --- .../i2p/router/transport/ntcp/NTCPTransport.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index c58b7321ac..cb504a747b 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -212,6 +212,7 @@ public class NTCPTransport extends TransportImpl { Hash ih = ident.calculateHash(); NTCPConnection con = null; boolean isNew = false; + boolean fail = false; synchronized (_conLock) { con = _conByIdent.get(ih); if (con == null) { @@ -223,11 +224,19 @@ public class NTCPTransport extends TransportImpl { _log.debug("Send on a new con: " + con + " at " + addr + " for " + ih); _conByIdent.put(ih, con); } else { - _log.error("we bid on a peer who doesn't have an ntcp address? " + target); - return; + // race, RI changed out from under us + // call afterSend below outside of conLock + fail = true; } } } + if (fail) { + // race, RI changed out from under us, maybe SSU can handle it + if (_log.shouldLog(Log.WARN)) + _log.warn("we bid on a peer who doesn't have an ntcp address? " + target); + afterSend(msg, false); + return; + } if (isNew) { con.enqueueInfoMessage(); // enqueues a netDb store of our own info con.send(msg); // doesn't do anything yet, just enqueues it -- GitLab