Skip to content

Commit 6bbc520

Browse files
committed
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 74e2023)
1 parent 2521861 commit 6bbc520

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

src/main/java/com/actiontech/dble/services/BackendService.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,18 @@ private void handleTaskQueue(ThreadContext threadContext) {
191191
}
192192
}
193193

194+
void parseErrorPacket(byte[] data, String reason) {
195+
try {
196+
ErrorPacket errPkg = new ErrorPacket();
197+
errPkg.read(data);
198+
String errMsg = "errNo:" + errPkg.getErrNo() + " " + new String(errPkg.getMessage());
199+
LOGGER.warn("no handler process the execute packet err,sql error:{},back service:{},from reason:{}", errMsg, this, reason);
200+
201+
} catch (RuntimeException e) {
202+
LOGGER.info("error handle error-packet", e);
203+
}
204+
}
205+
194206
/**
195207
* handle mysql packet returned from backend mysql
196208
*
@@ -199,6 +211,9 @@ private void handleTaskQueue(ThreadContext threadContext) {
199211
@Override
200212
protected void handleInnerData(byte[] data) {
201213
if (connection.isClosed()) {
214+
if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) {
215+
parseErrorPacket(data, "connection close");
216+
}
202217
return;
203218
}
204219

@@ -218,16 +233,28 @@ protected void handleDataError(Exception e) {
218233
LOGGER.warn(this.toString() + " handle data error:", e);
219234
connection.close("handle data error:" + e.getMessage());
220235
while (taskQueue.size() > 0) {
221-
taskQueue.clear();
236+
clearTaskQueue();
222237
readSize.set(0);
223238
// clear all data from the client
224239
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000));
225240
}
226241
}
227242

243+
private void clearTaskQueue() {
244+
ServiceTask task;
245+
while ((task = taskQueue.poll()) != null) {
246+
if (task.getType() == ServiceTaskType.NORMAL) {
247+
final byte[] data = ((NormalServiceTask) task).getOrgData();
248+
if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) {
249+
parseErrorPacket(data, "cleanup");
250+
}
251+
}
252+
}
253+
}
254+
228255
@Override
229256
public void cleanup() {
230-
this.taskQueue.clear();
257+
clearTaskQueue();
231258
readSize.set(0);
232259
backendSpecialCleanUp();
233260
TraceManager.sessionFinish(this);

0 commit comments

Comments
 (0)