This is an automated email from the ASF dual-hosted git repository.
chengpan pushed a commit to branch branch-1.8
in repository https://gitbox.apache.org/repos/asf/kyuubi.git
The following commit(s) were added to refs/heads/branch-1.8 by this push:
new 7a91a5879 [KYUUBI #5333][JDBC] Adaptive call fetchLaunchEngineResult
7a91a5879 is described below
commit 7a91a58798031ec98c4f6a0e6a75067e04b21639
Author: Cheng Pan <[email protected]>
AuthorDate: Tue Sep 26 08:06:44 2023 +0000
[KYUUBI #5333][JDBC] Adaptive call fetchLaunchEngineResult
### _Why are the changes needed?_
After https://github.com/apache/kyuubi/pull/3354, thrift `out of sequence`
exception will be thrown when using a higher version of beeline to access a
lower version of Kyuubi Server.
```
2023-09-26 11:10:16.426 ERROR
org.apache.kyuubi.server.KyuubiTBinaryFrontendService: Error fetching results:
org.apache.thrift.protocol.TProtocolException: Required field
'operationHandle' is unset! Struct:TFetchResultsReq(operationHandle:null,
orientation:FETCH_NEXT, maxRows:1000, fetchType:0)
at
org.apache.hive.service.rpc.thrift.TFetchResultsReq.validate(TFetchResultsReq.java:548)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$FetchResults_args.validate(TCLIService.java:15755)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$FetchResults_args$FetchResults_argsStandardScheme.write(TCLIService.java:15812)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$FetchResults_args$FetchResults_argsStandardScheme.write(TCLIService.java:15781)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$FetchResults_args.write(TCLIService.java:15732)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:71)
~[libthrift-0.9.3.jar:0.9.3]
at
org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
~[libthrift-0.9.3.jar:0.9.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$Client.send_FetchResults(TCLIService.java:561)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.hive.service.rpc.thrift.TCLIService$Client.FetchResults(TCLIService.java:553)
~[hive-service-rpc-3.1.3.jar:3.1.3]
at
org.apache.kyuubi.client.KyuubiSyncThriftClient.$anonfun$fetchResults$1(KyuubiSyncThriftClient.scala:393)
~[kyuubi-server_2.12-1.6.1-incubating.jar:1.6.1-incubating]
at
org.apache.kyuubi.client.KyuubiSyncThriftClient.$anonfun$withLockAcquiredAsyncRequest$2(KyuubiSyncThriftClient.scala:136)
~[kyuubi-server_2.12-1.6.1-incubating.jar:1.6.1-incubating]
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
~[?:1.8.0_152]
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
~[?:1.8.0_152]
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
~[?:1.8.0_152]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
~[?:1.8.0_152]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
~[?:1.8.0_152]
at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_152]
```
This PR introduces a negotiation mechanism to make the JDBC client
adaptively call `fetchLaunchEngineResult` to address such a compatible issue.
It supposes that the higher version of JDBC client could seamlessly
communicate with the lower version of Kyuubi Server after this patch, but the
JDBC client fetches the engine information only when the connected Server
applies this patch too.
### _How was this patch tested?_
- [ ] Add some test cases that check the changes thoroughly including
negative and positive cases if possible
- [ ] Add screenshots for manual tests if appropriate
- [x] [Run
test](https://kyuubi.readthedocs.io/en/master/contributing/code/testing.html#running-tests)
locally before make a pull request
### _Was this patch authored or co-authored using generative AI tooling?_
No.
Closes #5333 from pan3793/launch-engine-result.
Closes #5333
ca9bd5361 [Cheng Pan] [JDBC] Adaptive call fetchLaunchEngineResult
Authored-by: Cheng Pan <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
(cherry picked from commit 36eb81be26345f3b99a8f7269e401e2d15fb5c02)
Signed-off-by: Cheng Pan <[email protected]>
---
.../main/scala/org/apache/kyuubi/config/KyuubiReservedKeys.scala | 2 ++
.../main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java | 7 ++++++-
.../org/apache/kyuubi/server/KyuubiTBinaryFrontendService.scala | 2 ++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git
a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiReservedKeys.scala
b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiReservedKeys.scala
index 8b42e659f..eb209caec 100644
---
a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiReservedKeys.scala
+++
b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiReservedKeys.scala
@@ -38,6 +38,8 @@ object KyuubiReservedKeys {
"kyuubi.session.engine.launch.handle.guid"
final val KYUUBI_SESSION_ENGINE_LAUNCH_HANDLE_SECRET =
"kyuubi.session.engine.launch.handle.secret"
+ final val KYUUBI_SESSION_ENGINE_LAUNCH_SUPPORT_RESULT =
+ "kyuubi.session.engine.launch.support.result"
final val KYUUBI_OPERATION_SET_CURRENT_CATALOG =
"kyuubi.operation.set.current.catalog"
final val KYUUBI_OPERATION_GET_CURRENT_CATALOG =
"kyuubi.operation.get.current.catalog"
final val KYUUBI_OPERATION_SET_CURRENT_DATABASE =
"kyuubi.operation.set.current.database"
diff --git
a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java
b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java
index f9935d23e..c23985328 100644
---
a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java
+++
b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java
@@ -104,6 +104,7 @@ public class KyuubiConnection implements SQLConnection,
KyuubiLoggable {
private Thread engineLogThread;
private boolean engineLogInflight = true;
private volatile boolean launchEngineOpCompleted = false;
+ private boolean launchEngineOpSupportResult = false;
private String engineId = "";
private String engineName = "";
private String engineUrl = "";
@@ -770,6 +771,10 @@ public class KyuubiConnection implements SQLConnection,
KyuubiLoggable {
String launchEngineOpHandleSecret =
openRespConf.get("kyuubi.session.engine.launch.handle.secret");
+ launchEngineOpSupportResult =
+ Boolean.parseBoolean(
+
openRespConf.getOrDefault("kyuubi.session.engine.launch.support.result",
"false"));
+
if (launchEngineOpHandleGuid != null && launchEngineOpHandleSecret !=
null) {
try {
byte[] guidBytes =
Base64.getMimeDecoder().decode(launchEngineOpHandleGuid);
@@ -1353,7 +1358,7 @@ public class KyuubiConnection implements SQLConnection,
KyuubiLoggable {
}
private void fetchLaunchEngineResult() {
- if (launchEngineOpHandle == null) return;
+ if (launchEngineOpHandle == null || !launchEngineOpSupportResult) return;
TFetchResultsReq tFetchResultsReq =
new TFetchResultsReq(
diff --git
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTBinaryFrontendService.scala
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTBinaryFrontendService.scala
index 069bc63e2..ae388a7c4 100644
---
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTBinaryFrontendService.scala
+++
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTBinaryFrontendService.scala
@@ -92,6 +92,8 @@ final class KyuubiTBinaryFrontendService(
KYUUBI_SESSION_ENGINE_LAUNCH_HANDLE_SECRET,
Base64.getMimeEncoder.encodeToString(opHandleIdentifier.getSecret))
+ respConfiguration.put(KYUUBI_SESSION_ENGINE_LAUNCH_SUPPORT_RESULT,
true.toString)
+
resp.setSessionHandle(sessionHandle.toTSessionHandle)
resp.setConfiguration(respConfiguration)
resp.setStatus(OK_STATUS)