Prevent duplicate connections

This commit is contained in:
Zlatin Balevsky
2019-05-31 07:03:46 +01:00
parent 59c0303fb8
commit 440f8a0556
3 changed files with 37 additions and 19 deletions

View File

@@ -83,12 +83,11 @@ abstract class Connection implements Closeable {
} }
} catch (SocketTimeoutException e) { } catch (SocketTimeoutException e) {
close() close()
} catch (Exception e) { } catch (Exception e) {
if (running.get()) { log.log(Level.WARNING,"unhandled exception in reader",e)
log.log(Level.WARNING,"unhandled exception in reader",e) } finally {
close() close()
} }
}
} }
protected abstract void read() protected abstract void read()
@@ -100,11 +99,10 @@ abstract class Connection implements Closeable {
write(message) write(message)
} }
} catch (Exception e) { } catch (Exception e) {
if (running.get()) { log.log(Level.WARNING, "unhandled exception in writer",e)
log.log(Level.WARNING, "unhandled exception in writer",e) } finally {
close() close()
} }
}
} }
protected abstract void write(def message); protected abstract void write(def message);

View File

@@ -140,7 +140,7 @@ class ConnectionAcceptor {
} }
private void handleIncoming(Endpoint e, boolean leaf) { 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) { if (accept) {
log.info("accepting connection, leaf:$leaf") log.info("accepting connection, leaf:$leaf")
e.outputStream.write("OK".bytes) e.outputStream.write("OK".bytes)

View File

@@ -108,7 +108,11 @@ class ConnectionAcceptorTest {
new Endpoint(destinations.dest1, is, os, null) new Endpoint(destinations.dest1, is, os, null)
} }
i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } 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 -> trustServiceMock.demand.getLevel { dest ->
assert dest == destinations.dest1 assert dest == destinations.dest1
TrustLevel.TRUSTED TrustLevel.TRUSTED
@@ -146,7 +150,11 @@ class ConnectionAcceptorTest {
new Endpoint(destinations.dest1, is, os, null) new Endpoint(destinations.dest1, is, os, null)
} }
i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } 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 -> trustServiceMock.demand.getLevel { dest ->
assert dest == destinations.dest1 assert dest == destinations.dest1
TrustLevel.TRUSTED TrustLevel.TRUSTED
@@ -242,7 +250,7 @@ class ConnectionAcceptorTest {
} }
@Test @Test
void testPeerRejectsPeer() { void testPeerRejectsPeerSlots() {
settings = new MuWireSettings() { settings = new MuWireSettings() {
boolean isLeaf() { boolean isLeaf() {
false false
@@ -256,7 +264,11 @@ class ConnectionAcceptorTest {
new Endpoint(destinations.dest1, is, os, null) new Endpoint(destinations.dest1, is, os, null)
} }
i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } 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 -> trustServiceMock.demand.getLevel { dest ->
assert dest == destinations.dest1 assert dest == destinations.dest1
TrustLevel.TRUSTED TrustLevel.TRUSTED
@@ -284,7 +296,7 @@ class ConnectionAcceptorTest {
} }
@Test @Test
void testPeerRejectsLeaf() { void testPeerRejectsLeafSlots() {
settings = new MuWireSettings() { settings = new MuWireSettings() {
boolean isLeaf() { boolean isLeaf() {
false false
@@ -298,7 +310,11 @@ class ConnectionAcceptorTest {
new Endpoint(destinations.dest1, is, os, null) new Endpoint(destinations.dest1, is, os, null)
} }
i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } 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 -> trustServiceMock.demand.getLevel { dest ->
assert dest == destinations.dest1 assert dest == destinations.dest1
TrustLevel.TRUSTED TrustLevel.TRUSTED
@@ -340,7 +356,11 @@ class ConnectionAcceptorTest {
new Endpoint(destinations.dest1, is, os, null) new Endpoint(destinations.dest1, is, os, null)
} }
i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } 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 -> trustServiceMock.demand.getLevel { dest ->
assert dest == destinations.dest1 assert dest == destinations.dest1
TrustLevel.TRUSTED TrustLevel.TRUSTED