diff --git a/src/java/voldemort/store/socket/SocketStore.java b/src/java/voldemort/store/socket/SocketStore.java index b15bba9f17..06433b7c24 100644 --- a/src/java/voldemort/store/socket/SocketStore.java +++ b/src/java/voldemort/store/socket/SocketStore.java @@ -263,22 +263,24 @@ public void close() throws VoldemortException { */ private T request(ClientRequest delegate, String operationName) { - ClientRequestExecutor clientRequestExecutor = pool.checkout(destination); - long startTimeMs = -1; long startTimeNs = -1; if(logger.isDebugEnabled()) { startTimeMs = System.currentTimeMillis(); - startTimeNs = System.nanoTime(); } + startTimeNs = System.nanoTime(); + + ClientRequestExecutor clientRequestExecutor = pool.checkout(destination); String debugMsgStr = ""; BlockingClientRequest blockingClientRequest = null; try { blockingClientRequest = new BlockingClientRequest(delegate, timeoutMs); - clientRequestExecutor.addClientRequest(blockingClientRequest, timeoutMs); + clientRequestExecutor.addClientRequest(blockingClientRequest, + timeoutMs, + System.nanoTime() - startTimeNs); blockingClientRequest.await(); if(logger.isDebugEnabled()) diff --git a/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutor.java b/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutor.java index 04429b1711..3dcdc76bdf 100644 --- a/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutor.java +++ b/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutor.java @@ -92,6 +92,12 @@ public synchronized void addClientRequest(ClientRequest clientRequest) { } public synchronized void addClientRequest(ClientRequest clientRequest, long timeoutMs) { + addClientRequest(clientRequest, timeoutMs, 0); + } + + public synchronized void addClientRequest(ClientRequest clientRequest, + long timeoutMs, + long elapsedNs) { if(logger.isTraceEnabled()) logger.trace("Associating client with " + socketChannel.socket()); @@ -100,7 +106,11 @@ public synchronized void addClientRequest(ClientRequest clientRequest, long t if(timeoutMs == -1) { this.expiration = -1; } else { - this.expiration = System.nanoTime() + (Time.NS_PER_MS * timeoutMs); + if (elapsedNs > (Time.NS_PER_MS * timeoutMs)) { + this.expiration = System.nanoTime(); + } else { + this.expiration = System.nanoTime() + (Time.NS_PER_MS * timeoutMs) - elapsedNs; + } if(this.expiration < System.nanoTime()) throw new IllegalArgumentException("timeout " + timeoutMs + " not valid"); diff --git a/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutorPool.java b/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutorPool.java index 46dab58c9a..87dea2492c 100644 --- a/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutorPool.java +++ b/src/java/voldemort/store/socket/clientrequest/ClientRequestExecutorPool.java @@ -298,7 +298,8 @@ public void useResource(ClientRequestExecutor clientRequestExecutor) { delegate, clientRequestExecutor, callback); - clientRequestExecutor.addClientRequest(clientRequest, timeoutMs); + clientRequestExecutor.addClientRequest(clientRequest, timeoutMs, System.nanoTime() + - startTimeNs); } @Override