This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 05b840fcb9 [improvement] support show query stmt in show processlist (#11232) 05b840fcb9 is described below commit 05b840fcb9137704eb195d3fc7a6f363bbd3f568 Author: Mingyu Chen <morningman....@gmail.com> AuthorDate: Wed Jul 27 11:40:47 2022 +0800 [improvement] support show query stmt in show processlist (#11232) --- fe/fe-core/src/main/cup/sql_parser.cup | 2 +- .../apache/doris/analysis/ShowProcesslistStmt.java | 34 +++++++++++++--------- .../doris/httpv2/controller/SessionController.java | 3 +- .../java/org/apache/doris/qe/ConnectContext.java | 20 ++++++++++--- .../java/org/apache/doris/qe/ConnectScheduler.java | 9 +++--- .../main/java/org/apache/doris/qe/QeProcessor.java | 2 ++ .../java/org/apache/doris/qe/QeProcessorImpl.java | 9 ++++++ .../java/org/apache/doris/qe/ShowExecutor.java | 3 +- .../java/org/apache/doris/qe/StmtExecutor.java | 1 - .../org/apache/doris/qe/ConnectContextTest.java | 4 +-- .../java/org/apache/doris/qe/ShowExecutorTest.java | 4 +-- 11 files changed, 61 insertions(+), 30 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 9e7dc6271b..6104019eaa 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -2654,7 +2654,7 @@ show_param ::= /* show processlist */ | opt_full KW_PROCESSLIST {: - RESULT = new ShowProcesslistStmt(); + RESULT = new ShowProcesslistStmt(parser.isVerbose); :} /* routine */ | procedure_or_function KW_STATUS opt_wild_where diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcesslistStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcesslistStmt.java index 8097ffacc2..6e3aa5150a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcesslistStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcesslistStmt.java @@ -25,18 +25,26 @@ import org.apache.doris.qe.ShowResultSetMetaData; // SHOW PROCESSLIST statement. // Used to show connection belong to this user. public class ShowProcesslistStmt extends ShowStmt { - private static final ShowResultSetMetaData META_DATA = - ShowResultSetMetaData.builder() - .addColumn(new Column("Id", ScalarType.createType(PrimitiveType.BIGINT))) - .addColumn(new Column("User", ScalarType.createVarchar(16))) - .addColumn(new Column("Host", ScalarType.createVarchar(16))) - .addColumn(new Column("Cluster", ScalarType.createVarchar(16))) - .addColumn(new Column("Db", ScalarType.createVarchar(16))) - .addColumn(new Column("Command", ScalarType.createVarchar(16))) - .addColumn(new Column("Time", ScalarType.createType(PrimitiveType.INT))) - .addColumn(new Column("State", ScalarType.createVarchar(64))) - .addColumn(new Column("Info", ScalarType.createVarchar(16))) - .build(); + private static final ShowResultSetMetaData META_DATA = ShowResultSetMetaData.builder() + .addColumn(new Column("Id", ScalarType.createType(PrimitiveType.BIGINT))) + .addColumn(new Column("User", ScalarType.createVarchar(16))) + .addColumn(new Column("Host", ScalarType.createVarchar(16))) + .addColumn(new Column("Cluster", ScalarType.createVarchar(16))) + .addColumn(new Column("Db", ScalarType.createVarchar(16))) + .addColumn(new Column("Command", ScalarType.createVarchar(16))) + .addColumn(new Column("Time", ScalarType.createType(PrimitiveType.INT))) + .addColumn(new Column("State", ScalarType.createVarchar(64))) + .addColumn(new Column("Info", ScalarType.STRING)).build(); + + private boolean isFull; + + public ShowProcesslistStmt(boolean isFull) { + this.isFull = isFull; + } + + public boolean isFull() { + return isFull; + } @Override public void analyze(Analyzer analyzer) { @@ -44,7 +52,7 @@ public class ShowProcesslistStmt extends ShowStmt { @Override public String toSql() { - return "SHOW PROCESSLIST"; + return "SHOW " + (isFull ? "FULL" : "") + "PROCESSLIST"; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/SessionController.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/SessionController.java index 55b202354d..35a93a4178 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/SessionController.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/SessionController.java @@ -61,7 +61,8 @@ public class SessionController extends BaseController { } private void appendSessionInfo(Map<String, Object> result) { - List<ConnectContext.ThreadInfo> threadInfos = ExecuteEnv.getInstance().getScheduler().listConnection("root"); + List<ConnectContext.ThreadInfo> threadInfos = ExecuteEnv.getInstance().getScheduler() + .listConnection("root", false); List<List<String>> rows = Lists.newArrayList(); result.put("column_names", SESSION_TABLE_HEADER); diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java index ddce53fa5c..5409f75615 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java @@ -504,8 +504,8 @@ public class ConnectContext { // kill operation with no protect. public void kill(boolean killConnection) { - LOG.warn("kill timeout query, {}, kill connection: {}", - getMysqlChannel().getRemoteHostPortString(), killConnection); + LOG.warn("kill query from {}, kill connection: {}", getMysqlChannel().getRemoteHostPortString(), + killConnection); if (killConnection) { isKilled = true; @@ -551,10 +551,11 @@ public class ConnectContext { } // Helper to dump connection information. - public ThreadInfo toThreadInfo() { + public ThreadInfo toThreadInfo(boolean isFull) { if (threadInfo == null) { threadInfo = new ThreadInfo(); } + threadInfo.isFull = isFull; return threadInfo; } @@ -584,6 +585,8 @@ public class ConnectContext { } public class ThreadInfo { + public boolean isFull; + public List<String> toRow(long nowMs) { List<String> row = Lists.newArrayList(); row.add("" + connectionId); @@ -594,7 +597,15 @@ public class ConnectContext { row.add(command.toString()); row.add("" + (nowMs - startTime) / 1000); row.add(""); - row.add(""); + if (queryId != null) { + String sql = QeProcessorImpl.INSTANCE.getCurrentQueryByQueryId(queryId); + if (!isFull) { + sql = sql.substring(0, Math.min(sql.length(), 100)); + } + row.add(sql); + } else { + row.add(""); + } return row; } } @@ -604,3 +615,4 @@ public class ConnectContext { } } + diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectScheduler.java index f6765e222f..c9eed7286a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectScheduler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectScheduler.java @@ -136,17 +136,16 @@ public class ConnectScheduler { return numberConnection.get(); } - public List<ConnectContext.ThreadInfo> listConnection(String user) { + public List<ConnectContext.ThreadInfo> listConnection(String user, boolean isFull) { List<ConnectContext.ThreadInfo> infos = Lists.newArrayList(); for (ConnectContext ctx : connectionMap.values()) { // Check auth - if (!ctx.getQualifiedUser().equals(user) - && !Env.getCurrentEnv().getAuth().checkGlobalPriv(ConnectContext.get(), - PrivPredicate.GRANT)) { + if (!ctx.getQualifiedUser().equals(user) && !Env.getCurrentEnv().getAuth() + .checkGlobalPriv(ConnectContext.get(), PrivPredicate.GRANT)) { continue; } - infos.add(ctx.toThreadInfo()); + infos.add(ctx.toThreadInfo(isFull)); } return infos; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessor.java index 30ecbe6da7..64efd5ef2b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessor.java @@ -39,5 +39,7 @@ public interface QeProcessor { Map<String, QueryStatisticsItem> getQueryStatistics(); + String getCurrentQueryByQueryId(TUniqueId queryId); + Coordinator getCoordinator(TUniqueId queryId); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessorImpl.java b/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessorImpl.java index 44b67da877..39a6797c91 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessorImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/QeProcessorImpl.java @@ -200,6 +200,15 @@ public final class QeProcessorImpl implements QeProcessor { return result; } + @Override + public String getCurrentQueryByQueryId(TUniqueId queryId) { + QueryInfo info = coordinatorMap.get(queryId); + if (info != null && info.sql != null) { + return info.sql; + } + return ""; + } + public static final class QueryInfo { private final ConnectContext connectContext; private final Coordinator coord; diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index 8a8a6fa02c..33268b0781 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -375,7 +375,8 @@ public class ShowExecutor { ShowProcesslistStmt showStmt = (ShowProcesslistStmt) stmt; List<List<String>> rowSet = Lists.newArrayList(); - List<ConnectContext.ThreadInfo> threadInfos = ctx.getConnectScheduler().listConnection(ctx.getQualifiedUser()); + List<ConnectContext.ThreadInfo> threadInfos = ctx.getConnectScheduler() + .listConnection(ctx.getQualifiedUser(), showStmt.isFull()); long nowMs = System.currentTimeMillis(); for (ConnectContext.ThreadInfo info : threadInfos) { rowSet.add(info.toRow(nowMs)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java index 9fbb0d0645..b092cab722 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java @@ -1004,7 +1004,6 @@ public class StmtExecutor implements ProfileWriter { sendResult(isOutfileQuery, false, queryStmt, channel, null, null); } - private void sendResult(boolean isOutfileQuery, boolean isSendFields, Queriable queryStmt, MysqlChannel channel, CacheAnalyzer cacheAnalyzer, InternalService.PFetchCacheResult cacheResult) throws Exception { // 1. If this is a query with OUTFILE clause, eg: select * from tbl1 into outfile xxx, diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/ConnectContextTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/ConnectContextTest.java index 5566ec8e37..2a984d9564 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/qe/ConnectContextTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/qe/ConnectContextTest.java @@ -116,8 +116,8 @@ public class ConnectContextTest { Assert.assertEquals(MysqlCommand.COM_PING, ctx.getCommand()); // Thread info - Assert.assertNotNull(ctx.toThreadInfo()); - List<String> row = ctx.toThreadInfo().toRow(1000); + Assert.assertNotNull(ctx.toThreadInfo(false)); + List<String> row = ctx.toThreadInfo(false).toRow(1000); Assert.assertEquals(9, row.size()); Assert.assertEquals("101", row.get(0)); Assert.assertEquals("testUser", row.get(1)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java index e6598ca179..1bb4cabdf6 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java @@ -249,9 +249,9 @@ public class ShowExecutorTest { ConnectScheduler scheduler = new ConnectScheduler(10); new Expectations(scheduler) { { - scheduler.listConnection("testCluster:testUser"); + scheduler.listConnection("testCluster:testUser", anyBoolean); minTimes = 0; - result = Lists.newArrayList(ctx.toThreadInfo()); + result = Lists.newArrayList(ctx.toThreadInfo(false)); } }; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org