View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor;
19  
20  import lombok.Getter;
21  import lombok.RequiredArgsConstructor;
22  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
23  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
24  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultColumnMetaData;
25  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
26  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
27  import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
28  import org.apache.shardingsphere.infra.executor.sql.process.Process;
29  import org.apache.shardingsphere.infra.merge.result.MergedResult;
30  import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
31  import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
32  import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
33  import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
34  
35  import java.sql.Types;
36  import java.util.ArrayList;
37  import java.util.Collection;
38  import java.util.Collections;
39  import java.util.List;
40  import java.util.concurrent.TimeUnit;
41  import java.util.stream.Collectors;
42  
43  /**
44   * Show process list executor.
45   */
46  @RequiredArgsConstructor
47  public final class ShowProcessListExecutor implements DatabaseAdminQueryExecutor {
48      
49      private final boolean showFullProcesslist;
50      
51      @Getter
52      private QueryResultMetaData queryResultMetaData;
53      
54      @Getter
55      private MergedResult mergedResult;
56      
57      @Override
58      public void execute(final ConnectionSession connectionSession) {
59          queryResultMetaData = createQueryResultMetaData();
60          mergedResult = new TransparentMergedResult(getQueryResult());
61      }
62      
63      private QueryResult getQueryResult() {
64          Collection<Process> processes = ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getModeFacade().getProcessService().getProcessList();
65          if (processes.isEmpty()) {
66              return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
67          }
68          List<MemoryQueryResultDataRow> rows = processes.stream().map(this::getMemoryQueryResultDataRow).collect(Collectors.toList());
69          return new RawMemoryQueryResult(queryResultMetaData, rows);
70      }
71      
72      private MemoryQueryResultDataRow getMemoryQueryResultDataRow(final Process process) {
73          List<Object> rowValues = new ArrayList<>(8);
74          rowValues.add(process.getId());
75          rowValues.add(process.getUsername());
76          rowValues.add(process.getHostname());
77          rowValues.add(process.getDatabaseName());
78          rowValues.add(process.isIdle() ? "Sleep" : "Execute");
79          rowValues.add(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - process.getStartMillis()));
80          String sql = null;
81          if (process.isIdle()) {
82              rowValues.add("");
83          } else {
84              int processDoneCount = process.getCompletedUnitCount().get();
85              String statePrefix = "Executing ";
86              rowValues.add(statePrefix + processDoneCount + "/" + process.getTotalUnitCount().get());
87              sql = process.getSql();
88          }
89          if (null != sql && sql.length() > 100 && !showFullProcesslist) {
90              sql = sql.substring(0, 100);
91          }
92          rowValues.add(null != sql ? sql : "");
93          return new MemoryQueryResultDataRow(rowValues);
94      }
95      
96      private QueryResultMetaData createQueryResultMetaData() {
97          List<RawQueryResultColumnMetaData> columns = new ArrayList<>(8);
98          columns.add(new RawQueryResultColumnMetaData("", "Id", "Id", Types.VARCHAR, "VARCHAR", 20, 0));
99          columns.add(new RawQueryResultColumnMetaData("", "User", "User", Types.VARCHAR, "VARCHAR", 20, 0));
100         columns.add(new RawQueryResultColumnMetaData("", "Host", "Host", Types.VARCHAR, "VARCHAR", 64, 0));
101         columns.add(new RawQueryResultColumnMetaData("", "db", "db", Types.VARCHAR, "VARCHAR", 64, 0));
102         columns.add(new RawQueryResultColumnMetaData("", "Command", "Command", Types.VARCHAR, "VARCHAR", 64, 0));
103         columns.add(new RawQueryResultColumnMetaData("", "Time", "Time", Types.VARCHAR, "VARCHAR", 10, 0));
104         columns.add(new RawQueryResultColumnMetaData("", "State", "State", Types.VARCHAR, "VARCHAR", 64, 0));
105         columns.add(new RawQueryResultColumnMetaData("", "Info", "Info", Types.VARCHAR, "VARCHAR", 120, 0));
106         return new RawQueryResultMetaData(columns);
107     }
108 }