Skip to content

Commit e12f542

Browse files
authored
Merge pull request #8 from spatsatzis/master
Add support for turning on tcp keep alive
2 parents a658912 + 90548b0 commit e12f542

File tree

7 files changed

+47
-6
lines changed

7 files changed

+47
-6
lines changed

build.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@
110110
<loadproperties srcfile="${ivy.dir}/libraries.properties"/>
111111
<property name="ivy.jar" location="${lib.dir}/ivy-${ivy.version}.jar"/>
112112
<property name="ivy_repo_url"
113-
value="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar" />
113+
value="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar" />
114114
<property name="mvn_repo_url"
115-
value="http://repo2.maven.org/maven2/org/apache/maven/maven-ant-tasks/${mvn.version}/maven-ant-tasks-${mvn.version}.jar"/>
115+
value="https://repo1.maven.org/maven2/org/apache/maven/maven-ant-tasks/${mvn.version}/maven-ant-tasks-${mvn.version}.jar"/>
116116
<property name="mvn.jar" location="${build.dir}/maven-ant-tasks-${mvn.version}.jar" />
117117
<property name="build.ivy.dir" location="${build.dir}/ivy" />
118118
<property name="build.ivy.lib.dir" location="${build.ivy.dir}/lib" />

ivy/ivysettings.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
<ivysettings>
2424

25-
<property name="repo.maven.org" value="http://repo1.maven.org/maven2/"
25+
<property name="repo.maven.org" value="https://repo1.maven.org/maven2/"
2626
override="false"/>
2727
<property name="ibiblio.maven.org" value="http://www.ibiblio.org/maven2/"
2828
override="false"/>

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

+9
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@ MemcachedNode createMemcachedNode(SocketAddress sa, SocketChannel c,
141141
*/
142142
boolean useNagleAlgorithm();
143143

144+
/**
145+
* If true, keep alive will be used on connected sockets.
146+
*
147+
* <p>
148+
* See {@link java.net.Socket#setKeepAlive(boolean)} for more information.
149+
* </p>
150+
*/
151+
boolean getKeepAlive();
152+
144153
/**
145154
* Observers that should be established at the time of connection
146155
* instantiation.

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

+12
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class ConnectionFactoryBuilder {
6868
protected boolean isDaemon = false;
6969
protected boolean shouldOptimize = false;
7070
protected boolean useNagle = false;
71+
protected boolean keepAlive = false;
7172
protected long maxReconnectDelay =
7273
DefaultConnectionFactory.DEFAULT_MAX_RECONNECT_DELAY;
7374

@@ -107,6 +108,7 @@ public ConnectionFactoryBuilder(ConnectionFactory cf) {
107108
setTimeoutExceptionThreshold(cf.getTimeoutExceptionThreshold());
108109
setTranscoder(cf.getDefaultTranscoder());
109110
setUseNagleAlgorithm(cf.useNagleAlgorithm());
111+
setKeepAlive(cf.getKeepAlive());
110112
setEnableMetrics(cf.enableMetrics());
111113
setListenerExecutorService(cf.getListenerExecutorService());
112114
setAuthWaitTime(cf.getAuthWaitTime());
@@ -240,6 +242,11 @@ public ConnectionFactoryBuilder setUseNagleAlgorithm(boolean to) {
240242
return this;
241243
}
242244

245+
public ConnectionFactoryBuilder setKeepAlive(boolean on) {
246+
keepAlive = on;
247+
return this;
248+
}
249+
243250
/**
244251
* Convenience method to specify the protocol to use.
245252
*/
@@ -428,6 +435,11 @@ public boolean useNagleAlgorithm() {
428435
return useNagle;
429436
}
430437

438+
@Override
439+
public boolean getKeepAlive() {
440+
return keepAlive;
441+
}
442+
431443
@Override
432444
public long getMaxReconnectDelay() {
433445
return maxReconnectDelay;

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,13 @@ public boolean useNagleAlgorithm() {
431431
return false;
432432
}
433433

434+
/*
435+
* (non-Javadoc)
436+
*
437+
* @see net.spy.memcached.ConnectionFactory#getKeepAlive()
438+
*/
439+
public boolean getKeepAlive() { return false; }
440+
434441
/*
435442
* (non-Javadoc)
436443
*
@@ -507,6 +514,6 @@ public String toString() {
507514
+ getReadBufSize() + ", Transcoder: " + getDefaultTranscoder()
508515
+ ", Operation Factory: " + getOperationFactory() + " isDaemon: "
509516
+ isDaemon() + ", Optimized: " + shouldOptimize() + ", Using Nagle: "
510-
+ useNagleAlgorithm() + ", ConnectionFactory: " + getName();
517+
+ useNagleAlgorithm() + ", KeepAlive: " + getKeepAlive() + ", ConnectionFactory: " + getName();
511518
}
512519
}

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

+12-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import java.net.ConnectException;
5454
import java.net.InetAddress;
5555
import java.net.InetSocketAddress;
56+
import java.net.Socket;
5657
import java.net.SocketAddress;
5758
import java.net.SocketException;
5859
import java.nio.ByteBuffer;
@@ -424,7 +425,11 @@ protected List<MemcachedNode> createConnections(
424425
this.connectionFactory.createMemcachedNode(sa, ch, bufSize);
425426
qa.setNodeEndPoint(endPoint);
426427
int ops = 0;
427-
ch.socket().setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
428+
429+
Socket socket = ch.socket();
430+
431+
socket.setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
432+
socket.setKeepAlive(connectionFactory.getKeepAlive());
428433

429434
try {
430435
if (ch.connect(sa)) {
@@ -1312,7 +1317,12 @@ private void attemptReconnects() {
13121317

13131318
ch = SocketChannel.open();
13141319
ch.configureBlocking(false);
1315-
ch.socket().setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
1320+
1321+
Socket socket = ch.socket();
1322+
1323+
socket.setTcpNoDelay(!connectionFactory.useNagleAlgorithm());
1324+
socket.setKeepAlive(connectionFactory.getKeepAlive());
1325+
13161326
int ops = 0;
13171327
SocketAddress sa;
13181328
if(node.getNodeEndPoint() != null){

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

+3
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)