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

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 5a8e2182aac branch-3.0: [fix](be) Fix creating hdfs connection 
coredump within bthread (#43020)
5a8e2182aac is described below

commit 5a8e2182aac52fdcfd16f7dd43ee0bf7dcd2a67c
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Nov 7 14:11:54 2024 +0800

    branch-3.0: [fix](be) Fix creating hdfs connection coredump within bthread 
(#43020)
    
    PR Body: * https://brpc.apache.org/docs/server/basics/
    * According to the brpc doc, `JNI code checks stack layout and cannot be
    run in bthreads` so create a pthread for creating hdfs connection if
    necessary.
    
    Issue Number: close #42610
    
     Cherry-picked from #42629
    
    Co-authored-by: Lei Zhang <[email protected]>
    Co-authored-by: Gavin Chou <[email protected]>
---
 be/src/io/hdfs_util.cpp | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/be/src/io/hdfs_util.cpp b/be/src/io/hdfs_util.cpp
index 6c1bbf80a15..62546c9bbd4 100644
--- a/be/src/io/hdfs_util.cpp
+++ b/be/src/io/hdfs_util.cpp
@@ -17,10 +17,13 @@
 
 #include "io/hdfs_util.h"
 
+#include <bthread/bthread.h>
+#include <bthread/butex.h>
 #include <bvar/latency_recorder.h>
 #include <gen_cpp/cloud.pb.h>
 
 #include <ostream>
+#include <thread>
 
 #include "common/logging.h"
 #include "io/fs/err_utils.h"
@@ -30,7 +33,7 @@
 namespace doris::io {
 namespace {
 
-Status create_hdfs_fs(const THdfsParams& hdfs_params, const std::string& 
fs_name, hdfsFS* fs) {
+Status _create_hdfs_fs(const THdfsParams& hdfs_params, const std::string& 
fs_name, hdfsFS* fs) {
     HDFSCommonBuilder builder;
     RETURN_IF_ERROR(create_hdfs_builder(hdfs_params, fs_name, &builder));
     hdfsFS hdfs_fs = hdfsBuilderConnect(builder.get());
@@ -41,6 +44,38 @@ Status create_hdfs_fs(const THdfsParams& hdfs_params, const 
std::string& fs_name
     return Status::OK();
 }
 
+// https://brpc.apache.org/docs/server/basics/
+// According to the brpc doc, JNI code checks stack layout and cannot be run in
+// bthreads so create a pthread for creating hdfs connection if necessary.
+Status create_hdfs_fs(const THdfsParams& hdfs_params, const std::string& 
fs_name, hdfsFS* fs) {
+    bool is_pthread = bthread_self() == 0;
+    LOG(INFO) << "create hfdfs fs, is_pthread=" << is_pthread << " fs_name=" 
<< fs_name;
+    if (is_pthread) { // running in pthread
+        return _create_hdfs_fs(hdfs_params, fs_name, fs);
+    }
+
+    // running in bthread, switch to a pthread and wait
+    Status st;
+    auto btx = bthread::butex_create();
+    *(int*)btx = 0;
+    std::thread t([&] {
+        st = _create_hdfs_fs(hdfs_params, fs_name, fs);
+        *(int*)btx = 1;
+        bthread::butex_wake_all(btx);
+    });
+    std::unique_ptr<int, std::function<void(int*)>> defer((int*)0x01, [&t, 
&btx](...) {
+        if (t.joinable()) t.join();
+        bthread::butex_destroy(btx);
+    });
+    timespec tmout {.tv_sec = 
std::chrono::system_clock::now().time_since_epoch().count() + 60};
+    if (int ret = bthread::butex_wait(btx, 1, &tmout); ret != 0) {
+        std::string msg = "failed to wait _create_hdfs_fs fs_name=" + fs_name;
+        LOG(WARNING) << msg << " error=" << std::strerror(errno);
+        st = Status::Error<ErrorCode::INTERNAL_ERROR, false>(msg);
+    }
+    return st;
+}
+
 uint64_t hdfs_hash_code(const THdfsParams& hdfs_params, const std::string& 
fs_name) {
     uint64_t hash_code = 0;
     // The specified fsname is used first.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to