@Override public ClientConnection ownerConnection(Address address) throws Exception { final Address translatedAddress = addressTranslator.translate(address); if (translatedAddress == null) { throw new RetryableIOException(address + " can not be translated! "); } return ownerConnectionFuture.createNew(translatedAddress); }
private ClientConnection getOrConnect(Address target, Authenticator authenticator) throws Exception { if (!smartRouting) { target = ownerConnectionFuture.getOrWaitForCreation().getEndPoint(); } Address address = addressTranslator.translate(target); if (address == null) { throw new IOException("Address is required!"); } ClientConnection clientConnection = connections.get(address); if (clientConnection == null) { final Object lock = getLock(address); synchronized (lock) { clientConnection = connections.get(address); if (clientConnection == null) { final ConnectionProcessor connectionProcessor = new ConnectionProcessor(address, authenticator, false); final ICompletableFuture<ClientConnection> future = executionService.submitInternal(connectionProcessor); try { clientConnection = future.get(connectionTimeout, TimeUnit.MILLISECONDS); } catch (Exception e) { future.cancel(true); throw new RetryableIOException(e); } ClientConnection current = connections.putIfAbsent(address, clientConnection); if (current != null) { clientConnection.close(); clientConnection = current; } } } } return clientConnection; }