package info.frostfs.sdk.pool; import java.util.concurrent.locks.ReentrantLock; class InnerPool { private static final int ATTEMPTS_COUNT = 3; private final ReentrantLock lock = new ReentrantLock(); private final ClientWrapper[] clients; private Sampler sampler; InnerPool(Sampler sampler, ClientWrapper[] clients) { this.sampler = sampler; this.clients = clients; } Sampler getSampler() { return sampler; } void setSampler(Sampler sampler) { this.sampler = sampler; } ClientWrapper[] getClients() { return clients; } ClientWrapper connection() { lock.lock(); try { if (clients.length == 1) { ClientWrapper client = clients[0]; if (client.isHealthy()) { return client; } } else { int attempts = ATTEMPTS_COUNT * clients.length; for (int i = 0; i < attempts; i++) { int index = sampler.next(); if (clients[index].isHealthy()) { return clients[index]; } } } return null; } finally { lock.unlock(); } } }