This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f2ccc6aa75 [fix](jni_connector) fix that be core when jni_connector 
open fails (#37697)
2f2ccc6aa75 is described below

commit 2f2ccc6aa75c2a416f116d2d726d347a3e36d20e
Author: Tiewei Fang <43782773+bepppo...@users.noreply.github.com>
AuthorDate: Sun Jul 14 15:52:20 2024 +0800

    [fix](jni_connector) fix that be core when jni_connector open fails (#37697)
    
    Here are two problems:
    1. `appendDataTimeNs` will be `NULL` if TrinoConnector open fails before
    call to `parseRequiredTypes`
    2. It does not catch exception in method `get_statistics()` and this
    exception is not caught until `close()` method. Therefore, it will cause
    BE core dump in `JniConnector::close()` at `LOG(FATAL)`
---
 be/src/vec/exec/jni_connector.cpp                                | 9 ++++++++-
 .../apache/doris/trinoconnector/TrinoConnectorJniScanner.java    | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/be/src/vec/exec/jni_connector.cpp 
b/be/src/vec/exec/jni_connector.cpp
index 66b01bbe847..0c2485ada3b 100644
--- a/be/src/vec/exec/jni_connector.cpp
+++ b/be/src/vec/exec/jni_connector.cpp
@@ -154,6 +154,13 @@ Status JniConnector::get_table_schema(std::string& 
table_schema_str) {
 
 std::map<std::string, std::string> JniConnector::get_statistics(JNIEnv* env) {
     jobject metrics = env->CallObjectMethod(_jni_scanner_obj, 
_jni_scanner_get_statistics);
+    jthrowable exc = (env)->ExceptionOccurred();
+    if (exc != nullptr) {
+        LOG(WARNING) << "get_statistics has error: "
+                     << JniUtil::GetJniExceptionMsg(env).to_string();
+        env->DeleteLocalRef(metrics);
+        return std::map<std::string, std::string> {};
+    }
     std::map<std::string, std::string> result = 
JniUtil::convert_to_cpp_map(env, metrics);
     env->DeleteLocalRef(metrics);
     return result;
@@ -163,7 +170,7 @@ Status JniConnector::close() {
     if (!_closed) {
         JNIEnv* env = nullptr;
         RETURN_IF_ERROR(JniUtil::GetJNIEnv(&env));
-        if (_scanner_opened) {
+        if (_scanner_opened && _jni_scanner_obj != nullptr) {
             // _fill_block may be failed and returned, we should release table 
in close.
             // org.apache.doris.common.jni.JniScanner#releaseTable is 
idempotent
             env->CallVoidMethod(_jni_scanner_obj, _jni_scanner_release_table);
diff --git 
a/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorJniScanner.java
 
b/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorJniScanner.java
index 3e050fc923f..af20668081d 100644
--- 
a/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorJniScanner.java
+++ 
b/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorJniScanner.java
@@ -132,6 +132,7 @@ public class TrinoConnectorJniScanner extends JniScanner {
         catalogNameString = params.get("catalog_name");
         super.batchSize = batchSize;
         super.fields = params.get("required_fields").split(",");
+        appendDataTimeNs = new long[fields.length];
 
         connectorSplitString = params.get("trino_connector_split");
         connectorTableHandleString = 
params.get("trino_connector_table_handle");


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to