Prevent duplicate connections
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user