
etcd.client.ServerList Maven / Gradle / Ivy
package etcd.client;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
class ServerList {
public static final long DEFAULT_FAILURE_BACKOFF_TIME = TimeUnit.SECONDS.toMillis(2);
private final ArrayList primaryServers = new ArrayList<>();
private final ArrayList secondaryServers = new ArrayList<>();
private final long failureBackoffTime = DEFAULT_FAILURE_BACKOFF_TIME;
public ServerList addServer(URI address, boolean primary) {
final Server server = new Server(address);
if (primary) {
primaryServers.add(server);
} else {
secondaryServers.add(server);
}
return this;
}
public Iterator serverIterator() {
final Iterator primaryIterator = populateList(primaryServers).iterator();
final Iterator secondaryIterator = populateList(secondaryServers).iterator();
return new Iterator() {
@Override
public boolean hasNext() {
return primaryIterator.hasNext() || secondaryIterator.hasNext();
}
@Override
public Server next() {
return primaryIterator.hasNext() ? primaryIterator.next() : secondaryIterator.next();
}
};
}
private List populateList(ArrayList servers) {
final long time = System.currentTimeMillis();
final List list = servers.stream()
.filter(server -> server.failTime + failureBackoffTime < time)
.collect(Collectors.toList());
Collections.shuffle(list);
return list;
}
static class Server {
private final URI address;
private volatile long failTime;
Server(URI address) {
this.address = address;
}
public URI getAddress() {
return address;
}
public void connectionFailed() {
failTime = System.currentTimeMillis();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy