diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/BaseDDLHandler.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/BaseDDLHandler.java index 4ac912156..424141707 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/BaseDDLHandler.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/BaseDDLHandler.java @@ -62,6 +62,7 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl protected final ReentrantLock lock = new ReentrantLock(); protected HashMap nodeResponseStatus = Maps.newHashMap(); + protected Set closedConnSet = new HashSet<>(1); protected AtomicBoolean writeToClientFlag = new AtomicBoolean(false); protected AtomicBoolean specialHandleFlag = new AtomicBoolean(false); // execute special handling only once protected volatile String errMsg; @@ -287,7 +288,7 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl MySQLResponseService responseService = (MySQLResponseService) service; final RouteResultsetNode node = (RouteResultsetNode) responseService.getAttachment(); - if (checkIsAlreadyClosed(node)) return; + if (checkIsAlreadyClosed(node, responseService)) return; LOGGER.warn("backend connect {}, conn info:{}", closeReason0, service); DDLTraceHelper.log(session.getShardingService(), d -> d.infoByNode(node.getName(), stage, DDLTraceHelper.Status.fail, closeReason0)); @@ -326,11 +327,15 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl } } - protected boolean checkIsAlreadyClosed(final RouteResultsetNode node) { + protected boolean checkIsAlreadyClosed(final RouteResultsetNode node, final MySQLResponseService mysqlResponseService) { lock.lock(); try { - if (nodeResponseStatus.get(node) == null || nodeResponseStatus.get(node) == STATUS_CONN_CLOSE) return true; - nodeResponseStatus.put(node, STATUS_CONN_CLOSE); + if (closedConnSet.contains(mysqlResponseService)) { + nodeResponseStatus.put(node, STATUS_CONN_CLOSE); + return true; + } else { + closedConnSet.add(mysqlResponseService); + } session.getTargetMap().remove(node); return false; } finally { @@ -368,6 +373,7 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl protected void clearResources() { nodeResponseStatus.clear(); + closedConnSet.clear(); } protected void handleEndPacket(MySQLPacket packet) { diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/MultiNodeDdlPrepareHandler.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/MultiNodeDdlPrepareHandler.java index f42c767e2..7f022dc48 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/MultiNodeDdlPrepareHandler.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/MultiNodeDdlPrepareHandler.java @@ -112,13 +112,16 @@ public class MultiNodeDdlPrepareHandler extends BaseDDLHandler { } @Override - protected boolean checkIsAlreadyClosed(final RouteResultsetNode node) { + protected boolean checkIsAlreadyClosed(final RouteResultsetNode node, final MySQLResponseService mysqlResponseService) { lock.lock(); try { if (finishedTest) return true; - if (nodeResponseStatus.get(node) == null || nodeResponseStatus.get(node) == STATUS_CONN_CLOSE) return true; - nodeResponseStatus.put(node, STATUS_CONN_CLOSE); - session.getTargetMap().remove(node); + if (closedConnSet.contains(mysqlResponseService)) { + nodeResponseStatus.put(node, STATUS_CONN_CLOSE); + return true; + } else { + closedConnSet.add(mysqlResponseService); + } return false; } finally { lock.unlock();