diff --git a/core/src/main/groovy/com/muwire/core/connection/Connection.groovy b/core/src/main/groovy/com/muwire/core/connection/Connection.groovy index cfb6f270..d0ee2fea 100644 --- a/core/src/main/groovy/com/muwire/core/connection/Connection.groovy +++ b/core/src/main/groovy/com/muwire/core/connection/Connection.groovy @@ -83,12 +83,11 @@ abstract class Connection implements Closeable { } } catch (SocketTimeoutException e) { close() - } catch (Exception e) { - if (running.get()) { - log.log(Level.WARNING,"unhandled exception in reader",e) - close() - } - } + } catch (Exception e) { + log.log(Level.WARNING,"unhandled exception in reader",e) + } finally { + close() + } } protected abstract void read() @@ -100,11 +99,10 @@ abstract class Connection implements Closeable { write(message) } } catch (Exception e) { - if (running.get()) { - log.log(Level.WARNING, "unhandled exception in writer",e) - close() - } - } + log.log(Level.WARNING, "unhandled exception in writer",e) + } finally { + close() + } } protected abstract void write(def message); diff --git a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy index 6b44e2da..9e4c69d3 100644 --- a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy +++ b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy @@ -140,7 +140,7 @@ class ConnectionAcceptor { } private void handleIncoming(Endpoint e, boolean leaf) { - boolean accept = leaf ? manager.hasLeafSlots() : manager.hasPeerSlots() + boolean accept = !manager.isConnected(e.destination) && (leaf ? manager.hasLeafSlots() : manager.hasPeerSlots()) if (accept) { log.info("accepting connection, leaf:$leaf") e.outputStream.write("OK".bytes) diff --git a/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy b/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy index ba2113d3..3483c915 100644 --- a/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy +++ b/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy @@ -108,7 +108,11 @@ class ConnectionAcceptorTest { new Endpoint(destinations.dest1, is, os, null) } i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } - connectionManagerMock.demand.hasLeafSlots() { true } + connectionManagerMock.demand.isConnected { dest -> + assert dest == destinations.dest1 + false + } + connectionManagerMock.demand.hasLeafSlots() { true } trustServiceMock.demand.getLevel { dest -> assert dest == destinations.dest1 TrustLevel.TRUSTED @@ -146,7 +150,11 @@ class ConnectionAcceptorTest { new Endpoint(destinations.dest1, is, os, null) } i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } - connectionManagerMock.demand.hasPeerSlots() { true } + connectionManagerMock.demand.isConnected { dest -> + assert dest == destinations.dest1 + false + } + connectionManagerMock.demand.hasPeerSlots() { true } trustServiceMock.demand.getLevel { dest -> assert dest == destinations.dest1 TrustLevel.TRUSTED @@ -242,7 +250,7 @@ class ConnectionAcceptorTest { } @Test - void testPeerRejectsPeer() { + void testPeerRejectsPeerSlots() { settings = new MuWireSettings() { boolean isLeaf() { false @@ -256,7 +264,11 @@ class ConnectionAcceptorTest { new Endpoint(destinations.dest1, is, os, null) } i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } - connectionManagerMock.demand.hasPeerSlots() { false } + connectionManagerMock.demand.isConnected { dest -> + assert dest == destinations.dest1 + false + } + connectionManagerMock.demand.hasPeerSlots() { false } trustServiceMock.demand.getLevel { dest -> assert dest == destinations.dest1 TrustLevel.TRUSTED @@ -284,7 +296,7 @@ class ConnectionAcceptorTest { } @Test - void testPeerRejectsLeaf() { + void testPeerRejectsLeafSlots() { settings = new MuWireSettings() { boolean isLeaf() { false @@ -298,7 +310,11 @@ class ConnectionAcceptorTest { new Endpoint(destinations.dest1, is, os, null) } i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } - connectionManagerMock.demand.hasLeafSlots() { false } + connectionManagerMock.demand.isConnected { dest -> + assert dest == destinations.dest1 + false + } + connectionManagerMock.demand.hasLeafSlots() { false } trustServiceMock.demand.getLevel { dest -> assert dest == destinations.dest1 TrustLevel.TRUSTED @@ -340,7 +356,11 @@ class ConnectionAcceptorTest { new Endpoint(destinations.dest1, is, os, null) } i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } - connectionManagerMock.demand.hasPeerSlots() { false } + connectionManagerMock.demand.isConnected { dest -> + assert dest == destinations.dest1 + false + } + connectionManagerMock.demand.hasPeerSlots() { false } trustServiceMock.demand.getLevel { dest -> assert dest == destinations.dest1 TrustLevel.TRUSTED