From 141cfc9c51fb42347de9267247a90da24d061885 Mon Sep 17 00:00:00 2001 From: aressu1985 <47846308+aressu1985@users.noreply.github.com> Date: Tue, 10 Oct 2023 18:01:50 +0800 Subject: [PATCH] Add pprof (#153) * modify socketTimeout to 120s * add regular match * support rc + Pessimistic * revert Fix pessimistic commit wait error * revert revert * add pprof * add pprof scripts --- cases/template.result | 1 + cases/template.sql | 1 + lib/mo-tester-1.0-SNAPSHOT.jar | Bin 69273 -> 71726 bytes mo.yml | 5 ++ pprof.sh | 66 ++++++++++++++++++++++ run.sh | 11 +++- src/main/java/io/mo/Tester.java | 5 ++ src/main/java/io/mo/constant/COMMON.java | 2 + src/main/java/io/mo/db/Executor.java | 68 +++++++++++++++++++++++ src/main/java/io/mo/util/MoConfUtil.java | 24 +++++++- 10 files changed, 179 insertions(+), 4 deletions(-) create mode 100755 pprof.sh diff --git a/cases/template.result b/cases/template.result index 09640b244..bd6e4171c 100644 --- a/cases/template.result +++ b/cases/template.result @@ -1,3 +1,4 @@ +select sleep(10); create table t1 ( a int not null default 1, int32 int primary key); insert into t1 (int32) values (-1),(1234567890),(2147483647); insert into t1 (int32) values (-1),(1234567890),(2147483647); diff --git a/cases/template.sql b/cases/template.sql index 85aaf2fdc..d8f9e1c13 100644 --- a/cases/template.sql +++ b/cases/template.sql @@ -1,3 +1,4 @@ +select sleep(10); create table t1 ( a int not null default 1, int32 int primary key); insert into t1 (int32) values (-1),(1234567890),(2147483647); -- @pattern diff --git a/lib/mo-tester-1.0-SNAPSHOT.jar b/lib/mo-tester-1.0-SNAPSHOT.jar index edcbb88f2a81b39418389e5b8eb203a57c548088..c545aa25fb7d46a8c906fe91786bbf287044d7f2 100644 GIT binary patch delta 25444 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

nPAj`IN!5d@eh%BG@7NRB=s)U1Gf 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 + exit 2 +fi + +PORT=6060 +SERVER="127.0.0.1" +DURATION=30 +SLEEP=60 +WORKSPACE=$(cd `dirname $0`; pwd) + +while getopts ":h:p:d:s:H" opt +do + case $opt in + h) + SERVER="${OPTARG}" + echo -e "`date +'%Y-%m-%d %H:%M:%S'` The server addr is : ${OPTARG}" + ;; + p) + expr ${OPTARG} "+" 10 &> /dev/null + if [ $? -ne 0 ]; then + echo "`date +'%Y-%m-%d %H:%M:%S'` The port [${OPTARG}] is not a number" + exit 1 + fi + PORT=${OPTARG} + echo -e "`date +'%Y-%m-%d %H:%M:%S'` The debug port is : ${OPTARG}" + ;; + d) + DURATION=${OPTARG} + echo -e "`date +'%Y-%m-%d %H:%M:%S'` The collection duration is : ${OPTARG} s" + ;; + s) + SLEEP=${OPTARG} + echo -e "`date +'%Y-%m-%d %H:%M:%S'` The sleep time for each turn is : ${OPTARG} s" + ;; + H) + echo -e "Usage: bash pprof.sh [option] [param] ...\nExcute pprof task" + echo -e " -h server address, default value is 127.0.0.1" + echo -e " -p server port, default value is 6060" + echo -e " -d the duration that pprof collection will last once, unit s" + echo -e " -s the sleeptime for each turn, unit s" + echo -e "Examples:" + echo " bash pprof.sh -h 127.0.0.1 -p 6060 -d 10" + echo "For more support,please email to sudong@matrixorigin.cn" + exit 1 + ;; + ?) + echo "Unkown parameter,please use -H to get help." + exit 1;; + esac +done + +if [ ! -d ${WORKSPACE}/report/prof/${SERVER} ] ; then + mkdir ${WORKSPACE}/report/prof/${SERVER} +fi + +time=`date +'%Y-%m-%d_%H:%M:%S'` +mkdir -p ${WORKSPACE}/report/prof/${SERVER}/${time} +curl http://${SERVER}:${PORT}/debug/pprof/goroutine?debug=2 -o ${WORKSPACE}/report/prof/${SERVER}/${time}/goroutine.log +curl http://${SERVER}:${PORT}/debug/pprof/trace?seconds=30 -o ${WORKSPACE}/report/prof/${SERVER}/${time}/trace.out +if [ $? -ne 0 ];then + echo -e "`date +'%Y-%m-%d_%H:%M:%S'` The MO debug service can not be reached, the pprof operation was failed." + exit 1 +fi + diff --git a/run.sh b/run.sh index a77c2d0b5..6cca4966c 100755 --- a/run.sh +++ b/run.sh @@ -7,7 +7,7 @@ fi TIMES=1 -while getopts ":p:m:t:r:i:e:s:gfnch" opt +while getopts ":p:m:t:r:i:e:s:ogfnch" opt do case $opt in p) @@ -58,6 +58,10 @@ do CHECK="check" echo -e "The meta data of the resultset will be ignored when comparing the resut" ;; + o) + PPROF="pprof" + echo -e "If a query timeout, mo-tester will collect the pprof info from mo" + ;; h) echo -e "Usage: bash run.sh [option] [param] ...\nExcute test cases task" echo -e " -p set the path of test cases needed to be executed by mo-tester" @@ -75,6 +79,7 @@ do echo -e " Those two sql commands are associated with the issue#3236,and they will not been executed in bvt test,until the flag is removed when the issue#3236 is fixed." echo -e " -n means the meta data of the resultset will be ignored when comparing the resut" echo -e " -c check whether the case scripts match the result file" + echo -e " -o if a query timeout, mo-tester will collect the pprof info from mo" echo -e "Examples:" echo " bash run.sh -p case -m run -t script -r 100 -i select,subquery -e substring -g" echo "For more support,please email to dong.su@matrixorigin.io" @@ -104,7 +109,7 @@ if [ ${TIMES} -eq 1 ]; then java -Xms1024M -Xmx1024M -cp ${libJars} \ -Dconf.yml=${MO_YAML} \ -Drun.yml=${RUN_YAML} \ - io.mo.Tester ${PATHC} ${METHOD} ${TYPE} ${RATE} ${INCLUDE} ${EXCLUDE} ${IGNORE} ${NOMETA} ${CHECK} ${RESOURCE} ${FORCE} + io.mo.Tester ${PATHC} ${METHOD} ${TYPE} ${RATE} ${INCLUDE} ${EXCLUDE} ${IGNORE} ${NOMETA} ${CHECK} ${RESOURCE} ${FORCE} ${PPROF} else echo "This test will be run for ${TIMES} times" for i in $(seq 1 ${TIMES}) @@ -113,7 +118,7 @@ else java -Xms1024M -Xmx1024M -cp ${libJars} \ -Dconf.yml=${MO_YAML} \ -Drun.yml=${RUN_YAML} \ - io.mo.Tester ${PATHC} ${METHOD} ${TYPE} ${RATE} ${INCLUDE} ${EXCLUDE} ${IGNORE} ${NOMETA} ${CHECK} ${RESOURCE} ${FORCE} + io.mo.Tester ${PATHC} ${METHOD} ${TYPE} ${RATE} ${INCLUDE} ${EXCLUDE} ${IGNORE} ${NOMETA} ${CHECK} ${RESOURCE} ${FORCE} ${PPROF} echo "The ${i} turn test has ended, and test report is in ./report/${i} dir." | tee -a ${WORKSPACE}/run.log mkdir -p ${WORKSPACE}/${MOTESTER_DIR}/report/${i}/ mv ${WORKSPACE}/${MOTESTER_DIR}/report/*.txt ${WORKSPACE}/${MOTESTER_DIR}/report/${i}/ diff --git a/src/main/java/io/mo/Tester.java b/src/main/java/io/mo/Tester.java index 6f3c2a148..cd9de4e00 100755 --- a/src/main/java/io/mo/Tester.java +++ b/src/main/java/io/mo/Tester.java @@ -118,6 +118,11 @@ public static void main(String[] args){ if (arg.equalsIgnoreCase("check")) { method = "check"; } + + //get pprof info + if (arg.equalsIgnoreCase("pprof")) { + COMMON.NEEDPPROF = true; + } } } diff --git a/src/main/java/io/mo/constant/COMMON.java b/src/main/java/io/mo/constant/COMMON.java index e8dcd08c1..e2109467a 100755 --- a/src/main/java/io/mo/constant/COMMON.java +++ b/src/main/java/io/mo/constant/COMMON.java @@ -62,6 +62,8 @@ public class COMMON { public static String START_TRX = "begin"; public static String COMMIT_TRX = "commit"; public static String ROLLBACK_TRX = "rollback"; + + public static boolean NEEDPPROF = false; public static String[] SPECIAL_CHARS = new String[]{"+","-","*","/","%","&",">","<","(",")","!","=","\'","\""}; diff --git a/src/main/java/io/mo/db/Executor.java b/src/main/java/io/mo/db/Executor.java index 07edd952e..b1b6d32ba 100755 --- a/src/main/java/io/mo/db/Executor.java +++ b/src/main/java/io/mo/db/Executor.java @@ -203,6 +203,12 @@ public static void run(TestScript script){ LOG.error("[EXPECT RESULT]:\n" + command.getTestResult().getExpResult()); LOG.error("[ACTUAL RESULT]:\n" + command.getTestResult().getActResult()); + if(COMMON.NEEDPPROF){ + LOG.info("Start to collect pprof information,please wait........"); + pprof(); + LOG.info("Finish to collect pprof information,the test will continue"); + } + //reconnect to mo, and set db to last use db LOG.warn(String.format("The mo-tester tries to re-connect to mo, con[id=%d, user=%s, pwd=%s, db=%s], please wait.....", command.getConn_id(),command.getConn_user(),command.getConn_pswd(),command.getUseDB())); @@ -657,6 +663,68 @@ public static void syncCommit(Connection connection){ } } + public static void pprof(){ + String[] debugServers = MoConfUtil.getDebugServers(); + if(debugServers != null){ + int port = MoConfUtil.getDebugPort(); + Thread[] threads = new Thread[debugServers.length]; + for(int i = 0; i < debugServers.length;i++){ + int index = i; + threads[index] = new Thread(new Runnable() { + @Override + public void run() { + try { + Process p = Runtime.getRuntime().exec(String.format("./pprof.sh -h %s -p %d",debugServers[index],port)); + InputStream is = p.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + p.waitFor(); + + StringBuffer execResut = new StringBuffer(); + String str = reader.readLine(); + while ( str != null) { + execResut.append(str+"\n"); + str = reader.readLine(); + } + + if (p.exitValue() != 0) { + LOG.error(String.format("The pprof operation has been executed failed.\n%s",execResut.toString())); + }else { + LOG.info(String.format("The pprof operation has been executed successfully.\n%s", execResut.toString())); + LOG.info(String.format("The result is in the dir ./report/pprof/%s/",debugServers[index])); + } + + } catch (IOException e) { + LOG.error("The pprof operation has been executed failed."); + LOG.error(String.format("The output of pprof operation is \n%s.",e.getMessage())); + } catch (InterruptedException e) { + LOG.error("The pprof operation has been executed failed."); + LOG.error(String.format("The output of pprof operation is \n%s.",e.getMessage())); + } + } + }); + threads[index].start(); + } + + boolean finished = false; + while(!finished){ + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + for(Thread thread:threads){ + if(thread.isAlive()){ + finished = false; + break; + } + finished = true; + } + } + } + + + } public static void executeSysCmd(String cmd){ try { diff --git a/src/main/java/io/mo/util/MoConfUtil.java b/src/main/java/io/mo/util/MoConfUtil.java index ae275abcc..c04787424 100755 --- a/src/main/java/io/mo/util/MoConfUtil.java +++ b/src/main/java/io/mo/util/MoConfUtil.java @@ -85,8 +85,30 @@ public static int getSocketTimeout(){ return COMMON.DEFAULT_MAX_EXECUTE_TIME; } + public static String[] getDebugServers(){ + Map debug = (Map)conf.get("debug"); + if(debug != null){ + String serverStr = debug.get("serverIP").toString(); + if(serverStr != null){ + return serverStr.split(","); + } + } + + return null; + } + + public static int getDebugPort(){ + Map debug = (Map)conf.get("debug"); + if(debug != null){ + String portStr = debug.get("port").toString(); + if(portStr != null){ + return Integer.parseInt(portStr); + } + } - + return 0; + } + public static void main(String[] args){ System.out.println(getDriver()); System.out.println(getURL());