forked from TrueCloudLab/frostfs-sdk-java
54 lines
1.3 KiB
Java
54 lines
1.3 KiB
Java
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();
|
|
}
|
|
}
|
|
}
|
|
|