package net.spy.memcached;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.SocketChannel;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import net.spy.SpyObject;
import net.spy.memcached.ops.Operation;
import net.spy.memcached.protocol.ascii.AsciiMemcachedNodeImpl;
import net.spy.memcached.protocol.ascii.AsciiOperationFactory;
/**
* Default implementation of ConnectionFactory.
*
* <p>
* This implementation creates connections where each server worker queue is
* implemented using an ArrayBlockingQueue. The read queue is automatically
* configured to be 10% larger than the specified op queue. The write queue
* is and input queues are the same size.
* </p>
*/
public class DefaultConnectionFactory extends SpyObject
implements ConnectionFactory {
/**
* Maximum length of the operation queue returned by this connection
* factory.
*/
public static final int DEFAULT_OP_QUEUE_LEN=16384;
/**
* The read buffer size for each server connection from this factory.
*/
public static final int DEFAULT_READ_BUFFER_SIZE=16384;
/**
* Default operation timeout in milliseconds.
*/
public static final long DEFAULT_OPERATION_TIMEOUT = 1000;
private final int opQueueLen;
private final int readBufSize;
private final HashAlgorithm hashAlg;
/**
* Construct a DefaultConnectionFactory with the given parameters.
*
* @param hashAlgorithm the algorithm to use for hashing
* @param bufSize the buffer size
* @param qLen the queue length.
*/
public DefaultConnectionFactory(int qLen, int bufSize, HashAlgorithm hash) {
super();
opQueueLen=qLen;
readBufSize=bufSize;
hashAlg=hash;
}
/**
* Create a DefaultConnectionFactory with the given maximum operation
* queue length, and the given read buffer size.
*/
public DefaultConnectionFactory(int qLen, int bufSize) {
this(qLen, bufSize, HashAlgorithm.NATIVE_HASH);
}
/**
* Create a DefaultConnectionFactory with the default parameters.
*/
public DefaultConnectionFactory() {
this(DEFAULT_OP_QUEUE_LEN, DEFAULT_READ_BUFFER_SIZE);
}
public MemcachedNode createMemcachedNode(SocketAddress sa,
SocketChannel c, int bufSize) {
return new AsciiMemcachedNodeImpl(sa, c, bufSize,
createReadOperationQueue(),
createWriteOperationQueue(),
createOperationQueue());
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#createConnection(java.util.List)
*/
public MemcachedConnection createConnection(List<InetSocketAddress> addrs)
throws IOException {
return new MemcachedConnection(getReadBufSize(), this, addrs);
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#createOperationQueue()
*/
public BlockingQueue<Operation> createOperationQueue() {
return new ArrayBlockingQueue<Operation>(getOpQueueLen());
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#createReadOperationQueue()
*/
public BlockingQueue<Operation> createReadOperationQueue() {
return new ArrayBlockingQueue<Operation>(
(int) (getOpQueueLen() * 1.1));
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#createWriteOperationQueue()
*/
public BlockingQueue<Operation> createWriteOperationQueue() {
return createOperationQueue();
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#createLocator(java.util.List)
*/
public NodeLocator createLocator(List<MemcachedNode> nodes) {
return new ArrayModNodeLocator(nodes, getHashAlg());
}
/**
* Get the op queue length set at construct time.
*/
public int getOpQueueLen() {
return opQueueLen;
}
/**
* Get the read buffer size set at construct time.
*/
public int getReadBufSize() {
return readBufSize;
}
/**
* Get the hash algorithm set at construct time.
*/
public HashAlgorithm getHashAlg() {
return hashAlg;
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#getOperationFactory()
*/
public OperationFactory getOperationFactory() {
return new AsciiOperationFactory();
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#getOperationTimeout()
*/
public long getOperationTimeout() {
return DEFAULT_OPERATION_TIMEOUT;
}
/* (non-Javadoc)
* @see net.spy.memcached.ConnectionFactory#isDaemon()
*/
public boolean isDaemon() {
return false;
}
}