diff --git a/src/main/java/com/actiontech/dble/config/model/SystemConfig.java b/src/main/java/com/actiontech/dble/config/model/SystemConfig.java index 02d55cc0a..5c5bf1646 100644 --- a/src/main/java/com/actiontech/dble/config/model/SystemConfig.java +++ b/src/main/java/com/actiontech/dble/config/model/SystemConfig.java @@ -239,6 +239,26 @@ public final class SystemConfig { private String gmsslOcaPem = null; private boolean supportSSL = false; + private int enableAsyncRelease = 0; + //unit: ms + private long releaseTimeout = 10 * 60 * 1000L; + + public int getEnableAsyncRelease() { + return enableAsyncRelease; + } + + public void setEnableAsyncRelease(int enableAsyncRelease) { + this.enableAsyncRelease = enableAsyncRelease; + } + + public long getReleaseTimeout() { + return releaseTimeout; + } + + public void setReleaseTimeout(long releaseTimeout) { + this.releaseTimeout = releaseTimeout; + } + public String getServerCertificateKeyStoreUrl() { return serverCertificateKeyStoreUrl; } @@ -1817,6 +1837,8 @@ public final class SystemConfig { ", district='" + district + ", dataCenter='" + dataCenter + ", groupConcatMaxLen='" + groupConcatMaxLen + + ", releaseTimeout=" + releaseTimeout + + ", enableAsyncRelease=" + enableAsyncRelease + "]"; } diff --git a/src/main/java/com/actiontech/dble/net/handler/BackEndRecycleRunnable.java b/src/main/java/com/actiontech/dble/net/handler/BackEndRecycleRunnable.java index 03d57e80e..3b8b827fe 100644 --- a/src/main/java/com/actiontech/dble/net/handler/BackEndRecycleRunnable.java +++ b/src/main/java/com/actiontech/dble/net/handler/BackEndRecycleRunnable.java @@ -5,6 +5,7 @@ package com.actiontech.dble.net.handler; +import com.actiontech.dble.config.model.SystemConfig; import com.actiontech.dble.net.connection.BackendConnection; import com.actiontech.dble.services.mysqlsharding.MySQLResponseService; @@ -26,6 +27,32 @@ public class BackEndRecycleRunnable implements Runnable, BackEndCleaner { service.setRecycler(this); } + public void runSync() { + BackendConnection conn = service.getConnection(); + if (conn.isClosed()) { + return; + } + + try { + lock.lock(); + try { + if (service.isRowDataFlowing()) { + if (!condRelease.await(SystemConfig.getInstance().getReleaseTimeout(), TimeUnit.MILLISECONDS)) { + if (!conn.isClosed()) { + conn.businessClose("recycle time out"); + } + } + } + } catch (Exception e) { + service.getConnection().businessClose("recycle exception"); + } finally { + lock.unlock(); + } + } catch (Throwable e) { + service.getConnection().businessClose("recycle exception"); + } + } + @Override public void run() { @@ -38,7 +65,7 @@ public class BackEndRecycleRunnable implements Runnable, BackEndCleaner { lock.lock(); try { if (service.isRowDataFlowing()) { - if (!condRelease.await(10, TimeUnit.MILLISECONDS)) { + if (!condRelease.await(SystemConfig.getInstance().getReleaseTimeout(), TimeUnit.MILLISECONDS)) { if (!conn.isClosed()) { conn.businessClose("recycle time out"); } diff --git a/src/main/java/com/actiontech/dble/services/mysqlsharding/MySQLResponseService.java b/src/main/java/com/actiontech/dble/services/mysqlsharding/MySQLResponseService.java index 7fa7650a3..3563eee15 100644 --- a/src/main/java/com/actiontech/dble/services/mysqlsharding/MySQLResponseService.java +++ b/src/main/java/com/actiontech/dble/services/mysqlsharding/MySQLResponseService.java @@ -234,6 +234,9 @@ public class MySQLResponseService extends BackendService { protocolResponseHandler = defaultResponseHandler; } synAndDoExecuteMultiNode(synSQL, rrn, service.getCharset()); + } catch (Exception e) { + LOGGER.info("route error {},{},{}", rrn, this, service); + throw e; } finally { TraceManager.finishSpan(this, traceObject); } @@ -370,8 +373,13 @@ public class MySQLResponseService extends BackendService { if (logResponse.compareAndSet(false, true)) { session.setBackendResponseEndTime(this); } - DbleServer.getInstance().getComplexQueryExecutor().execute(new BackEndRecycleRunnable(this)); - return false; + if (SystemConfig.getInstance().getEnableAsyncRelease() == 1) { + DbleServer.getInstance().getComplexQueryExecutor().execute(new BackEndRecycleRunnable(this)); + return false; + } else { + new BackEndRecycleRunnable(this).runSync(); + } + } complexQuery = false; attachment = null;