From afd01de239e445d6be7dd0adb5514e6bbf37fc07 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 23 Dec 2022 09:37:33 +0800 Subject: [PATCH] inner-1945-supplement: report error packet when connection closed (#3562) inner-2062: fix npe Signed-off-by: dcy10000 Signed-off-by: dcy10000 (cherry picked from commit 74e2023d1fe8321a36251e16ca1a8e3be16626df) --- .../dble/services/BackendService.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/actiontech/dble/services/BackendService.java b/src/main/java/com/actiontech/dble/services/BackendService.java index 67eab188d..f49b76dee 100644 --- a/src/main/java/com/actiontech/dble/services/BackendService.java +++ b/src/main/java/com/actiontech/dble/services/BackendService.java @@ -184,6 +184,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 * @@ -192,6 +204,9 @@ public abstract class BackendService extends AbstractService { @Override protected void handleInnerData(byte[] data) { if (connection.isClosed()) { + if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) { + parseErrorPacket(data, "connection close"); + } return; } @@ -211,16 +226,28 @@ 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(); readSize.set(0); // clear all data from the client LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000)); } } + private void clearTaskQueue() { + ServiceTask task; + while ((task = taskQueue.poll()) != null) { + if (task.getType() == ServiceTaskType.NORMAL) { + final byte[] data = ((NormalServiceTask) task).getOrgData(); + if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) { + parseErrorPacket(data, "cleanup"); + } + } + } + } + @Override public void cleanup() { - this.taskQueue.clear(); + clearTaskQueue(); readSize.set(0); backendSpecialCleanUp(); TraceManager.sessionFinish(this);