diff --git a/src/main/java/net/openhft/chronicle/map/NodeDiscovery.java b/src/main/java/net/openhft/chronicle/map/NodeDiscovery.java index 40218d23f..b3824fc1a 100644 --- a/src/main/java/net/openhft/chronicle/map/NodeDiscovery.java +++ b/src/main/java/net/openhft/chronicle/map/NodeDiscovery.java @@ -42,7 +42,7 @@ public class NodeDiscovery { final KnownNodes knownNodes = new KnownNodes(); final Set knownHostPorts = new ConcurrentSkipListSet(); - final DirectBitSet knownIdentifiers = new ATSDirectBitSet(new ByteBufferBytes(ByteBuffer.allocate + final DirectBitSet knownAndProposedIdentifiers = new ATSDirectBitSet(new ByteBufferBytes(ByteBuffer.allocate (128 / 8))); final AtomicReference countDownLatch = new AtomicReference(new @@ -51,21 +51,26 @@ public class NodeDiscovery { final NodeDiscoveryEventListener nodeDiscoveryEventListener = new NodeDiscoveryEventListener() { @Override - public void onRemoteNodeEvent(KnownNodes remoteNode, ConcurrentExpiryMap proposedIdentifiersWithHost) { + public void onRemoteNodeEvent(KnownNodes remoteNodes, + ConcurrentExpiryMap proposedIdentifiersWithHost) { - knownHostPorts.addAll(remoteNode.addressAndPorts()); + knownHostPorts.addAll(remoteNodes.addressAndPorts()); - orBitSets(remoteNode.activeIdentifierBitSet(), knownIdentifiers); + orBitSets(remoteNodes.identifers(), knownAndProposedIdentifiers); for (DiscoveryNodeBytesMarshallable.ProposedNodes proposedIdentifierWithHost : proposedIdentifiersWithHost.values()) { if (!proposedIdentifierWithHost.addressAndPort().equals(ourAddressAndPort)) { - int remoteIdentifier = proposedIdentifierWithHost.identifier(); - knownIdentifiers.set(remoteIdentifier, true); + int proposedIdentifer = proposedIdentifierWithHost.identifier(); + if (proposedIdentifer!=-1) { + knownAndProposedIdentifiers.set(proposedIdentifer, true); + } + knownHostPorts.add(proposedIdentifierWithHost.addressAndPort()); - if (remoteIdentifier == proposedIdentifier.get()) + if (proposedIdentifer == proposedIdentifier.get()) useAnotherIdentifier.set(true); countDownLatch.get().countDown(); @@ -109,7 +114,7 @@ public class NodeDiscovery { OUTER: for (; ; ) { useAnotherIdentifier.set(false); - identifier = proposeRandomUnusedIdentifier(knownIdentifiers, isFistTime); + identifier = proposeRandomUnusedIdentifier(knownAndProposedIdentifiers, isFistTime); proposedIdentifier.set(identifier); LOG.info("proposing to use identifier=" + identifier); @@ -156,7 +161,7 @@ public class NodeDiscovery { @Override public boolean isIdentifierUnique(byte remoteIdentifier, SocketAddress remoteAddress) { final SocketAddress socketAddress = identifiers.putIfAbsent(remoteIdentifier, remoteAddress); - knownNodes.activeIdentifierBitSet().set(remoteIdentifier); + knownNodes.identifers().set(remoteIdentifier); return socketAddress == null; } }; @@ -468,11 +473,15 @@ class KnownNodes implements BytesMarshallable { } public void add(AddressAndPort inetSocketAddress, byte identifier) { - activeIdentifierBitSet().set(identifier); + identifers().set(identifier); addressAndPorts.add(inetSocketAddress); } - public DirectBitSet activeIdentifierBitSet() { + /** + * all the known identifiers + * @return + */ + public DirectBitSet identifers() { return atsDirectBitSet; } diff --git a/src/test/java/net/openhft/chronicle/map/NodeDiscoveryBroadcasterTest.java b/src/test/java/net/openhft/chronicle/map/NodeDiscoveryBroadcasterTest.java index a809edc35..5d9b61063 100644 --- a/src/test/java/net/openhft/chronicle/map/NodeDiscoveryBroadcasterTest.java +++ b/src/test/java/net/openhft/chronicle/map/NodeDiscoveryBroadcasterTest.java @@ -97,7 +97,7 @@ public class NodeDiscoveryBroadcasterTest extends TestCase { Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().addressAndPorts().contains (server2AddressAndPort)); - Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().activeIdentifierBitSet().get + Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().identifers().get (SERVER2_IDENTIFER)); } @@ -164,7 +164,7 @@ public class NodeDiscoveryBroadcasterTest extends TestCase { Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().addressAndPorts().contains (server2AddressAndPort)); - Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().activeIdentifierBitSet().get + Assert.assertTrue(server1BytesExternalizable.getRemoteNodes().identifers().get (SERVER2_IDENTIFER)); Assert.assertTrue(server1BytesExternalizable.proposedIdentifiersWithHost.values().contains