From adc7031cd63612dddfa30986fd3720f722425f98 Mon Sep 17 00:00:00 2001 From: davidyuan Date: Sun, 12 Nov 2023 17:46:31 +0800 Subject: [PATCH 1/7] fix SessionsResourceSuite test case bug --- .../server/api/v1/SessionsResourceSuite.scala | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index b993789ba72..6cc32f994d5 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -62,8 +62,12 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { val statistic = webTarget.path("api/v1/sessions/execPool/statistic").request().get() val execPoolStatistic1 = statistic.readEntity(classOf[ExecPoolStatistic]) + // because this operation is asynchronous, + // there is no guarantee that it will complete quickly or fail in the process + // so we can not guarantee the poolActiveThread count must equal to 1 assert(execPoolStatistic1.getExecPoolSize == 1 && - execPoolStatistic1.getExecPoolActiveCount == 1) + (execPoolStatistic1.getExecPoolActiveCount == 1 || + execPoolStatistic1.getExecPoolActiveCount == 0) ) response = webTarget.path("api/v1/sessions/count").request().get() val openedSessionCount = response.readEntity(classOf[SessionOpenCount]) @@ -100,8 +104,16 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { // get session list again response2 = webTarget.path("api/v1/sessions").request().get() assert(200 == response2.getStatus) - val sessions2 = response2.readEntity(classOf[Seq[SessionData]]) - assert(sessions2.isEmpty) + // because delete is a asynchronous operation, we need use eventually to + // make sure the delete complete + def validateSessionEmpty(response: Response): Boolean = { + val sessions = response.readEntity(classOf[Seq[SessionData]]) + sessions.isEmpty + } + eventually(timeout(5.seconds)) { + assert(validateSessionEmpty(response2)) + } + } test("get session event") { From 2825eebcdaeeb73ad7a938cd5caedf6ff34c26b0 Mon Sep 17 00:00:00 2001 From: davidyuan Date: Sun, 12 Nov 2023 18:04:29 +0800 Subject: [PATCH 2/7] fix SessionsResourceSuite test case bug --- .../server/api/v1/SessionsResourceSuite.scala | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index 6cc32f994d5..6af12c4dd4d 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -17,17 +17,6 @@ package org.apache.kyuubi.server.api.v1 -import java.nio.charset.StandardCharsets -import java.util -import java.util.{Base64, Collections} -import javax.ws.rs.client.Entity -import javax.ws.rs.core.{GenericType, MediaType, Response} - -import scala.collection.JavaConverters._ - -import org.scalatest.time.SpanSugar.convertIntToGrainOfTime - -import org.apache.kyuubi.{KyuubiFunSuite, RestFrontendTestHelper} import org.apache.kyuubi.client.api.v1.dto import org.apache.kyuubi.client.api.v1.dto.{SessionData, _} import org.apache.kyuubi.config.KyuubiConf @@ -35,8 +24,17 @@ import org.apache.kyuubi.config.KyuubiReservedKeys.KYUUBI_SESSION_CONNECTION_URL import org.apache.kyuubi.engine.ShareLevel import org.apache.kyuubi.metrics.{MetricsConstants, MetricsSystem} import org.apache.kyuubi.operation.OperationHandle -import org.apache.kyuubi.server.http.util.HttpAuthUtils.{basicAuthorizationHeader, AUTHORIZATION_HEADER} +import org.apache.kyuubi.server.http.util.HttpAuthUtils.{AUTHORIZATION_HEADER, basicAuthorizationHeader} import org.apache.kyuubi.session.SessionType +import org.apache.kyuubi.{KyuubiFunSuite, RestFrontendTestHelper} +import org.scalatest.time.SpanSugar.convertIntToGrainOfTime + +import java.nio.charset.StandardCharsets +import java.util +import java.util.{Base64, Collections} +import javax.ws.rs.client.Entity +import javax.ws.rs.core.{GenericType, MediaType, Response} +import scala.collection.JavaConverters._ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { @@ -101,17 +99,17 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { response = webTarget.path(s"api/v1/sessions/$sessionHandle").request().delete() assert(200 == response.getStatus) - // get session list again - response2 = webTarget.path("api/v1/sessions").request().get() - assert(200 == response2.getStatus) // because delete is a asynchronous operation, we need use eventually to // make sure the delete complete - def validateSessionEmpty(response: Response): Boolean = { + def validateSessionEmpty(): Boolean = { + // get session list again + response2 = webTarget.path("api/v1/sessions").request().get() + assert(200 == response2.getStatus) val sessions = response.readEntity(classOf[Seq[SessionData]]) sessions.isEmpty } eventually(timeout(5.seconds)) { - assert(validateSessionEmpty(response2)) + assert(validateSessionEmpty()) } } From 2d6a5ad810e7d49a1d736ddf708f970381ab6f43 Mon Sep 17 00:00:00 2001 From: davidyuan Date: Sun, 12 Nov 2023 18:14:41 +0800 Subject: [PATCH 3/7] fix SessionsResourceSuite test case bug --- .../server/api/v1/SessionsResourceSuite.scala | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index 6af12c4dd4d..1cb27be5c66 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -17,6 +17,17 @@ package org.apache.kyuubi.server.api.v1 +import java.nio.charset.StandardCharsets +import java.util +import java.util.{Base64, Collections} +import javax.ws.rs.client.Entity +import javax.ws.rs.core.{GenericType, MediaType, Response} + +import scala.collection.JavaConverters._ + +import org.scalatest.time.SpanSugar.convertIntToGrainOfTime + +import org.apache.kyuubi.{KyuubiFunSuite, RestFrontendTestHelper} import org.apache.kyuubi.client.api.v1.dto import org.apache.kyuubi.client.api.v1.dto.{SessionData, _} import org.apache.kyuubi.config.KyuubiConf @@ -24,17 +35,8 @@ import org.apache.kyuubi.config.KyuubiReservedKeys.KYUUBI_SESSION_CONNECTION_URL import org.apache.kyuubi.engine.ShareLevel import org.apache.kyuubi.metrics.{MetricsConstants, MetricsSystem} import org.apache.kyuubi.operation.OperationHandle -import org.apache.kyuubi.server.http.util.HttpAuthUtils.{AUTHORIZATION_HEADER, basicAuthorizationHeader} +import org.apache.kyuubi.server.http.util.HttpAuthUtils.{basicAuthorizationHeader, AUTHORIZATION_HEADER} import org.apache.kyuubi.session.SessionType -import org.apache.kyuubi.{KyuubiFunSuite, RestFrontendTestHelper} -import org.scalatest.time.SpanSugar.convertIntToGrainOfTime - -import java.nio.charset.StandardCharsets -import java.util -import java.util.{Base64, Collections} -import javax.ws.rs.client.Entity -import javax.ws.rs.core.{GenericType, MediaType, Response} -import scala.collection.JavaConverters._ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { @@ -65,7 +67,7 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { // so we can not guarantee the poolActiveThread count must equal to 1 assert(execPoolStatistic1.getExecPoolSize == 1 && (execPoolStatistic1.getExecPoolActiveCount == 1 || - execPoolStatistic1.getExecPoolActiveCount == 0) ) + execPoolStatistic1.getExecPoolActiveCount == 0)) response = webTarget.path("api/v1/sessions/count").request().get() val openedSessionCount = response.readEntity(classOf[SessionOpenCount]) From f3b4c4dc1ea93b502c2b7557df5464496547f55b Mon Sep 17 00:00:00 2001 From: davidyuan Date: Sun, 12 Nov 2023 19:17:22 +0800 Subject: [PATCH 4/7] fix SessionsResourceSuite test case bug --- .../server/api/v1/SessionsResourceSuite.scala | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index 1cb27be5c66..1455fcfd2f4 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -101,19 +101,15 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { response = webTarget.path(s"api/v1/sessions/$sessionHandle").request().delete() assert(200 == response.getStatus) - // because delete is a asynchronous operation, we need use eventually to - // make sure the delete complete - def validateSessionEmpty(): Boolean = { - // get session list again - response2 = webTarget.path("api/v1/sessions").request().get() - assert(200 == response2.getStatus) - val sessions = response.readEntity(classOf[Seq[SessionData]]) - sessions.isEmpty - } - eventually(timeout(5.seconds)) { - assert(validateSessionEmpty()) - } + // get session list again + response2 = webTarget.path("api/v1/sessions").request().get() + assert(200 == response2.getStatus) + // because delete is a asynchronous operation, we need sleep to + // make sure the delete complete + Thread.sleep(3000) + val sessions = response2.readEntity(classOf[Seq[SessionData]]) + assert(sessions.isEmpty) } test("get session event") { From 6ae5395427c2f2db5abd04507307d14f098ccab5 Mon Sep 17 00:00:00 2001 From: davidyuan Date: Sun, 12 Nov 2023 19:20:53 +0800 Subject: [PATCH 5/7] fix SessionsResourceSuite test case bug --- .../apache/kyuubi/server/api/v1/SessionsResourceSuite.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index 1455fcfd2f4..26001f6149c 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -101,13 +101,13 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { response = webTarget.path(s"api/v1/sessions/$sessionHandle").request().delete() assert(200 == response.getStatus) + // because delete is a asynchronous operation, we need sleep to + // make sure the delete operation process complete + Thread.sleep(3000) // get session list again response2 = webTarget.path("api/v1/sessions").request().get() assert(200 == response2.getStatus) - // because delete is a asynchronous operation, we need sleep to - // make sure the delete complete - Thread.sleep(3000) val sessions = response2.readEntity(classOf[Seq[SessionData]]) assert(sessions.isEmpty) } From f52ddb9fe09e87ce0f628c5a3657d7bb91b30232 Mon Sep 17 00:00:00 2001 From: davidyuan Date: Mon, 13 Nov 2023 17:04:26 +0800 Subject: [PATCH 6/7] fix SessionsResourceSuite test case bug --- .../server/api/v1/SessionsResourceSuite.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index 26001f6149c..b5ff0f21204 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -66,8 +66,7 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { // there is no guarantee that it will complete quickly or fail in the process // so we can not guarantee the poolActiveThread count must equal to 1 assert(execPoolStatistic1.getExecPoolSize == 1 && - (execPoolStatistic1.getExecPoolActiveCount == 1 || - execPoolStatistic1.getExecPoolActiveCount == 0)) + execPoolStatistic1.getExecPoolActiveCount <= 1) response = webTarget.path("api/v1/sessions/count").request().get() val openedSessionCount = response.readEntity(classOf[SessionOpenCount]) @@ -103,13 +102,14 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { // because delete is a asynchronous operation, we need sleep to // make sure the delete operation process complete - Thread.sleep(3000) - // get session list again - response2 = webTarget.path("api/v1/sessions").request().get() - assert(200 == response2.getStatus) + eventually(timeout(3.seconds)) { + // get session list again + response2 = webTarget.path("api/v1/sessions").request().get() + assert(200 == response2.getStatus) - val sessions = response2.readEntity(classOf[Seq[SessionData]]) - assert(sessions.isEmpty) + val sessions = response2.readEntity(classOf[Seq[SessionData]]) + assert(sessions.isEmpty) + } } test("get session event") { From 6aa234c6856fab1d407925ca171e7e3481f1449a Mon Sep 17 00:00:00 2001 From: david yuan Date: Mon, 13 Nov 2023 19:01:11 +0800 Subject: [PATCH 7/7] Update SessionsResourceSuite.scala --- .../org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala index b5ff0f21204..af49598fe82 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/SessionsResourceSuite.scala @@ -100,7 +100,7 @@ class SessionsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper { response = webTarget.path(s"api/v1/sessions/$sessionHandle").request().delete() assert(200 == response.getStatus) - // because delete is a asynchronous operation, we need sleep to + // because delete is a asynchronous operation, we need eventually to // make sure the delete operation process complete eventually(timeout(3.seconds)) { // get session list again