Skip to content

Commit d4920d0

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 6872b98 commit d4920d0

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
@@ -181,6 +181,18 @@ private void handleTaskQueue(ThreadContext threadContext) {
181181
}
182182
}
183183

184+
void parseErrorPacket(byte[] data, String reason) {
185+
try {
186+
ErrorPacket errPkg = new ErrorPacket();
187+
errPkg.read(data);
188+
String errMsg = "errNo:" + errPkg.getErrNo() + " " + new String(errPkg.getMessage());
189+
LOGGER.warn("no handler process the execute packet err,sql error:{},back service:{},from reason:{}", errMsg, this, reason);
190+
191+
} catch (RuntimeException e) {
192+
LOGGER.info("error handle error-packet", e);
193+
}
194+
}
195+
184196
/**
185197
* handle mysql packet returned from backend mysql
186198
*
@@ -189,6 +201,9 @@ private void handleTaskQueue(ThreadContext threadContext) {
189201
@Override
190202
protected void handleInnerData(byte[] data) {
191203
if (connection.isClosed()) {
204+
if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) {
205+
parseErrorPacket(data, "connection close");
206+
}
192207
return;
193208
}
194209

@@ -208,16 +223,28 @@ protected void handleDataError(Exception e) {
208223
LOGGER.warn(this.toString() + " handle data error:", e);
209224
connection.close("handle data error:" + e.getMessage());
210225
while (taskQueue.size() > 0) {
211-
taskQueue.clear();
226+
clearTaskQueue();
212227
readSize.set(0);
213228
// clear all data from the client
214229
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000));
215230
}
216231
}
217232

233+
private void clearTaskQueue() {
234+
ServiceTask task;
235+
while ((task = taskQueue.poll()) != null) {
236+
if (task.getType() == ServiceTaskType.NORMAL) {
237+
final byte[] data = ((NormalServiceTask) task).getOrgData();
238+
if (data != null && data.length > 4 && data[4] == ErrorPacket.FIELD_COUNT) {
239+
parseErrorPacket(data, "cleanup");
240+
}
241+
}
242+
}
243+
}
244+
218245
@Override
219246
public void cleanup() {
220-
this.taskQueue.clear();
247+
clearTaskQueue();
221248
readSize.set(0);
222249
backendSpecialCleanUp();
223250
TraceManager.sessionFinish(this);

0 commit comments

Comments
 (0)