diff --git a/src/main/java/com/actiontech/dble/services/BackendService.java b/src/main/java/com/actiontech/dble/services/BackendService.java index 972e6071e..936d90175 100644 --- a/src/main/java/com/actiontech/dble/services/BackendService.java +++ b/src/main/java/com/actiontech/dble/services/BackendService.java @@ -167,6 +167,18 @@ public abstract class BackendService extends AbstractService { } } + void parseErrorPacket(byte[] data, String reason) { + try { + ErrorPacket errPkg = new ErrorPacket(); + errPkg.read(data); + String errMsg = "errNo:" + errPkg.getErrNo() + " " + new String(errPkg.getMessage()); + LOGGER.warn("no handler process the execute packet err,sql error:{},back service:{},from reason:{}", errMsg, this, reason); + + } catch (RuntimeException e) { + LOGGER.info("error handle error-packet", e); + } + } + /** * handle mysql packet returned from backend mysql * @@ -174,6 +186,9 @@ public abstract class BackendService extends AbstractService { */ protected void handleInnerData(byte[] data) { if (connection.isClosed()) { + if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) { + parseErrorPacket(data, "connection close"); + } return; } @@ -201,15 +216,26 @@ public abstract class BackendService extends AbstractService { LOGGER.warn(this.toString() + " handle data error:", e); connection.close("handle data error:" + e.getMessage()); while (taskQueue.size() > 0) { - taskQueue.clear(); + clearTaskQueue(); // clear all data from the client LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000)); } } + private void clearTaskQueue() { + ServiceTask task; + while ((task = taskQueue.poll()) != null) { + final byte[] data = task.getOrgData(); + if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) { + parseErrorPacket(data, "cleanup"); + } + + } + } + @Override public void cleanup() { - this.taskQueue.clear(); + clearTaskQueue(); backendSpecialCleanUp(); TraceManager.sessionFinish(this); }