You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/27 03:40:52 UTC

[doris] branch master updated: [improvement] support show query stmt in show processlist (#11232)

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 <mo...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org