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

inner-2062: fix npe

Signed-off-by: dcy10000 <dcy10000@gmail.com>
This commit is contained in:
Rico
2022-12-23 09:37:33 +08:00
parent e04d10087c
commit e7fca9337d

View File

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