This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 29f29f494fb [chore](test) add log to find bug of unstable test
(#37982) (#42129)
29f29f494fb is described below
commit 29f29f494fbeb334227d9ffa48da3b69d0bc1479
Author: 924060929 <[email protected]>
AuthorDate: Sat Oct 19 18:00:57 2024 +0800
[chore](test) add log to find bug of unstable test (#37982) (#42129)
---
regression-test/data/query_p0/cache/sql_cache.out | 18 +--
.../doris/regression/action/ProfileAction.groovy | 122 +++++++++++++++++++++
.../org/apache/doris/regression/suite/Suite.groovy | 5 +
.../framework/src/main/groovy/suite.gdsl | 4 +-
.../suites/query_p0/cache/sql_cache.groovy | 100 +++++++++++------
5 files changed, 205 insertions(+), 44 deletions(-)
diff --git a/regression-test/data/query_p0/cache/sql_cache.out
b/regression-test/data/query_p0/cache/sql_cache.out
index 1b3729294d1..75f28261bc3 100644
--- a/regression-test/data/query_p0/cache/sql_cache.out
+++ b/regression-test/data/query_p0/cache/sql_cache.out
@@ -1,50 +1,50 @@
-- This file is automatically generated. You should know what you did if you
want to edit this
--- !sql_cache --
+-- !sql_cache1 --
2022-05-28 0
2022-05-29 0
2022-05-30 0
2022-06-01 0
2022-06-02 0
--- !sql_cache --
+-- !sql_cache2 --
2022-05-28 0
2022-05-29 0
2022-05-30 0
2022-06-01 0
2022-06-02 0
--- !sql_cache --
+-- !sql_cache3 --
2022-05-28 0
2022-05-29 0
2022-05-30 0
2022-06-01 0
2022-06-02 0
--- !sql_cache --
+-- !sql_cache4 --
2022-05-28 0
2022-05-28 0
--- !sql_cache --
+-- !sql_cache5 --
2022-05-28 0
2022-05-28 0
--- !sql_cache --
+-- !sql_cache6 --
2022-05-28 0
2022-05-29 0
2022-05-30 0
2022-06-01 0
2022-06-02 0
--- !sql_cache --
+-- !sql_cache7 --
2022-05-28 0
2022-05-29 0
2022-05-30 0
2022-06-01 0
2022-06-02 0
--- !sql_cache --
+-- !sql_cache8 --
2022-05-28 0
--- !sql_cache --
+-- !sql_cache9 --
2022-05-28 0
diff --git
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/ProfileAction.groovy
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/ProfileAction.groovy
new file mode 100644
index 00000000000..b019e6c24aa
--- /dev/null
+++
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/ProfileAction.groovy
@@ -0,0 +1,122 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.regression.action
+
+import groovy.json.JsonSlurper
+import groovy.transform.stc.ClosureParams
+import groovy.transform.stc.FromString
+import groovy.util.logging.Slf4j
+import org.apache.doris.regression.suite.SuiteContext
+import org.apache.doris.regression.util.JdbcUtils
+
+@Slf4j
+class ProfileAction implements SuiteAction {
+ private String tag
+ private Runnable runCallback
+ private Closure<String> check
+ private SuiteContext context
+
+ ProfileAction(SuiteContext context, String tag) {
+ this.context = context
+ this.tag = Objects.requireNonNull(tag, "tag can not be null")
+ }
+
+ void run(@ClosureParams(value = FromString, options = []) Runnable run) {
+ runCallback = run
+ }
+
+ void check(
+ @ClosureParams(value = FromString, options = ["String, Throwable"])
Closure check) {
+ this.check = check
+ }
+
+ @Override
+ void run() {
+ if (runCallback.is(null)) {
+ throw new IllegalStateException("Missing tag")
+ }
+ if (check.is(null)) {
+ throw new IllegalStateException("Missing check")
+ }
+ def conn = context.getConnection()
+ try {
+ JdbcUtils.executeToList(conn, "set enable_profile=true")
+
+ Throwable exception = null
+ try {
+ this.runCallback.run()
+ } catch (Throwable t) {
+ exception = t
+ }
+
+ def httpCli = new HttpCliAction(context)
+ httpCli.endpoint(context.config.feHttpAddress)
+ httpCli.uri("/rest/v1/query_profile")
+ httpCli.op("get")
+ httpCli.printResponse(false)
+
+ if (context.config.fetchRunMode()) {
+ httpCli.basicAuthorization(context.config.feCloudHttpUser,
context.config.feCloudHttpPassword)
+ } else {
+ httpCli.basicAuthorization(context.config.feHttpUser,
context.config.feHttpPassword)
+ }
+ httpCli.check { code, body ->
+ if (code != 200) {
+ throw new IllegalStateException("Get profile list failed,
code: ${code}, body:\n${body}")
+ }
+
+ def jsonSlurper = new JsonSlurper()
+ List profileData = jsonSlurper.parseText(body).data.rows
+ for (final def profileItem in profileData) {
+ if (profileItem["Sql Statement"].toString().contains(tag))
{
+ def profileId = profileItem["Profile ID"].toString()
+
+ def profileCli = new HttpCliAction(context)
+ profileCli.endpoint(context.config.feHttpAddress)
+ profileCli.uri("/rest/v1/query_profile/${profileId}")
+ profileCli.op("get")
+ profileCli.printResponse(false)
+
+ if (context.config.fetchRunMode()) {
+
profileCli.basicAuthorization(context.config.feCloudHttpUser,
context.config.feCloudHttpPassword)
+ } else {
+
profileCli.basicAuthorization(context.config.feHttpUser,
context.config.feHttpPassword)
+ }
+ profileCli.check { profileCode, profileResp ->
+ if (profileCode != 200) {
+ throw new IllegalStateException("Get profile
failed, url: ${"/rest/v1/query_profile/${profileId}"}, code: ${profileCode},
body:\n${profileResp}")
+ }
+
+ def jsonSlurper2 = new JsonSlurper()
+ def profileText =
jsonSlurper2.parseText(profileResp).data
+ profileText = profileText.replace(" ", " ")
+ profileText = profileText.replace("</br>", "\n")
+ this.check(profileText, exception)
+ }
+ profileCli.run()
+
+ break
+ }
+ }
+ }
+ httpCli.run()
+ } finally {
+ JdbcUtils.executeToList(conn, "set enable_profile=false")
+ }
+ }
+}
diff --git
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
index 489e022ba0a..97bdad8d685 100644
---
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
+++
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
@@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList
import org.apache.commons.lang3.ObjectUtils
import org.apache.doris.regression.Config
import org.apache.doris.regression.action.BenchmarkAction
+import org.apache.doris.regression.action.ProfileAction
import org.apache.doris.regression.action.WaitForAction
import org.apache.doris.regression.util.DataUtils
import org.apache.doris.regression.util.OutputUtils
@@ -610,6 +611,10 @@ class Suite implements GroovyInterceptable {
}
}
+ void profile(String tag, Closure<String> actionSupplier) {
+ runAction(new ProfileAction(context, tag), actionSupplier)
+ }
+
void createMV(String sql) {
(new CreateMVAction(context, sql)).run()
}
diff --git a/regression-test/framework/src/main/groovy/suite.gdsl
b/regression-test/framework/src/main/groovy/suite.gdsl
index aec43ab51a1..bf8da34c2c6 100644
--- a/regression-test/framework/src/main/groovy/suite.gdsl
+++ b/regression-test/framework/src/main/groovy/suite.gdsl
@@ -50,6 +50,7 @@ bindAction("streamLoad",
"org.apache.doris.regression.action.StreamLoadAction")
bindAction("httpTest", "org.apache.doris.regression.action.HttpCliAction")
bindAction("benchmark", "org.apache.doris.regression.action.BenchmarkAction")
bindAction("waitForSchemaChangeDone",
"org.apache.doris.regression.action.WaitForAction")
+bindAction("profile", "org.apache.doris.regression.action.ProfileAction")
// bind qt_xxx and order_qt_xxx methods
contributor([suiteContext]) {
@@ -81,7 +82,8 @@ contributor([suiteContext]) {
!enclosingCall("explain") &&
!enclosingCall("streamLoad") &&
!enclosingCall("httpTest") &&
- !enclosingCall("waitForSchemaChangeDone"))) {
+ !enclosingCall("waitForSchemaChangeDone") &&
+ !enclosingCall("profile"))) {
// bind other suite method and field
def suiteClass = findClass(suiteClassName)
delegatesTo(suiteClass)
diff --git a/regression-test/suites/query_p0/cache/sql_cache.groovy
b/regression-test/suites/query_p0/cache/sql_cache.groovy
index 05ad8f6d81d..3f6c36ed771 100644
--- a/regression-test/suites/query_p0/cache/sql_cache.groovy
+++ b/regression-test/suites/query_p0/cache/sql_cache.groovy
@@ -19,12 +19,20 @@
//
/testing/trino-product-tests/src/main/resources/sql-tests/testcases/aggregate
// and modified by Doris.
+import java.util.stream.Collectors
+
suite("sql_cache") {
// TODO: regression-test does not support check query profile,
// so this suite does not check whether cache is used, :)
def tableName = "test_sql_cache"
sql "ADMIN SET FRONTEND CONFIG ('cache_last_version_interval_second' =
'0')"
+ def variables = sql "show variables"
+ def variableString = variables.stream()
+ .map { it.toString() }
+ .collect(Collectors.joining("\n"))
+ logger.info("Variables:\n${variableString}")
+
sql """ DROP TABLE IF EXISTS ${tableName} """
sql """
CREATE TABLE IF NOT EXISTS ${tableName} (
@@ -55,7 +63,7 @@ suite("sql_cache") {
("2022-06-02",0)
"""
- qt_sql_cache """
+ qt_sql_cache1 """
select
k1,
sum(k2) as total_pv
@@ -71,7 +79,7 @@ suite("sql_cache") {
sql "set enable_sql_cache=true "
- qt_sql_cache """
+ qt_sql_cache2 """
select
k1,
sum(k2) as total_pv
@@ -84,7 +92,7 @@ suite("sql_cache") {
order by
k1;
"""
- qt_sql_cache """
+ qt_sql_cache3 """
select
k1,
sum(k2) as total_pv
@@ -98,7 +106,7 @@ suite("sql_cache") {
k1;
"""
- qt_sql_cache """
+ qt_sql_cache4 """
select
k1,
sum(k2) as total_pv
@@ -124,7 +132,7 @@ suite("sql_cache") {
k1;
"""
- qt_sql_cache """
+ qt_sql_cache5 """
select
k1,
sum(k2) as total_pv
@@ -153,7 +161,7 @@ suite("sql_cache") {
sql "SET enable_nereids_planner=true"
sql "SET enable_fallback_to_original_planner=false"
- qt_sql_cache """
+ qt_sql_cache6 """
select
k1,
sum(k2) as total_pv
@@ -166,7 +174,7 @@ suite("sql_cache") {
order by
k1;
"""
- qt_sql_cache """
+ qt_sql_cache7 """
select
k1,
sum(k2) as total_pv
@@ -183,33 +191,57 @@ suite("sql_cache") {
sql 'set default_order_by_limit = 2'
sql 'set sql_select_limit = 1'
- qt_sql_cache """
- select
- k1,
- sum(k2) as total_pv
- from
- ${tableName}
- where
- k1 between '2022-05-28' and '2022-06-30'
- group by
- k1
- order by
- k1;
- """
-
- qt_sql_cache """
- select
- k1,
- sum(k2) as total_pv
- from
- ${tableName}
- where
- k1 between '2022-05-28' and '2022-06-30'
- group by
- k1
- order by
- k1;
- """
+ profile("sql_cache8") {
+ run {
+ qt_sql_cache8 """
+ -- sql_cache8
+ select
+ k1,
+ sum(k2) as total_pv
+ from
+ ${tableName}
+ where
+ k1 between '2022-05-28' and '2022-06-30'
+ group by
+ k1
+ order by
+ k1;
+ """
+ }
+
+ check { profileString, exception ->
+ if (!exception.is(null)) {
+ logger.error("Profile failed, profile
result:\n${profileString}", exception)
+ throw exception
+ }
+ }
+ }
+
+ profile("sql_cache9") {
+ run {
+ qt_sql_cache9 """
+ -- sql_cache9
+ select
+ k1,
+ sum(k2) as total_pv
+ from
+ ${tableName}
+ where
+ k1 between '2022-05-28' and '2022-06-30'
+ group by
+ k1
+ order by
+ k1;
+ """
+ }
+
+ check { profileString, exception ->
+ if (!exception.is(null)) {
+ logger.error("Profile failed, profile
result:\n${profileString}", exception)
+ throw exception
+ }
+ }
+ }
sql "ADMIN SET FRONTEND CONFIG ('cache_last_version_interval_second' =
'10')"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]