From 50f2c7e0809251344f3d78a9969a6675cb80bd50 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Sat, 9 Jul 2016 16:37:12 +0200 Subject: [PATCH] Fixed synchronisation --- .../bitmessage/networking/AbstractConnection.java | 11 ++++------- .../bitmessage/networking/nio/NioNetworkHandler.java | 11 +++++++++-- .../bitmessage/networking/NetworkHandlerTest.java | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/networking/src/main/java/ch/dissem/bitmessage/networking/AbstractConnection.java b/networking/src/main/java/ch/dissem/bitmessage/networking/AbstractConnection.java index f7d6fc3..edb26a2 100644 --- a/networking/src/main/java/ch/dissem/bitmessage/networking/AbstractConnection.java +++ b/networking/src/main/java/ch/dissem/bitmessage/networking/AbstractConnection.java @@ -61,7 +61,7 @@ public abstract class AbstractConnection { protected long lastObjectTime; private final long syncTimeout; - private int readTimeoutCounter; + private long syncReadTimeout = Long.MAX_VALUE; protected long peerNonce; protected int version; @@ -305,16 +305,13 @@ public abstract class AbstractConnection { return true; } if (!sendingQueue.isEmpty()) { + syncReadTimeout = System.currentTimeMillis() + 1000; return false; } if (msg == null) { - if (requestedObjects.isEmpty()) - return true; - - readTimeoutCounter++; - return readTimeoutCounter > 1; + return syncReadTimeout < System.currentTimeMillis(); } else { - readTimeoutCounter = 0; + syncReadTimeout = System.currentTimeMillis() + 1000; return false; } } diff --git a/networking/src/main/java/ch/dissem/bitmessage/networking/nio/NioNetworkHandler.java b/networking/src/main/java/ch/dissem/bitmessage/networking/nio/NioNetworkHandler.java index 096c229..c49d324 100644 --- a/networking/src/main/java/ch/dissem/bitmessage/networking/nio/NioNetworkHandler.java +++ b/networking/src/main/java/ch/dissem/bitmessage/networking/nio/NioNetworkHandler.java @@ -77,7 +77,6 @@ public class NioNetworkHandler implements NetworkHandler, InternalContext.Contex public Void call() throws Exception { Set requestedObjects = new HashSet<>(); try (SocketChannel channel = SocketChannel.open(new InetSocketAddress(server, port))) { - channel.finishConnect(); channel.configureBlocking(false); ConnectionInfo connection = new ConnectionInfo(ctx, SYNC, new NetworkAddress.Builder().ip(server).port(port).stream(1).build(), @@ -88,6 +87,7 @@ public class NioNetworkHandler implements NetworkHandler, InternalContext.Contex read(channel, connection); Thread.sleep(10); } + connections.remove(connection); LOG.info("Synchronization finished"); } return null; @@ -225,7 +225,6 @@ public class NioNetworkHandler implements NetworkHandler, InternalContext.Contex while (selector.isOpen()) { selector.select(1000); Iterator keyIterator = selector.selectedKeys().iterator(); - while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.attachment() instanceof ConnectionInfo) { @@ -253,6 +252,14 @@ public class NioNetworkHandler implements NetworkHandler, InternalContext.Contex } keyIterator.remove(); } + for (SelectionKey key : selector.keys()) { + if ((key.interestOps() & OP_WRITE) == 0) { + if (key.attachment() instanceof ConnectionInfo && + !((ConnectionInfo) key.attachment()).getSendingQueue().isEmpty()) { + key.interestOps(OP_READ | OP_WRITE); + } + } + } } selector.close(); } catch (ClosedSelectorException ignore) { diff --git a/networking/src/test/java/ch/dissem/bitmessage/networking/NetworkHandlerTest.java b/networking/src/test/java/ch/dissem/bitmessage/networking/NetworkHandlerTest.java index 85dec9e..444f836 100644 --- a/networking/src/test/java/ch/dissem/bitmessage/networking/NetworkHandlerTest.java +++ b/networking/src/test/java/ch/dissem/bitmessage/networking/NetworkHandlerTest.java @@ -254,7 +254,7 @@ public class NetworkHandlerTest { Future future = nodeNetworkHandler.synchronize(peerAddress.toInetAddress(), peerAddress.getPort(), mock(NetworkHandler.MessageListener.class), - 100); + 10); future.get(); assertInventorySize(1, nodeInventory); assertInventorySize(1, peerInventory);