Package net.spy.memcached.protocol
Class TCPMemcachedNodeImpl
- java.lang.Object
-
- net.spy.memcached.compat.SpyObject
-
- net.spy.memcached.protocol.TCPMemcachedNodeImpl
-
- All Implemented Interfaces:
MemcachedNode
- Direct Known Subclasses:
AsciiMemcachedNodeImpl
,BinaryMemcachedNodeImpl
public abstract class TCPMemcachedNodeImpl extends SpyObject implements MemcachedNode
Represents a node with the memcached cluster, along with buffering and operation queues.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.CountDownLatch
authLatch
private long
authWaitTime
private java.nio.channels.SocketChannel
channel
private MemcachedConnection
connection
private ConnectionFactory
connectionFactory
private java.util.concurrent.atomic.AtomicInteger
continuousTimeout
private long
defaultOpTimeout
private java.util.concurrent.BlockingQueue<Operation>
inputQueue
private long
lastReadTimestamp
private long
opQueueMaxBlockTime
protected Operation
optimizedOp
private java.nio.ByteBuffer
rbuf
private java.util.concurrent.BlockingQueue<Operation>
readQ
private java.util.concurrent.atomic.AtomicInteger
reconnectAttempt
private java.util.ArrayList<Operation>
reconnectBlocked
private boolean
shouldAuth
private java.nio.channels.SelectionKey
sk
private java.net.SocketAddress
socketAddress
private int
toWrite
private java.nio.ByteBuffer
wbuf
protected java.util.concurrent.BlockingQueue<Operation>
writeQ
-
Constructor Summary
Constructors Constructor Description TCPMemcachedNodeImpl(java.net.SocketAddress sa, java.nio.channels.SocketChannel c, int bufSize, java.util.concurrent.BlockingQueue<Operation> rq, java.util.concurrent.BlockingQueue<Operation> wq, java.util.concurrent.BlockingQueue<Operation> iq, long opQueueMaxBlockTime, boolean waitForAuth, long dt, long authWaitTime, ConnectionFactory fact)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description void
addOp(Operation op)
Add an operation to the queue.void
authComplete()
Let the node know that auth is complete.void
completedRead()
Mark this node as having just completed a read.void
connected()
Notify this node that it has reconnected.void
copyInputQueue()
Move all of the operations delivered via addOperation into the internal write queue.java.util.Collection<Operation>
destroyInputQueue()
Extract all queued items for this node destructively.void
fillWriteBuffer(boolean shouldOptimize)
Fill the write buffer with data from the next operations in the queue.void
fixupOps()
Fix up the selection ops on the selection key.int
getBytesRemainingToWrite()
Get the number of bytes remaining to write.java.nio.channels.SocketChannel
getChannel()
Get the SocketChannel for this connection.MemcachedConnection
getConnection()
int
getContinuousTimeout()
Operation
getCurrentReadOp()
Get the operation at the top of the queue that is requiring input.Operation
getCurrentWriteOp()
Get the operation at the top of the queue that has information available to write.private Operation
getNextWritableOp()
java.nio.ByteBuffer
getRbuf()
Get the buffer used for reading data from this node.int
getReconnectCount()
Get the current reconnect count.int
getSelectionOps()
Compute the appropriate selection operations for the channel this MemcachedNode holds to the server.java.nio.channels.SelectionKey
getSk()
Get the selection key from this node.java.net.SocketAddress
getSocketAddress()
Get the SocketAddress of the server to which this node is connected.java.nio.ByteBuffer
getWbuf()
Get the buffer used for writing data to this node.boolean
hasReadOp()
True if an operation is available to read.boolean
hasWriteOp()
True if an operation is available to write.void
insertOp(Operation op)
Insert an operation to the beginning of the queue.boolean
isActive()
True if this node isactive.
i.e.boolean
isAuthenticated()
True if this node isauthenticated.
long
lastReadDelta()
Number of milliseconds since the last read of this node completed.protected abstract void
optimize()
private boolean
preparePending()
void
reconnecting()
Notify this node that it will be reconnecting.void
registerChannel(java.nio.channels.SocketChannel ch, java.nio.channels.SelectionKey skey)
Register a channel with this node.Operation
removeCurrentReadOp()
Remove the operation at the top of the queue that is requiring input.Operation
removeCurrentWriteOp()
Remove the operation at the top of the queue that has information available to write.void
setChannel(java.nio.channels.SocketChannel to)
Set the SocketChannel this node uses.void
setConnection(MemcachedConnection connection)
void
setContinuousTimeout(boolean timedOut)
Count 'time out' exceptions to drop connections that fail perpetually.void
setSk(java.nio.channels.SelectionKey to)
Set the selection key for this node.void
setupForAuth()
Tell a node to set up for authentication.void
setupResend()
Clear the queue of currently processing operations by either cancelling them or setting them up to be reapplied after a reconnect.java.lang.String
toString()
void
transitionWriteItem()
Transition the current write item into a read state.int
writeSome()
Write some bytes and return the number of bytes written.
-
-
-
Field Detail
-
socketAddress
private final java.net.SocketAddress socketAddress
-
rbuf
private final java.nio.ByteBuffer rbuf
-
wbuf
private final java.nio.ByteBuffer wbuf
-
writeQ
protected final java.util.concurrent.BlockingQueue<Operation> writeQ
-
readQ
private final java.util.concurrent.BlockingQueue<Operation> readQ
-
inputQueue
private final java.util.concurrent.BlockingQueue<Operation> inputQueue
-
opQueueMaxBlockTime
private final long opQueueMaxBlockTime
-
authWaitTime
private final long authWaitTime
-
connectionFactory
private final ConnectionFactory connectionFactory
-
reconnectAttempt
private java.util.concurrent.atomic.AtomicInteger reconnectAttempt
-
channel
private java.nio.channels.SocketChannel channel
-
toWrite
private int toWrite
-
optimizedOp
protected Operation optimizedOp
-
sk
private volatile java.nio.channels.SelectionKey sk
-
shouldAuth
private boolean shouldAuth
-
authLatch
private java.util.concurrent.CountDownLatch authLatch
-
reconnectBlocked
private java.util.ArrayList<Operation> reconnectBlocked
-
defaultOpTimeout
private long defaultOpTimeout
-
lastReadTimestamp
private volatile long lastReadTimestamp
-
connection
private MemcachedConnection connection
-
continuousTimeout
private final java.util.concurrent.atomic.AtomicInteger continuousTimeout
-
-
Constructor Detail
-
TCPMemcachedNodeImpl
public TCPMemcachedNodeImpl(java.net.SocketAddress sa, java.nio.channels.SocketChannel c, int bufSize, java.util.concurrent.BlockingQueue<Operation> rq, java.util.concurrent.BlockingQueue<Operation> wq, java.util.concurrent.BlockingQueue<Operation> iq, long opQueueMaxBlockTime, boolean waitForAuth, long dt, long authWaitTime, ConnectionFactory fact)
-
-
Method Detail
-
copyInputQueue
public final void copyInputQueue()
Description copied from interface:MemcachedNode
Move all of the operations delivered via addOperation into the internal write queue.- Specified by:
copyInputQueue
in interfaceMemcachedNode
-
destroyInputQueue
public java.util.Collection<Operation> destroyInputQueue()
Description copied from interface:MemcachedNode
Extract all queued items for this node destructively. This is useful for redistributing items.- Specified by:
destroyInputQueue
in interfaceMemcachedNode
-
setupResend
public final void setupResend()
Description copied from interface:MemcachedNode
Clear the queue of currently processing operations by either cancelling them or setting them up to be reapplied after a reconnect.- Specified by:
setupResend
in interfaceMemcachedNode
-
preparePending
private boolean preparePending()
-
fillWriteBuffer
public final void fillWriteBuffer(boolean shouldOptimize)
Description copied from interface:MemcachedNode
Fill the write buffer with data from the next operations in the queue.- Specified by:
fillWriteBuffer
in interfaceMemcachedNode
- Parameters:
shouldOptimize
- if true, combine sequential gets into a single multi-key get
-
getNextWritableOp
private Operation getNextWritableOp()
-
transitionWriteItem
public final void transitionWriteItem()
Description copied from interface:MemcachedNode
Transition the current write item into a read state.- Specified by:
transitionWriteItem
in interfaceMemcachedNode
-
optimize
protected abstract void optimize()
-
getCurrentReadOp
public final Operation getCurrentReadOp()
Description copied from interface:MemcachedNode
Get the operation at the top of the queue that is requiring input.- Specified by:
getCurrentReadOp
in interfaceMemcachedNode
-
removeCurrentReadOp
public final Operation removeCurrentReadOp()
Description copied from interface:MemcachedNode
Remove the operation at the top of the queue that is requiring input.- Specified by:
removeCurrentReadOp
in interfaceMemcachedNode
-
getCurrentWriteOp
public final Operation getCurrentWriteOp()
Description copied from interface:MemcachedNode
Get the operation at the top of the queue that has information available to write.- Specified by:
getCurrentWriteOp
in interfaceMemcachedNode
-
removeCurrentWriteOp
public final Operation removeCurrentWriteOp()
Description copied from interface:MemcachedNode
Remove the operation at the top of the queue that has information available to write.- Specified by:
removeCurrentWriteOp
in interfaceMemcachedNode
-
hasReadOp
public final boolean hasReadOp()
Description copied from interface:MemcachedNode
True if an operation is available to read.- Specified by:
hasReadOp
in interfaceMemcachedNode
-
hasWriteOp
public final boolean hasWriteOp()
Description copied from interface:MemcachedNode
True if an operation is available to write.- Specified by:
hasWriteOp
in interfaceMemcachedNode
-
addOp
public final void addOp(Operation op)
Description copied from interface:MemcachedNode
Add an operation to the queue. Authentication operations should never be added to the queue, but this is not checked.- Specified by:
addOp
in interfaceMemcachedNode
-
insertOp
public final void insertOp(Operation op)
Description copied from interface:MemcachedNode
Insert an operation to the beginning of the queue. This method is meant to be invoked rarely.- Specified by:
insertOp
in interfaceMemcachedNode
-
getSelectionOps
public final int getSelectionOps()
Description copied from interface:MemcachedNode
Compute the appropriate selection operations for the channel this MemcachedNode holds to the server.- Specified by:
getSelectionOps
in interfaceMemcachedNode
-
getRbuf
public final java.nio.ByteBuffer getRbuf()
Description copied from interface:MemcachedNode
Get the buffer used for reading data from this node.- Specified by:
getRbuf
in interfaceMemcachedNode
-
getWbuf
public final java.nio.ByteBuffer getWbuf()
Description copied from interface:MemcachedNode
Get the buffer used for writing data to this node.- Specified by:
getWbuf
in interfaceMemcachedNode
-
getSocketAddress
public final java.net.SocketAddress getSocketAddress()
Description copied from interface:MemcachedNode
Get the SocketAddress of the server to which this node is connected.- Specified by:
getSocketAddress
in interfaceMemcachedNode
-
isActive
public final boolean isActive()
Description copied from interface:MemcachedNode
True if this node isactive.
i.e. is is currently connected and expected to be able to process requests- Specified by:
isActive
in interfaceMemcachedNode
-
isAuthenticated
public boolean isAuthenticated()
Description copied from interface:MemcachedNode
True if this node isauthenticated.
- Specified by:
isAuthenticated
in interfaceMemcachedNode
-
reconnecting
public final void reconnecting()
Description copied from interface:MemcachedNode
Notify this node that it will be reconnecting.- Specified by:
reconnecting
in interfaceMemcachedNode
-
connected
public final void connected()
Description copied from interface:MemcachedNode
Notify this node that it has reconnected.- Specified by:
connected
in interfaceMemcachedNode
-
getReconnectCount
public final int getReconnectCount()
Description copied from interface:MemcachedNode
Get the current reconnect count.- Specified by:
getReconnectCount
in interfaceMemcachedNode
-
toString
public final java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
registerChannel
public final void registerChannel(java.nio.channels.SocketChannel ch, java.nio.channels.SelectionKey skey)
Description copied from interface:MemcachedNode
Register a channel with this node.- Specified by:
registerChannel
in interfaceMemcachedNode
-
setChannel
public final void setChannel(java.nio.channels.SocketChannel to)
Description copied from interface:MemcachedNode
Set the SocketChannel this node uses.- Specified by:
setChannel
in interfaceMemcachedNode
-
getChannel
public final java.nio.channels.SocketChannel getChannel()
Description copied from interface:MemcachedNode
Get the SocketChannel for this connection.- Specified by:
getChannel
in interfaceMemcachedNode
-
setSk
public final void setSk(java.nio.channels.SelectionKey to)
Description copied from interface:MemcachedNode
Set the selection key for this node.- Specified by:
setSk
in interfaceMemcachedNode
-
getSk
public final java.nio.channels.SelectionKey getSk()
Description copied from interface:MemcachedNode
Get the selection key from this node.- Specified by:
getSk
in interfaceMemcachedNode
-
getBytesRemainingToWrite
public final int getBytesRemainingToWrite()
Description copied from interface:MemcachedNode
Get the number of bytes remaining to write.- Specified by:
getBytesRemainingToWrite
in interfaceMemcachedNode
-
writeSome
public final int writeSome() throws java.io.IOException
Description copied from interface:MemcachedNode
Write some bytes and return the number of bytes written.- Specified by:
writeSome
in interfaceMemcachedNode
- Returns:
- the number of bytes written
- Throws:
java.io.IOException
- if there's a problem writing
-
setContinuousTimeout
public void setContinuousTimeout(boolean timedOut)
Description copied from interface:MemcachedNode
Count 'time out' exceptions to drop connections that fail perpetually.- Specified by:
setContinuousTimeout
in interfaceMemcachedNode
-
getContinuousTimeout
public int getContinuousTimeout()
- Specified by:
getContinuousTimeout
in interfaceMemcachedNode
-
fixupOps
public final void fixupOps()
Description copied from interface:MemcachedNode
Fix up the selection ops on the selection key.- Specified by:
fixupOps
in interfaceMemcachedNode
-
authComplete
public final void authComplete()
Description copied from interface:MemcachedNode
Let the node know that auth is complete. Typically this would mean the node can start processing and accept new operations to its input queue.- Specified by:
authComplete
in interfaceMemcachedNode
-
setupForAuth
public final void setupForAuth()
Description copied from interface:MemcachedNode
Tell a node to set up for authentication. Typically this would mean blocking additions to the queue. In a reconnect situation this may mean putting any queued operations on hold to get to an auth complete state.- Specified by:
setupForAuth
in interfaceMemcachedNode
-
lastReadDelta
public long lastReadDelta()
Number of milliseconds since the last read of this node completed.- Specified by:
lastReadDelta
in interfaceMemcachedNode
- Returns:
- milliseconds since last read.
-
completedRead
public void completedRead()
Mark this node as having just completed a read.- Specified by:
completedRead
in interfaceMemcachedNode
-
getConnection
public MemcachedConnection getConnection()
- Specified by:
getConnection
in interfaceMemcachedNode
-
setConnection
public void setConnection(MemcachedConnection connection)
- Specified by:
setConnection
in interfaceMemcachedNode
-
-