e-mzungu / rjc

Redis Java Client
Other
26 stars 5 forks source link

SocketReadTimeouts after exception on execute #17

Open jencompgeek opened 11 years ago

jencompgeek commented 11 years ago

The following code results in the following Exception on client.getAll() because the "pipelinedCommands" count of RedisConnectionImpl does not get decremented on Exception:

@Test
public void testExceptionExecuteNative() {
    SimpleDataSource dataSource = new SimpleDataSource("localhost", Protocol.DEFAULT_PORT, Protocol.DEFAULT_TIMEOUT, null);
    RedisConnection connection = dataSource.getConnection();
    // Wrong number of arguments to ZAdd
    connection.sendCommand(Command.valueOf("ZADD"), new byte[][] {"foo".getBytes()});
    try {
        connection.getAll();
    }catch(RedisException e) {
        // Expected due to syntax error
    }
    Client client = new Client(connection);
    client.get("akey");
    client.getAll();
}

Error:

org.idevlab.rjc.RedisException: java.net.SocketTimeoutException: Read timed out
at org.idevlab.rjc.protocol.Protocol.process(Protocol.java:89)
at org.idevlab.rjc.protocol.Protocol.read(Protocol.java:137)
at org.idevlab.rjc.ds.RedisConnectionImpl.getAll(RedisConnectionImpl.java:178)
at org.idevlab.rjc.Client.getAll(Client.java:696)
at org.springframework.data.redis.connection.rjc.RjcTest.testExceptionExecuteNative(RjcTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:90)
at org.idevlab.rjc.protocol.RedisInputStream.fill(RedisInputStream.java:110)
at org.idevlab.rjc.protocol.RedisInputStream.readByte(RedisInputStream.java:45)
at org.idevlab.rjc.protocol.Protocol.process(Protocol.java:74)
... 26 more