/** * Disconnects from a node if a channel is found as part of that nodes channels. */ private void disconnectFromNodeChannel(Channel channel, Throwable failure) { for (DiscoveryNode node : connectedNodes.keySet()) { NodeChannels nodeChannels = connectedNodes.get(node); if (nodeChannels != null && nodeChannels.hasChannel(channel)) { connectionLock.acquire(node.id()); if (!nodeChannels.hasChannel(channel)) { //might have been removed in the meanwhile, safety check assert !connectedNodes.containsKey(node); } else { try { connectedNodes.remove(node); try { nodeChannels.close(); } finally { logger.debug("disconnected from [{}] on channel failure", failure, node); transportServiceAdapter.raiseNodeDisconnected(node); } } finally { connectionLock.release(node.id()); } } } } }
@Override public void disconnectFromNode(DiscoveryNode node) { NodeChannels nodeChannels = connectedNodes.remove(node); if (nodeChannels != null) { connectionLock.acquire(node.id()); try { try { nodeChannels.close(); } finally { logger.debug("disconnected from [{}]", node); transportServiceAdapter.raiseNodeDisconnected(node); } } finally { connectionLock.release(node.id()); } } }
connectionLock.release(node.id());