diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/DefaultMultiNodeHandler.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/DefaultMultiNodeHandler.java index b7d24928a..77e7f2525 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/DefaultMultiNodeHandler.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/DefaultMultiNodeHandler.java @@ -45,9 +45,9 @@ public abstract class DefaultMultiNodeHandler extends MultiNodeHandler { public final void errorResponse(byte[] err, @Nonnull AbstractService service) { MySQLResponseService responseService = (MySQLResponseService) service; boolean executeResponse = responseService.syncAndExecute(); + RouteResultsetNode rNode = (RouteResultsetNode) responseService.getAttachment(); if (!executeResponse) { responseService.getConnection().businessClose("unfinished sync"); - RouteResultsetNode rNode = (RouteResultsetNode) responseService.getAttachment(); session.getTargetMap().remove(rNode); } @@ -59,7 +59,7 @@ public abstract class DefaultMultiNodeHandler extends MultiNodeHandler { LOGGER.debug("receive error [{}] from {}", errMsg, responseService); } handleErrorResponse(errPacket, responseService); - if (decrementToZero(responseService)) { + if (decrementToZero(rNode)) { finish(null); } } @@ -75,8 +75,10 @@ public abstract class DefaultMultiNodeHandler extends MultiNodeHandler { } boolean executeResponse = responseService.syncAndExecute(); if (executeResponse) { + // record attachment,because this backend conn may be released in handleOkResponse + RouteResultsetNode rNode = (RouteResultsetNode) responseService.getAttachment(); handleOkResponse(ok, service); - if (decrementToZero(responseService)) { + if (decrementToZero(rNode)) { finish(ok); } } diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/MultiNodeHandler.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/MultiNodeHandler.java index 1162feb2e..409d30117 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/MultiNodeHandler.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/MultiNodeHandler.java @@ -67,6 +67,18 @@ public abstract class MultiNodeHandler implements ResponseHandler { return zeroReached; } + protected boolean decrementToZero(RouteResultsetNode rNode) { + boolean zeroReached; + lock.lock(); + try { + unResponseRrns.remove(rNode); + zeroReached = canResponse(); + } finally { + lock.unlock(); + } + return zeroReached; + } + protected void reset() { errorConnsCnt = 0; firstResponsed = false; diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/transaction/xa/handler/AbstractXAHandler.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/transaction/xa/handler/AbstractXAHandler.java index 4fb81c5d5..1218c23af 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/transaction/xa/handler/AbstractXAHandler.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/transaction/xa/handler/AbstractXAHandler.java @@ -68,18 +68,6 @@ public abstract class AbstractXAHandler extends DefaultMultiNodeHandler { } } - protected boolean decrementToZero(RouteResultsetNode rrsn) { - boolean zeroReached; - lock.lock(); - try { - unResponseRrns.remove(rrsn); - zeroReached = canResponse(); - } finally { - lock.unlock(); - } - return zeroReached; - } - @Override public void handleOkResponse(byte[] ok, @NotNull AbstractService service) { this.currentStage.onConnectionOk((MySQLResponseService) service);