package org.infinispan.server.test.client.hotrod;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.http.annotation.ThreadSafe;
import org.infinispan.client.hotrod.impl.transport.tcp.FailoverRequestBalancingStrategy;
import org.infinispan.client.hotrod.logging.Log;
import org.infinispan.client.hotrod.logging.LogFactory;
/*
* Load balancing strategy which always sends to node0
*/
@ThreadSafe
public class Node1OnlyBalancingStrategy implements FailoverRequestBalancingStrategy {
private static final Log log = LogFactory.getLog(Node1OnlyBalancingStrategy.class);
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock readLock = readWriteLock.readLock();
private final Lock writeLock = readWriteLock.writeLock();
private volatile InetSocketAddress[] servers;
private static String host;
private static int port = 11322;
private static InetSocketAddress server;
static {
host = System.getProperty("node1.ip", "localhost");
server = new InetSocketAddress(host, port);
if (log.isDebugEnabled())
log.trace("node1 server = " + server);
}
/*
* This gets called by ReemoteCache upon receiving a toplogy update, among other callers.
*/
@Override
public void setServers(Collection<SocketAddress> servers) {
writeLock.lock();
try {
this.servers = servers.toArray(new InetSocketAddress[servers.size()]);
if (log.isTraceEnabled()) {
log.trace("New server list is: " + Arrays.toString(this.servers));
}
} finally {
writeLock.unlock();
}
}
/**
* Multiple threads might call this method at the same time.
*/
@Override
public SocketAddress nextServer(Set<SocketAddress> failedServers) {
readLock.lock();
try {
return server;
} finally {
readLock.unlock();
}
}
}