diff --git a/src/main/java/com/xiaomi/infra/pegasus/rpc/async/ClientRequestRound.java b/src/main/java/com/xiaomi/infra/pegasus/rpc/async/ClientRequestRound.java index 15db2c47..ece35831 100644 --- a/src/main/java/com/xiaomi/infra/pegasus/rpc/async/ClientRequestRound.java +++ b/src/main/java/com/xiaomi/infra/pegasus/rpc/async/ClientRequestRound.java @@ -34,15 +34,28 @@ public ClientRequestRound( Table.ClientOPCallback cb, boolean enableCounter, long timeoutInMilliseconds) { - operator = op; - callback = cb; - timeoutMs = timeoutInMilliseconds; + this( + op, + cb, + enableCounter, + System.nanoTime() + timeoutInMilliseconds * 1000000L, + timeoutInMilliseconds); + } + + public ClientRequestRound( + client_operator op, + Table.ClientOPCallback cb, + boolean enableCounter, + long expireNanoTime, + long timeoutInMilliseconds) { + this.operator = op; + this.callback = cb; + this.timeoutMs = timeoutInMilliseconds; this.enableCounter = enableCounter; - createNanoTime = System.nanoTime(); - expireNanoTime = createNanoTime + timeoutMs * 1000000L; - isCompleted = false; - backupRequestTask = null; + this.expireNanoTime = expireNanoTime; + this.isCompleted = false; + this.backupRequestTask = null; } public com.xiaomi.infra.pegasus.operator.client_operator getOperator() { diff --git a/src/main/java/com/xiaomi/infra/pegasus/rpc/async/TableHandler.java b/src/main/java/com/xiaomi/infra/pegasus/rpc/async/TableHandler.java index abee5ed0..3c9605c9 100644 --- a/src/main/java/com/xiaomi/infra/pegasus/rpc/async/TableHandler.java +++ b/src/main/java/com/xiaomi/infra/pegasus/rpc/async/TableHandler.java @@ -323,10 +323,16 @@ void onRpcReply( } // must use new round here, because round.isSuccess is true now - tryDelayCall( + // must use round.expireNanoTime to init, otherwise "round.expireNanoTime - System.nanoTime() > + // nanoDelay" in "tryDelayCall()" will be always true + ClientRequestRound delayRequestRound = new ClientRequestRound( - round.operator, round.callback, round.enableCounter, round.timeoutMs), - tryId + 1); + round.operator, + round.callback, + round.enableCounter, + round.expireNanoTime, + round.timeoutMs); + tryDelayCall(delayRequestRound, tryId + 1); } void tryDelayCall(final ClientRequestRound round, final int tryId) {