wecisecode 4 weeks ago
parent
commit
f43a0786ff
3 changed files with 61 additions and 42 deletions
  1. 1 0
      odbctest/mql/pprof.sh
  2. 4 1
      odbctest/odbcmql/mql_run.go
  3. 56 41
      odbctest/odbcmql/mqls_do.go

+ 1 - 0
odbctest/mql/pprof.sh

@@ -26,6 +26,7 @@ pprofhttp() {
                 kill ${lpid} >/dev/null 2>&1
                 lpid=`ps -ef | grep -v grep | grep "go tool pprof -http=0.0.0.0:${port}" | awk '{print $2}'`
             done
+            date >>"${pprofdir}/.pprof.log" 2>&1
             go tool pprof -http=0.0.0.0:${port} ${pprofdir}/${pft}.prof >>"${pprofdir}/.pprof.log" 2>&1 &
             if [[ "${changeflag}" = "" ]]; then
                 echo "${cf}"

+ 4 - 1
odbctest/odbcmql/mql_run.go

@@ -165,6 +165,8 @@ mql语句扩展说明:
       mql语句中的 '...N Bytes...' 会被替换为 N 个随机可见字符,N 为自然数
     变量替换:
       mql语句中 '{%<f>,<varname>}' 形式的内容会被替换为,以 %<f> 作为格式化标记的 <varname> 变量的内容
+	  内容中的相似内容 '{%...,...}' 可以转义为 '{%%...,...}' 来避免被替换
+	  变量不存在时,不进行替换
       目前支持的 <varname> 包括:
         keyspace  当前指定的 Keyspace
         ksnative  Native Keyspace
@@ -176,6 +178,7 @@ mql语句扩展说明:
         filecount 当前文件的总计数
         dircount  当前目录的总计数
         topcount  整个执行进程的总计数
+		now	      当前时间,格式标记 t 相当于 2006-01-02 15:04:05
   mql语句中第一个 /** 到 最后一个 **/ 之间的内容可以标注执行若干预定义动作,多个动作标注用空格分隔
   如 /** output() sleep(1) **/ 表示忽略当前语句执行过程中的任何报错,执行完成后等待一秒后再继续执行下一语句
   目前支持的预定义动作如下:
@@ -195,7 +198,7 @@ mql语句扩展说明:
    -------------  针对错误处理的相关动作
    retry(N)          出错重试 N 次,N为自然数,默认为 0,
    onerror(O,E,...)  retry后仍然有错时的处理方法,E为特定的错误信息关键字,不指定则为任意错误,O为处理方法,包括:
-                     break     中断当前语句的循环,继续顺序执行其它语句,没有循环时与pass无区别
+                     break     中断当前语句的循环,继续顺序执行其它语句,没有循环时与 continue 无区别
                      continue  忽略报错,继续执行,在循环中时,继续下一轮循环
                      must      报错才正常,否则中断执行,报告期待错误信息不符,退出当前进程
                      exit      停止执行,退出当前进程,此为默认处理方式

+ 56 - 41
odbctest/odbcmql/mqls_do.go

@@ -36,47 +36,47 @@ func (mt *MQLTest) ReplaceLoopSN(str string,
 	// file_loopi := mt.scopevars.mql[mqlsn].vars["filei"].(int)
 	// mql_loopi := mt.scopevars.mql[mqlsn].vars["mqli"].(int)
 	// mt.scopevars.RUnlock()
-	if false {
-		// 替换前编码,避免重复替换
-		str = strings.ReplaceAll(str, "&", "&=;")
-		str = strings.ReplaceAll(str, "0", "&0;")
-		str = strings.ReplaceAll(str, "9", "&9;")
-		// 替换 00009999
-		loopn := fmt.Sprintf("&0;%09d", (mql_loopi % 1000000000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;%08d", (mql_loopi % 100000000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;%07d", (mql_loopi % 10000000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;%06d", (mql_loopi % 1000000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;%05d", (mql_loopi % 100000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;%04d", (mql_loopi % 10000))
-		str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;&0;%03d", (mql_loopi % 1000))
-		str = strings.ReplaceAll(str, "&0;&0;&9;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;&0;&0;%02d", (mql_loopi % 100))
-		str = strings.ReplaceAll(str, "&0;&0;&0;&9;&9;", loopn)
-		loopn = fmt.Sprintf("&0;&0;&0;&0;%d", (mql_loopi % 10))
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;&9;", loopn)
-		// 替换 00000000
-		all_1 := fmt.Sprintf("%d", (top_loopi % 10))
-		all_2 := fmt.Sprintf("%02d", (top_loopi % 100))
-		dir_1 := fmt.Sprintf("%d", (dir_loopi % 10))
-		dir_2 := fmt.Sprintf("%02d", (dir_loopi % 100))
-		file_4 := fmt.Sprintf("%04d", (file_loopi % 10000))
-		//
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;&0;&0;", all_2+dir_2+file_4)
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;&0;", all_1+dir_2+file_4)
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;", dir_2+file_4)
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;", dir_1+file_4)
-		str = strings.ReplaceAll(str, "&0;&0;&0;&0;", file_4)
-		// 替换后解码
-		str = strings.ReplaceAll(str, "&9;", "9")
-		str = strings.ReplaceAll(str, "&0;", "0")
-		str = strings.ReplaceAll(str, "&=;", "&")
-	}
+	// if false {
+	// 	// 替换前编码,避免重复替换
+	// 	str = strings.ReplaceAll(str, "&", "&=;")
+	// 	str = strings.ReplaceAll(str, "0", "&0;")
+	// 	str = strings.ReplaceAll(str, "9", "&9;")
+	// 	// 替换 00009999
+	// 	loopn := fmt.Sprintf("&0;%09d", (mql_loopi % 1000000000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;%08d", (mql_loopi % 100000000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;%07d", (mql_loopi % 10000000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;%06d", (mql_loopi % 1000000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;%05d", (mql_loopi % 100000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;%04d", (mql_loopi % 10000))
+	// 	str = strings.ReplaceAll(str, "&0;&9;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;&0;%03d", (mql_loopi % 1000))
+	// 	str = strings.ReplaceAll(str, "&0;&0;&9;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;&0;&0;%02d", (mql_loopi % 100))
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&9;&9;", loopn)
+	// 	loopn = fmt.Sprintf("&0;&0;&0;&0;%d", (mql_loopi % 10))
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;&9;", loopn)
+	// 	// 替换 00000000
+	// 	all_1 := fmt.Sprintf("%d", (top_loopi % 10))
+	// 	all_2 := fmt.Sprintf("%02d", (top_loopi % 100))
+	// 	dir_1 := fmt.Sprintf("%d", (dir_loopi % 10))
+	// 	dir_2 := fmt.Sprintf("%02d", (dir_loopi % 100))
+	// 	file_4 := fmt.Sprintf("%04d", (file_loopi % 10000))
+	// 	//
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;&0;&0;", all_2+dir_2+file_4)
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;&0;", all_1+dir_2+file_4)
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;&0;", dir_2+file_4)
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;&0;", dir_1+file_4)
+	// 	str = strings.ReplaceAll(str, "&0;&0;&0;&0;", file_4)
+	// 	// 替换后解码
+	// 	str = strings.ReplaceAll(str, "&9;", "9")
+	// 	str = strings.ReplaceAll(str, "&0;", "0")
+	// 	str = strings.ReplaceAll(str, "&=;", "&")
+	// }
 	// 正则表达式实现,内部计数变量替换
 	idxs := refmtvar.FindAllStringSubmatchIndex(str, -1)
 	if len(idxs) > 0 {
@@ -95,6 +95,21 @@ func (mt *MQLTest) ReplaceLoopSN(str string,
 					nstr += "{" + format[1:] + "," + varname + "}"
 				} else {
 					switch varname {
+					case "now":
+						tf := format[1:]
+						switch tf {
+						case "ns":
+							nstr = fmt.Sprint(time.Now().UnixNano())
+						case "us":
+							nstr = fmt.Sprint(time.Now().UnixMicro())
+						case "ms":
+							nstr = fmt.Sprint(time.Now().UnixMilli())
+						case "t":
+							tf = "2006-01-02 15:04:05"
+							nstr += time.Now().Format(tf)
+						default:
+							nstr += time.Now().Format(tf)
+						}
 					case "rand":
 						nstr += fmt.Sprintf(format, rand.Intn(1000000))
 					case "mqli":