Skip to content

Commit c232307

Browse files
youngmingenthr
authored andcommitted
Add support for turning on tcp keep alive.
Change-Id: Ic561f87fe262782a607e86ac8b2e0efb69d2c46e Reviewed-on: http://review.couchbase.org/81810 Reviewed-by: Matt Ingenthron <matt@couchbase.com> Tested-by: Matt Ingenthron <matt@couchbase.com>
1 parent 8fe2e33 commit c232307

File tree

5 files changed

+36
-2
lines changed

5 files changed

+36
-2
lines changed

src/main/java/net/spy/memcached/ConnectionFactory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ MemcachedNode createMemcachedNode(SocketAddress sa, SocketChannel c,
124124
*/
125125
boolean useNagleAlgorithm();
126126

127+
/**
128+
* If true, keep alive will be used on connected sockets.
129+
*
130+
* <p>
131+
* See {@link java.net.Socket#setKeepAlive(boolean)} for more information.
132+
* </p>
133+
*/
134+
boolean getKeepAlive();
135+
127136
/**
128137
* Observers that should be established at the time of connection
129138
* instantiation.

src/main/java/net/spy/memcached/ConnectionFactoryBuilder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class ConnectionFactoryBuilder {
6161
protected boolean isDaemon = false;
6262
protected boolean shouldOptimize = false;
6363
protected boolean useNagle = false;
64+
protected boolean keepAlive = false;
6465
protected long maxReconnectDelay =
6566
DefaultConnectionFactory.DEFAULT_MAX_RECONNECT_DELAY;
6667

@@ -222,6 +223,11 @@ public ConnectionFactoryBuilder setUseNagleAlgorithm(boolean to) {
222223
return this;
223224
}
224225

226+
public ConnectionFactoryBuilder setKeepAlive(boolean on) {
227+
keepAlive = on;
228+
return this;
229+
}
230+
225231
/**
226232
* Convenience method to specify the protocol to use.
227233
*/
@@ -400,6 +406,10 @@ public boolean shouldOptimize() {
400406
return shouldOptimize;
401407
}
402408

409+
public boolean getKeepAlive() {
410+
return keepAlive;
411+
}
412+
403413
@Override
404414
public boolean useNagleAlgorithm() {
405415
return useNagle;

src/main/java/net/spy/memcached/DefaultConnectionFactory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,15 @@ public boolean useNagleAlgorithm() {
388388
return false;
389389
}
390390

391+
/*
392+
* (non-Javadoc)
393+
*
394+
* @see net.spy.memcached.ConnectionFactory#getKeepAlive()
395+
*/
396+
public boolean getKeepAlive() {
397+
return false;
398+
}
399+
391400
/*
392401
* (non-Javadoc)
393402
*

src/main/java/net/spy/memcached/MemcachedConnection.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import java.io.IOException;
4848
import java.net.ConnectException;
4949
import java.net.InetSocketAddress;
50+
import java.net.Socket;
5051
import java.net.SocketAddress;
5152
import java.net.SocketException;
5253
import java.nio.ByteBuffer;
@@ -349,8 +350,10 @@ protected List<MemcachedNode> createConnections(
349350
MemcachedNode qa = connectionFactory.createMemcachedNode(sa, ch, bufSize);
350351
qa.setConnection(this);
351352
int ops = 0;
352-
ch.socket().setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
353-
353+
Socket socket = ch.socket();
354+
socket.setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
355+
socket.setKeepAlive(connectionFactory.getKeepAlive());
356+
354357
try {
355358
if (ch.connect(sa)) {
356359
getLogger().info("Connected to %s immediately", qa);

src/test/java/net/spy/memcached/ConnectionFactoryBuilderTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public void testDefaults() throws Exception {
101101
assertFalse(f.isDaemon());
102102
assertFalse(f.shouldOptimize());
103103
assertFalse(f.useNagleAlgorithm());
104+
assertFalse(f.getKeepAlive());
104105
assertEquals(f.getOpQueueMaxBlockTime(),
105106
DefaultConnectionFactory.DEFAULT_OP_QUEUE_MAX_BLOCK_TIME);
106107
assertEquals(f.getAuthWaitTime(),
@@ -140,6 +141,7 @@ public void connectionEstablished(SocketAddress sa, int reconnectCount) {
140141
.setLocatorType(Locator.CONSISTENT).setOpQueueMaxBlockTime(19)
141142
.setAuthDescriptor(anAuthDescriptor)
142143
.setAuthWaitTime(3000)
144+
.setKeepAlive(true)
143145
.build();
144146

145147
assertEquals(4225, f.getOperationTimeout());
@@ -156,6 +158,7 @@ public void connectionEstablished(SocketAddress sa, int reconnectCount) {
156158
assertTrue(f.isDaemon());
157159
assertFalse(f.shouldOptimize());
158160
assertTrue(f.useNagleAlgorithm());
161+
assertTrue(f.getKeepAlive());
159162
assertEquals(f.getOpQueueMaxBlockTime(), 19);
160163
assertSame(anAuthDescriptor, f.getAuthDescriptor());
161164
assertEquals(f.getAuthWaitTime(), 3000);

0 commit comments

Comments
 (0)