add checks when server closes idle connections
This commit is contained in:
@@ -16,9 +16,11 @@
|
|||||||
|
|
||||||
package redis.clients.util;
|
package redis.clients.util;
|
||||||
|
|
||||||
import redis.clients.jedis.JedisException;
|
import java.io.FilterInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
import java.io.*;
|
import redis.clients.jedis.JedisException;
|
||||||
|
|
||||||
public class RedisInputStream extends FilterInputStream {
|
public class RedisInputStream extends FilterInputStream {
|
||||||
|
|
||||||
@@ -38,9 +40,9 @@ public class RedisInputStream extends FilterInputStream {
|
|||||||
this(in, 8192);
|
this(in, 8192);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte readByte () throws IOException {
|
public byte readByte() throws IOException {
|
||||||
if(count == limit) {
|
if (count == limit) {
|
||||||
fill ();
|
fill();
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf[count++];
|
return buf[count++];
|
||||||
@@ -53,19 +55,19 @@ public class RedisInputStream extends FilterInputStream {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
while (true) {
|
while (true) {
|
||||||
if(count == limit) {
|
if (count == limit) {
|
||||||
fill ();
|
fill();
|
||||||
}
|
}
|
||||||
if(limit == -1)
|
if (limit == -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
b = buf[count++];
|
b = buf[count++];
|
||||||
if (b == '\r') {
|
if (b == '\r') {
|
||||||
if(count == limit) {
|
if (count == limit) {
|
||||||
fill ();
|
fill();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(limit == -1) {
|
if (limit == -1) {
|
||||||
sb.append((char) b);
|
sb.append((char) b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -83,14 +85,19 @@ public class RedisInputStream extends FilterInputStream {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new JedisException(e);
|
throw new JedisException(e);
|
||||||
}
|
}
|
||||||
return sb.toString();
|
String reply = sb.toString();
|
||||||
|
if (reply.isEmpty()) {
|
||||||
|
throw new JedisException(
|
||||||
|
"It seems like server has closed the connection.");
|
||||||
|
}
|
||||||
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int read(byte[] b, int off, int len) throws IOException {
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
if(count == limit) {
|
if (count == limit) {
|
||||||
fill ();
|
fill();
|
||||||
if(limit == -1)
|
if (limit == -1)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
final int length = Math.min(limit - count, len);
|
final int length = Math.min(limit - count, len);
|
||||||
@@ -99,7 +106,7 @@ public class RedisInputStream extends FilterInputStream {
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fill () throws IOException {
|
private void fill() throws IOException {
|
||||||
limit = in.read(buf);
|
limit = in.read(buf);
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.Map;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import redis.clients.jedis.Jedis;
|
import redis.clients.jedis.Jedis;
|
||||||
|
import redis.clients.jedis.JedisException;
|
||||||
import redis.clients.jedis.JedisShardInfo;
|
import redis.clients.jedis.JedisShardInfo;
|
||||||
import redis.clients.jedis.Protocol;
|
import redis.clients.jedis.Protocol;
|
||||||
import redis.clients.jedis.tests.commands.JedisCommandTestBase;
|
import redis.clients.jedis.tests.commands.JedisCommandTestBase;
|
||||||
@@ -41,4 +42,16 @@ public class JedisTest extends JedisCommandTestBase {
|
|||||||
Jedis jedis = new Jedis(shardInfo);
|
Jedis jedis = new Jedis(shardInfo);
|
||||||
jedis.get("foo");
|
jedis.get("foo");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Test(expected = JedisException.class)
|
||||||
|
public void timeoutConnection() throws Exception {
|
||||||
|
jedis = new Jedis("localhost", 6379, 15000);
|
||||||
|
jedis.auth("foobared");
|
||||||
|
jedis.configSet("timeout", "1");
|
||||||
|
// we need to sleep a long time since redis check for idle connections
|
||||||
|
// every 10 seconds or so
|
||||||
|
Thread.sleep(20000);
|
||||||
|
jedis.hmget("foobar", "foo");
|
||||||
|
jedis.configSet("timeout", "300");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,6 @@ import org.junit.Test;
|
|||||||
public class ConnectionHandlingCommandsTest extends JedisCommandTestBase {
|
public class ConnectionHandlingCommandsTest extends JedisCommandTestBase {
|
||||||
@Test
|
@Test
|
||||||
public void quit() {
|
public void quit() {
|
||||||
jedis.quit();
|
jedis.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user