inner-1945-supplement: report error packet when connection closed (#3562)

inner-2062: fix npe

Signed-off-by: dcy10000 <dcy10000@gmail.com>

Signed-off-by: dcy10000 <dcy10000@gmail.com>
(cherry picked from commit 74e2023d1f)
This commit is contained in:
Rico
2022-12-23 09:37:33 +08:00
committed by dcy10000
parent 11965e509e
commit afd01de239

View File

@@ -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);