Skip to content

Commit d5f2b72

Browse files
authored
Merge pull request #3826 from actiontech/inner-2368
[inner-2368] fix: when some nodes have been closed during the ddl execution phase, the front side needs to respond with an error.
2 parents 2dc2564 + 6b2ff49 commit d5f2b72

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/BaseDDLHandler.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@
3232
import org.slf4j.Logger;
3333
import org.slf4j.LoggerFactory;
3434

35-
import java.util.Arrays;
36-
import java.util.HashMap;
37-
import java.util.List;
35+
import java.util.*;
3836
import java.util.concurrent.atomic.AtomicBoolean;
3937
import java.util.concurrent.atomic.LongAdder;
4038
import java.util.concurrent.locks.ReentrantLock;
@@ -67,6 +65,7 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl
6765

6866
protected final ReentrantLock lock = new ReentrantLock();
6967
protected HashMap<RouteResultsetNode, Integer> nodeResponseStatus = Maps.newHashMap();
68+
protected Set<MySQLResponseService> closedConnSet = new HashSet<>(1);
7069
protected AtomicBoolean writeToClientFlag = new AtomicBoolean(false);
7170
protected AtomicBoolean specialHandleFlag = new AtomicBoolean(false); // execute special handling only once
7271
protected volatile String errMsg;
@@ -294,7 +293,7 @@ public void connectionClose(@NotNull AbstractService service, String closeReason
294293

295294
MySQLResponseService responseService = (MySQLResponseService) service;
296295
final RouteResultsetNode node = (RouteResultsetNode) responseService.getAttachment();
297-
if (checkIsAlreadyClosed(node)) return;
296+
if (checkIsAlreadyClosed(node, responseService)) return;
298297

299298
LOGGER.warn("backend connect {}, conn info:{}", closeReason0, service);
300299
DDLTraceHelper.log(session.getShardingService(), d -> d.infoByNode(node.getName(), stage, DDLTraceHelper.Status.fail, closeReason0));
@@ -333,11 +332,15 @@ public void executeFail(String errInfo) {
333332
}
334333
}
335334

336-
protected boolean checkIsAlreadyClosed(final RouteResultsetNode node) {
335+
protected boolean checkIsAlreadyClosed(final RouteResultsetNode node, final MySQLResponseService mysqlResponseService) {
337336
lock.lock();
338337
try {
339-
if (nodeResponseStatus.get(node) == null || nodeResponseStatus.get(node) == STATUS_CONN_CLOSE) return true;
340-
nodeResponseStatus.put(node, STATUS_CONN_CLOSE);
338+
if (closedConnSet.contains(mysqlResponseService)) {
339+
nodeResponseStatus.put(node, STATUS_CONN_CLOSE);
340+
return true;
341+
} else {
342+
closedConnSet.add(mysqlResponseService);
343+
}
341344
session.getTargetMap().remove(node);
342345
return false;
343346
} finally {
@@ -375,6 +378,7 @@ protected void setErrPkg(String errMsg0, int errorCode0) {
375378

376379
protected void clearResources() {
377380
nodeResponseStatus.clear();
381+
closedConnSet.clear();
378382
}
379383

380384
protected void handleEndPacket(MySQLPacket packet) {

src/main/java/com/actiontech/dble/backend/mysql/nio/handler/ddl/MultiNodeDdlPrepareHandler.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,16 @@ public void rowEofResponse(final byte[] eof, boolean isLeft, @NotNull AbstractSe
110110
}
111111

112112
@Override
113-
protected boolean checkIsAlreadyClosed(final RouteResultsetNode node) {
113+
protected boolean checkIsAlreadyClosed(final RouteResultsetNode node, final MySQLResponseService mysqlResponseService) {
114114
lock.lock();
115115
try {
116116
if (finishedTest) return true;
117-
if (nodeResponseStatus.get(node) == null || nodeResponseStatus.get(node) == STATUS_CONN_CLOSE) return true;
118-
nodeResponseStatus.put(node, STATUS_CONN_CLOSE);
119-
session.getTargetMap().remove(node);
117+
if (closedConnSet.contains(mysqlResponseService)) {
118+
nodeResponseStatus.put(node, STATUS_CONN_CLOSE);
119+
return true;
120+
} else {
121+
closedConnSet.add(mysqlResponseService);
122+
}
120123
return false;
121124
} finally {
122125
lock.unlock();

0 commit comments

Comments
 (0)