|
32 | 32 | import org.slf4j.Logger;
|
33 | 33 | import org.slf4j.LoggerFactory;
|
34 | 34 |
|
35 |
| -import java.util.Arrays; |
36 |
| -import java.util.HashMap; |
37 |
| -import java.util.List; |
| 35 | +import java.util.*; |
38 | 36 | import java.util.concurrent.atomic.AtomicBoolean;
|
39 | 37 | import java.util.concurrent.atomic.LongAdder;
|
40 | 38 | import java.util.concurrent.locks.ReentrantLock;
|
@@ -67,6 +65,7 @@ public abstract class BaseDDLHandler implements ResponseHandler, ExecutableHandl
|
67 | 65 |
|
68 | 66 | protected final ReentrantLock lock = new ReentrantLock();
|
69 | 67 | protected HashMap<RouteResultsetNode, Integer> nodeResponseStatus = Maps.newHashMap();
|
| 68 | + protected Set<MySQLResponseService> closedConnSet = new HashSet<>(1); |
70 | 69 | protected AtomicBoolean writeToClientFlag = new AtomicBoolean(false);
|
71 | 70 | protected AtomicBoolean specialHandleFlag = new AtomicBoolean(false); // execute special handling only once
|
72 | 71 | protected volatile String errMsg;
|
@@ -294,7 +293,7 @@ public void connectionClose(@NotNull AbstractService service, String closeReason
|
294 | 293 |
|
295 | 294 | MySQLResponseService responseService = (MySQLResponseService) service;
|
296 | 295 | final RouteResultsetNode node = (RouteResultsetNode) responseService.getAttachment();
|
297 |
| - if (checkIsAlreadyClosed(node)) return; |
| 296 | + if (checkIsAlreadyClosed(node, responseService)) return; |
298 | 297 |
|
299 | 298 | LOGGER.warn("backend connect {}, conn info:{}", closeReason0, service);
|
300 | 299 | DDLTraceHelper.log(session.getShardingService(), d -> d.infoByNode(node.getName(), stage, DDLTraceHelper.Status.fail, closeReason0));
|
@@ -333,11 +332,15 @@ public void executeFail(String errInfo) {
|
333 | 332 | }
|
334 | 333 | }
|
335 | 334 |
|
336 |
| - protected boolean checkIsAlreadyClosed(final RouteResultsetNode node) { |
| 335 | + protected boolean checkIsAlreadyClosed(final RouteResultsetNode node, final MySQLResponseService mysqlResponseService) { |
337 | 336 | lock.lock();
|
338 | 337 | 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 | + } |
341 | 344 | session.getTargetMap().remove(node);
|
342 | 345 | return false;
|
343 | 346 | } finally {
|
@@ -375,6 +378,7 @@ protected void setErrPkg(String errMsg0, int errorCode0) {
|
375 | 378 |
|
376 | 379 | protected void clearResources() {
|
377 | 380 | nodeResponseStatus.clear();
|
| 381 | + closedConnSet.clear(); |
378 | 382 | }
|
379 | 383 |
|
380 | 384 | protected void handleEndPacket(MySQLPacket packet) {
|
|
0 commit comments