fix kill query in ddl (#1621)

* fix kill query in ddl

* fix kill query in ddl
This commit is contained in:
Collapsar
2020-01-08 14:20:40 +08:00
committed by tiger.yan
parent b2c6853db1
commit eee49a30f8
3 changed files with 13 additions and 6 deletions
@@ -268,7 +268,13 @@ public class MultiNodeDdlPrepareHandler extends MultiNodeHandler {
finishedTest = true;
session.setTraceSimpleHandler(handler);
session.setPreExecuteEnd(false);
handler.execute();
if (!session.isKilled()) {
handler.execute();
} else {
DDLTraceManager.getInstance().endDDL(source, "Query was interrupted");
session.handleSpecial(oriRrs, false);
source.writeErrMessage(ErrorCode.ER_QUERY_INTERRUPTED, "Query was interrupted");
}
} catch (Exception e) {
DDLTraceManager.getInstance().endDDL(source, "take Connection error:" + e.getMessage());
LOGGER.warn(String.valueOf(source) + oriRrs, e);
@@ -575,7 +575,7 @@ public class ServerConnection extends FrontendConnection {
public void writeErrMessage(String sqlState, String msg, int vendorCode) {
byte packetId = (byte) this.getSession2().getPacketId().get();
super.writeErrMessage(++packetId, vendorCode, sqlState, msg);
if (session.isKilled()) {
if (session.isDiscard() || session.isKilled()) {
session.setKilled(false);
session.setDiscard(false);
}
@@ -585,7 +585,7 @@ public class ServerConnection extends FrontendConnection {
public void writeErrMessage(int vendorCode, String msg) {
byte packetId = (byte) this.getSession2().getPacketId().get();
super.writeErrMessage(++packetId, vendorCode, msg);
if (session.isKilled()) {
if (session.isDiscard() || session.isKilled()) {
session.setKilled(false);
session.setDiscard(false);
}
@@ -596,7 +596,7 @@ public class ServerConnection extends FrontendConnection {
SerializableLock.getInstance().unLock(this.id);
markFinished();
super.write(data);
if (session.isKilled()) {
if (session.isDiscard() || session.isKilled()) {
session.setKilled(false);
session.setDiscard(false);
}
@@ -607,7 +607,7 @@ public class ServerConnection extends FrontendConnection {
SerializableLock.getInstance().unLock(this.id);
markFinished();
super.write(buffer);
if (session.isKilled()) {
if (session.isDiscard() || session.isKilled()) {
session.setKilled(false);
session.setDiscard(false);
}
@@ -100,8 +100,9 @@ public final class KillHandler {
if (killSession.isKilled() && killSession.isDiscard()) {
// discard backend conn in session target map
Map<RouteResultsetNode, BackendConnection> target = killSession.getTargetMap();
MySQLConnection conn;
for (BackendConnection backendConnection : target.values()) {
MySQLConnection conn = (MySQLConnection) backendConnection;
conn = (MySQLConnection) backendConnection;
if (conn.isExecuting()) {
conn.execCmd("kill query " + conn.getThreadId());
conn.close("Query was interrupted.");