From 7b9701bd13321454a6feb7d56c9a996db6cf103c Mon Sep 17 00:00:00 2001 From: daidai <2017501503@qq.com> Date: Thu, 17 Oct 2024 10:56:16 +0800 Subject: [PATCH] [fix](jni)fix jni use timezone_obj get timezone be core. (#41956) This PR #40225 try to pass time zone info from BE to JNI, and it use `_state->timezone_obj().name()` to get the timezone name. But when we do some rolling upgrade of BE, it may coredump like: ``` *** SIGSEGV address not mapped to object (@0x610) received by PID 72661 (TID 73538 OR 0x7f2e898d1640) from PID 1552; stack trace: *** 0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/common/signal_handler.h:421 1# os::Linux::chained_handler(int, siginfo_t*, void*) in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so 2# JVM_handle_linux_signal in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so 3# signalHandler(int, siginfo_t*, void*) in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so 4# 0x00007F3070D3E520 in /lib/x86_64-linux-gnu/libc.so.6 5# cctz::time_zone::name[abi:cxx11]() const in /mnt/hdd01/ci/compatibility-deploy/be/lib/doris_be 6# doris::vectorized::JniConnector::open(doris::RuntimeState*, doris::RuntimeProfile*) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/jni_connector.cpp:87 7# doris::vectorized::AvroJNIReader::init_fetch_table_schema_reader() at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/format/avro/avro_jni_reader.cpp:119 8# std::_Function_handler::_M_invoke(std::_Any_data const&) at /var/local/ldb-toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291 9# doris::WorkThreadPool::work_thread(int) at /home/zcp/repo_center/doris_branch-2.1/doris/be/src/util/work_thread_pool.hpp:159 10# execute_native_thread_routine at ../../../../../libstdc++-v3/src/c++11/thread.cc:84 11# start_thread at ./nptl/pthread_create.c:442 12# 0x00007F3070E22850 at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:83 172.20.50.206 last coredump sql: 2024-10-13 04:12:23,985 [query] ``` This PR use another method: `_state->timezone()`, which just return a string, instead of reading and initializing time zone info file, to avoid potential coredump. --- be/src/vec/exec/jni_connector.cpp | 2 +- .../maxcompute/test_external_catalog_maxcompute.groovy | 4 ++-- .../maxcompute/test_max_compute_all_type.groovy | 4 ++-- .../maxcompute/test_max_compute_complex_type.groovy | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/be/src/vec/exec/jni_connector.cpp b/be/src/vec/exec/jni_connector.cpp index ac6cd575718396..e3ad8c16b8125a 100644 --- a/be/src/vec/exec/jni_connector.cpp +++ b/be/src/vec/exec/jni_connector.cpp @@ -84,7 +84,7 @@ Status JniConnector::open(RuntimeState* state, RuntimeProfile* profile) { return Status::InternalError("Failed to get/create JVM"); } SCOPED_TIMER(_open_scanner_time); - _scanner_params.emplace("time_zone", _state->timezone_obj().name()); + _scanner_params.emplace("time_zone", _state->timezone()); RETURN_IF_ERROR(_init_jni_scanner(env, batch_size)); // Call org.apache.doris.common.jni.JniScanner#open env->CallVoidMethod(_jni_scanner_obj, _jni_scanner_open); diff --git a/regression-test/suites/external_table_p2/maxcompute/test_external_catalog_maxcompute.groovy b/regression-test/suites/external_table_p2/maxcompute/test_external_catalog_maxcompute.groovy index ffb633c7b728d6..0539dde5981432 100644 --- a/regression-test/suites/external_table_p2/maxcompute/test_external_catalog_maxcompute.groovy +++ b/regression-test/suites/external_table_p2/maxcompute/test_external_catalog_maxcompute.groovy @@ -320,8 +320,8 @@ suite("test_external_catalog_maxcompute", "p2,external,maxcompute,external_remote,external_remote_maxcompute") { String enabled = context.config.otherConfigs.get("enableMaxComputeTest") if (enabled != null && enabled.equalsIgnoreCase("true")) { - String ak = context.config.otherConfigs.get("aliYunAk") - String sk = context.config.otherConfigs.get("aliYunSk"); + String ak = context.config.otherConfigs.get("ak") + String sk = context.config.otherConfigs.get("sk"); String mc_db = "mc_datalake" String mc_catalog_name = "test_external_mc_catalog" diff --git a/regression-test/suites/external_table_p2/maxcompute/test_max_compute_all_type.groovy b/regression-test/suites/external_table_p2/maxcompute/test_max_compute_all_type.groovy index 879b22f85ad7b1..ad13542340d900 100644 --- a/regression-test/suites/external_table_p2/maxcompute/test_max_compute_all_type.groovy +++ b/regression-test/suites/external_table_p2/maxcompute/test_max_compute_all_type.groovy @@ -315,8 +315,8 @@ select * from mc_all_types; suite("test_max_compute_all_type", "p2,external,maxcompute,external_remote,external_remote_maxcompute") { String enabled = context.config.otherConfigs.get("enableMaxComputeTest") if (enabled != null && enabled.equalsIgnoreCase("true")) { - String ak = context.config.otherConfigs.get("aliYunAk") - String sk = context.config.otherConfigs.get("aliYunSk") + String ak = context.config.otherConfigs.get("ak") + String sk = context.config.otherConfigs.get("sk") String mc_catalog_name = "test_max_compute_all_type" sql """drop catalog if exists ${mc_catalog_name} """ diff --git a/regression-test/suites/external_table_p2/maxcompute/test_max_compute_complex_type.groovy b/regression-test/suites/external_table_p2/maxcompute/test_max_compute_complex_type.groovy index 764f0398f50c42..61ed4ef8ff65d8 100644 --- a/regression-test/suites/external_table_p2/maxcompute/test_max_compute_complex_type.groovy +++ b/regression-test/suites/external_table_p2/maxcompute/test_max_compute_complex_type.groovy @@ -160,8 +160,8 @@ suite("test_max_compute_complex_type", "p2,external,maxcompute,external_remote,external_remote_maxcompute") { String enabled = context.config.otherConfigs.get("enableMaxComputeTest") if (enabled != null && enabled.equalsIgnoreCase("true")) { - String ak = context.config.otherConfigs.get("aliYunAk") - String sk = context.config.otherConfigs.get("aliYunSk") + String ak = context.config.otherConfigs.get("ak") + String sk = context.config.otherConfigs.get("sk") String mc_catalog_name = "test_max_compute_complex_type" sql """drop catalog if exists ${mc_catalog_name} """ sql """