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 e81a403ba01 branch-3.0:[fix](libhdfs) fix the lifecycle issue of 
libhdfs config  (#48353)
e81a403ba01 is described below

commit e81a403ba01fdb860cca303c7295bfc963870e7a
Author: Mingyu Chen (Rayner) <morning...@163.com>
AuthorDate: Wed Feb 26 17:40:28 2025 +0800

    branch-3.0:[fix](libhdfs) fix the lifecycle issue of libhdfs config  
(#48353)
    
    pick part of #47299
    when calling `hdfsBuilderSetKerb5Conf`, the `value` string's lifecycle
    must be
    with `hdfs_builder`.
---
 be/src/io/hdfs_builder.cpp | 26 ++++++++++++++++++++------
 be/src/io/hdfs_builder.h   |  7 +++++++
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/be/src/io/hdfs_builder.cpp b/be/src/io/hdfs_builder.cpp
index 99ee89596ed..cb27b23ca85 100644
--- a/be/src/io/hdfs_builder.cpp
+++ b/be/src/io/hdfs_builder.cpp
@@ -106,6 +106,16 @@ Status HDFSCommonBuilder::init_hdfs_builder() {
     return Status::OK();
 }
 
+void HDFSCommonBuilder::set_hdfs_conf(const std::string& key, const 
std::string& val) {
+    hdfs_conf[key] = val;
+}
+
+void HDFSCommonBuilder::set_hdfs_conf_to_hdfs_builder() {
+    for (const auto& pair : hdfs_conf) {
+        hdfsBuilderConfSetStr(hdfs_builder, pair.first.c_str(), 
pair.second.c_str());
+    }
+}
+
 Status HDFSCommonBuilder::check_krb_params() {
     std::string ticket_path = doris::config::kerberos_ccache_path;
     if (!ticket_path.empty()) {
@@ -157,22 +167,24 @@ THdfsParams parse_properties(const std::map<std::string, 
std::string>& propertie
 Status create_hdfs_builder(const THdfsParams& hdfsParams, const std::string& 
fs_name,
                            HDFSCommonBuilder* builder) {
     RETURN_IF_ERROR(builder->init_hdfs_builder());
-    hdfsBuilderSetNameNode(builder->get(), fs_name.c_str());
+    builder->fs_name = fs_name;
+    hdfsBuilderSetNameNode(builder->get(), builder->fs_name.c_str());
     // set kerberos conf
     if (hdfsParams.__isset.hdfs_kerberos_keytab) {
         builder->kerberos_login = true;
         builder->hdfs_kerberos_keytab = hdfsParams.hdfs_kerberos_keytab;
 #ifdef USE_HADOOP_HDFS
         hdfsBuilderSetKerb5Conf(builder->get(), 
doris::config::kerberos_krb5_conf_path.c_str());
-        hdfsBuilderSetKeyTabFile(builder->get(), 
hdfsParams.hdfs_kerberos_keytab.c_str());
+        hdfsBuilderSetKeyTabFile(builder->get(), 
builder->hdfs_kerberos_keytab.c_str());
 #endif
     }
     if (hdfsParams.__isset.hdfs_kerberos_principal) {
         builder->kerberos_login = true;
         builder->hdfs_kerberos_principal = hdfsParams.hdfs_kerberos_principal;
-        hdfsBuilderSetPrincipal(builder->get(), 
hdfsParams.hdfs_kerberos_principal.c_str());
+        hdfsBuilderSetPrincipal(builder->get(), 
builder->hdfs_kerberos_principal.c_str());
     } else if (hdfsParams.__isset.user) {
-        hdfsBuilderSetUserName(builder->get(), hdfsParams.user.c_str());
+        builder->hadoop_user = hdfsParams.user;
+        hdfsBuilderSetUserName(builder->get(), builder->hadoop_user.c_str());
 #ifdef USE_HADOOP_HDFS
         hdfsBuilderSetKerb5Conf(builder->get(), nullptr);
         hdfsBuilderSetKeyTabFile(builder->get(), nullptr);
@@ -181,15 +193,17 @@ Status create_hdfs_builder(const THdfsParams& hdfsParams, 
const std::string& fs_
     // set other conf
     if (hdfsParams.__isset.hdfs_conf) {
         for (const THdfsConf& conf : hdfsParams.hdfs_conf) {
-            hdfsBuilderConfSetStr(builder->get(), conf.key.c_str(), 
conf.value.c_str());
+            builder->set_hdfs_conf(conf.key, conf.value);
             LOG(INFO) << "set hdfs config: " << conf.key << ", value: " << 
conf.value;
 #ifdef USE_HADOOP_HDFS
             // Set krb5.conf, we should define java.security.krb5.conf in 
catalog properties
             if (strcmp(conf.key.c_str(), "java.security.krb5.conf") == 0) {
-                hdfsBuilderSetKerb5Conf(builder->get(), conf.value.c_str());
+                builder->krb5_conf_path = conf.value;
+                hdfsBuilderSetKerb5Conf(builder->get(), 
builder->krb5_conf_path.c_str());
             }
 #endif
         }
+        builder->set_hdfs_conf_to_hdfs_builder();
     }
     if (builder->is_kerberos()) {
         RETURN_IF_ERROR(builder->check_krb_params());
diff --git a/be/src/io/hdfs_builder.h b/be/src/io/hdfs_builder.h
index 125f3bed82b..8b2539f9e86 100644
--- a/be/src/io/hdfs_builder.h
+++ b/be/src/io/hdfs_builder.h
@@ -59,11 +59,18 @@ public:
     bool is_kerberos() const { return kerberos_login; }
     Status check_krb_params();
 
+    void set_hdfs_conf(const std::string& key, const std::string& val);
+    void set_hdfs_conf_to_hdfs_builder();
+
 private:
     hdfsBuilder* hdfs_builder = nullptr;
     bool kerberos_login {false};
+    std::string fs_name;
+    std::string hadoop_user;
     std::string hdfs_kerberos_keytab;
     std::string hdfs_kerberos_principal;
+    std::string krb5_conf_path;
+    std::unordered_map<std::string, std::string> hdfs_conf;
 };
 
 THdfsParams parse_properties(const std::map<std::string, std::string>& 
properties);


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

Reply via email to