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 19ccb9517f [fix](iceberg) should call UserGroupInformation when enable 
security authentication (#24614)
19ccb9517f is described below

commit 19ccb9517f98f0b9aab372c647573d0138ff7c86
Author: Ashin Gau <ashin...@users.noreply.github.com>
AuthorDate: Tue Sep 19 22:39:58 2023 +0800

    [fix](iceberg) should call UserGroupInformation when enable security 
authentication (#24614)
    
    Fix two bugs:
    1. Call `UserGroupInformation.doAs` when enable security authentication
    2. `catalogId` is 0 when `IcebergExternalCatalog` is loaded from fe image
---
 .../doris/catalog/HiveMetaStoreClientHelper.java   | 19 ++++++++++++++++
 .../catalog/external/IcebergExternalTable.java     | 26 +++++++++++++---------
 .../apache/doris/datasource/ExternalCatalog.java   | 11 +++++++++
 .../datasource/iceberg/IcebergExternalCatalog.java | 20 +++--------------
 .../datasource/paimon/PaimonExternalCatalog.java   | 11 ---------
 .../doris/planner/external/hudi/HudiScanNode.java  | 19 +++-------------
 .../external/iceberg/IcebergMetadataCache.java     |  6 +++--
 .../planner/external/iceberg/IcebergScanNode.java  |  5 +++++
 8 files changed, 60 insertions(+), 57 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java
 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java
index 4b5c2b1d7c..8aa7d39090 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java
@@ -35,6 +35,7 @@ import org.apache.doris.catalog.external.HMSExternalTable;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.ExternalCatalog;
 import org.apache.doris.datasource.property.constants.HMSProperties;
 import org.apache.doris.fs.FileSystemFactory;
 import org.apache.doris.fs.RemoteFiles;
@@ -927,6 +928,24 @@ public class HiveMetaStoreClientHelper {
         return ugi;
     }
 
+    public static <T> T ugiDoAs(long catalogId, PrivilegedExceptionAction<T> 
action) {
+        return ugiDoAs(((ExternalCatalog) 
Env.getCurrentEnv().getCatalogMgr().getCatalog(catalogId)).getConfiguration(),
+                action);
+    }
+
+    public static <T> T ugiDoAs(Configuration conf, 
PrivilegedExceptionAction<T> action) {
+        UserGroupInformation ugi = getUserGroupInformation(conf);
+        try {
+            if (ugi != null) {
+                return ugi.doAs(action);
+            } else {
+                return action.run();
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage(), e.getCause());
+        }
+    }
+
     public static HoodieTableMetaClient getHudiClient(HMSExternalTable table) {
         String hudiBasePath = table.getRemoteTable().getSd().getLocation();
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/IcebergExternalTable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/IcebergExternalTable.java
index c2be8b90a0..bede9b99e4 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/IcebergExternalTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/IcebergExternalTable.java
@@ -19,6 +19,7 @@ package org.apache.doris.catalog.external;
 
 import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.HiveMetaStoreClientHelper;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.datasource.iceberg.IcebergExternalCatalog;
@@ -60,15 +61,17 @@ public class IcebergExternalTable extends ExternalTable {
 
     @Override
     public List<Column> initSchema() {
-        Schema schema = ((IcebergExternalCatalog) 
catalog).getIcebergTable(dbName, name).schema();
-        List<Types.NestedField> columns = schema.columns();
-        List<Column> tmpSchema = 
Lists.newArrayListWithCapacity(columns.size());
-        for (Types.NestedField field : columns) {
-            tmpSchema.add(new Column(field.name(),
-                    icebergTypeToDorisType(field.type()), true, null, true, 
field.doc(), true,
-                    schema.caseInsensitiveFindField(field.name()).fieldId()));
-        }
-        return tmpSchema;
+        return HiveMetaStoreClientHelper.ugiDoAs(catalog.getConfiguration(), 
() -> {
+            Schema schema = ((IcebergExternalCatalog) 
catalog).getIcebergTable(dbName, name).schema();
+            List<Types.NestedField> columns = schema.columns();
+            List<Column> tmpSchema = 
Lists.newArrayListWithCapacity(columns.size());
+            for (Types.NestedField field : columns) {
+                tmpSchema.add(new Column(field.name(),
+                        icebergTypeToDorisType(field.type()), true, null, 
true, field.doc(), true,
+                        
schema.caseInsensitiveFindField(field.name()).fieldId()));
+            }
+            return tmpSchema;
+        });
     }
 
     private Type 
icebergPrimitiveTypeToDorisType(org.apache.iceberg.types.Type.PrimitiveType 
primitive) {
@@ -141,7 +144,8 @@ public class IcebergExternalTable extends ExternalTable {
     @Override
     public Optional<ColumnStatistic> getColumnStatistic(String colName) {
         makeSureInitialized();
-        return StatisticsUtil.getIcebergColumnStats(colName,
-            ((IcebergExternalCatalog) catalog).getIcebergTable(dbName, name));
+        return HiveMetaStoreClientHelper.ugiDoAs(catalog.getConfiguration(),
+                () -> StatisticsUtil.getIcebergColumnStats(colName,
+                        ((IcebergExternalCatalog) 
catalog).getIcebergTable(dbName, name)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
index 21617b2f05..986c63aa96 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
@@ -49,6 +49,8 @@ import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdfs.HdfsConfiguration;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.jetbrains.annotations.Nullable;
@@ -108,6 +110,15 @@ public abstract class ExternalCatalog
         this.comment = com.google.common.base.Strings.nullToEmpty(comment);
     }
 
+    public Configuration getConfiguration() {
+        Configuration conf = new HdfsConfiguration();
+        Map<String, String> catalogProperties = 
catalogProperty.getHadoopProperties();
+        for (Map.Entry<String, String> entry : catalogProperties.entrySet()) {
+            conf.set(entry.getKey(), entry.getValue());
+        }
+        return conf;
+    }
+
     protected List<String> listDatabaseNames() {
         throw new UnsupportedOperationException("Unsupported operation: "
                 + "listDatabaseNames from remote client when init catalog with 
" + logType.name());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
index 8df4acfc8f..20e2a7ebfe 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergExternalCatalog.java
@@ -25,8 +25,6 @@ import org.apache.doris.datasource.ExternalCatalog;
 import org.apache.doris.datasource.InitCatalogLog;
 import org.apache.doris.datasource.SessionContext;
 
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hdfs.HdfsConfiguration;
 import org.apache.iceberg.catalog.Catalog;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.SupportsNamespaces;
@@ -35,7 +33,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 public abstract class IcebergExternalCatalog extends ExternalCatalog {
@@ -50,11 +47,9 @@ public abstract class IcebergExternalCatalog extends 
ExternalCatalog {
     protected String icebergCatalogType;
     protected Catalog catalog;
     protected SupportsNamespaces nsCatalog;
-    private final long catalogId;
 
     public IcebergExternalCatalog(long catalogId, String name, String comment) 
{
         super(catalogId, name, InitCatalogLog.Type.ICEBERG, comment);
-        this.catalogId = catalogId;
     }
 
     @Override
@@ -63,15 +58,6 @@ public abstract class IcebergExternalCatalog extends 
ExternalCatalog {
         super.init();
     }
 
-    protected Configuration getConfiguration() {
-        Configuration conf = new HdfsConfiguration();
-        Map<String, String> catalogProperties = 
catalogProperty.getHadoopProperties();
-        for (Map.Entry<String, String> entry : catalogProperties.entrySet()) {
-            conf.set(entry.getKey(), entry.getValue());
-        }
-        return conf;
-    }
-
     public Catalog getCatalog() {
         makeSureInitialized();
         return catalog;
@@ -118,8 +104,8 @@ public abstract class IcebergExternalCatalog extends 
ExternalCatalog {
     public org.apache.iceberg.Table getIcebergTable(String dbName, String 
tblName) {
         makeSureInitialized();
         return Env.getCurrentEnv()
-            .getExtMetaCacheMgr()
-            .getIcebergMetadataCache()
-            .getIcebergTable(catalog, catalogId, dbName, tblName);
+                .getExtMetaCacheMgr()
+                .getIcebergMetadataCache()
+                .getIcebergTable(catalog, id, dbName, tblName);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalCatalog.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalCatalog.java
index 9e9422a95e..d2a3571f3b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalCatalog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalCatalog.java
@@ -23,8 +23,6 @@ import org.apache.doris.datasource.SessionContext;
 import org.apache.doris.datasource.property.constants.PaimonProperties;
 
 import com.google.common.collect.Maps;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hdfs.HdfsConfiguration;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.paimon.catalog.Catalog;
@@ -54,15 +52,6 @@ public abstract class PaimonExternalCatalog extends 
ExternalCatalog {
         super.init();
     }
 
-    protected Configuration getConfiguration() {
-        Configuration conf = new HdfsConfiguration();
-        Map<String, String> catalogProperties = 
catalogProperty.getHadoopProperties();
-        for (Map.Entry<String, String> entry : catalogProperties.entrySet()) {
-            conf.set(entry.getKey(), entry.getValue());
-        }
-        return conf;
-    }
-
     public Catalog getCatalog() {
         makeSureInitialized();
         return catalog;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/hudi/HudiScanNode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/hudi/HudiScanNode.java
index 328c7b0f19..b0306ab19c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/hudi/HudiScanNode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/hudi/HudiScanNode.java
@@ -46,7 +46,6 @@ import org.apache.avro.Schema;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hudi.avro.HoodieAvroUtils;
 import org.apache.hudi.common.fs.FSUtils;
 import org.apache.hudi.common.model.BaseFile;
@@ -62,7 +61,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.io.IOException;
-import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -254,20 +252,9 @@ public class HudiScanNode extends HiveScanNode {
             snapshotTimestamp = Option.empty();
         }
         // Non partition table will get one dummy partition
-        UserGroupInformation ugi = 
HiveMetaStoreClientHelper.getUserGroupInformation(
-                HiveMetaStoreClientHelper.getConfiguration(hmsTable));
-        List<HivePartition> partitions;
-        if (ugi != null) {
-            try {
-                partitions = ugi.doAs(
-                        (PrivilegedExceptionAction<List<HivePartition>>) () -> 
getPrunedPartitions(hudiClient,
-                                snapshotTimestamp));
-            } catch (Exception e) {
-                throw new UserException(e);
-            }
-        } else {
-            partitions = getPrunedPartitions(hudiClient, snapshotTimestamp);
-        }
+        List<HivePartition> partitions = HiveMetaStoreClientHelper.ugiDoAs(
+                HiveMetaStoreClientHelper.getConfiguration(hmsTable),
+                () -> getPrunedPartitions(hudiClient, snapshotTimestamp));
         Executor executor = ((HudiCachedPartitionProcessor) Env.getCurrentEnv()
                 
.getExtMetaCacheMgr().getHudiPartitionProcess(hmsTable.getCatalog())).getExecutor();
         List<Split> splits = Collections.synchronizedList(new ArrayList<>());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergMetadataCache.java
 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergMetadataCache.java
index 564c1b4955..1f8b226e45 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergMetadataCache.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergMetadataCache.java
@@ -18,6 +18,7 @@
 package org.apache.doris.planner.external.iceberg;
 
 import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.HiveMetaStoreClientHelper;
 import org.apache.doris.catalog.external.HMSExternalTable;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.MetaNotFoundException;
@@ -132,7 +133,8 @@ public class IcebergMetadataCache {
         if (cacheTable != null) {
             return cacheTable;
         }
-        Table table = catalog.loadTable(TableIdentifier.of(dbName, tbName));
+        Table table = HiveMetaStoreClientHelper.ugiDoAs(catalogId,
+                () -> catalog.loadTable(TableIdentifier.of(dbName, tbName)));
         initIcebergTableFileIO(table);
 
         tableCache.put(key, table);
@@ -200,7 +202,7 @@ public class IcebergMetadataCache {
         catalogProperties.put("uri", uri);
         hiveCatalog.initialize("hive", catalogProperties);
 
-        Table table = hiveCatalog.loadTable(TableIdentifier.of(db, tbl));
+        Table table = HiveMetaStoreClientHelper.ugiDoAs(conf, () -> 
hiveCatalog.loadTable(TableIdentifier.of(db, tbl)));
 
         initIcebergTableFileIO(table);
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanNode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanNode.java
index 4837ba5545..85a68aa785 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanNode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanNode.java
@@ -24,6 +24,7 @@ import org.apache.doris.analysis.TupleDescriptor;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.HdfsResource;
+import org.apache.doris.catalog.HiveMetaStoreClientHelper;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.external.ExternalTable;
 import org.apache.doris.catalog.external.HMSExternalTable;
@@ -169,6 +170,10 @@ public class IcebergScanNode extends FileQueryScanNode {
 
     @Override
     public List<Split> getSplits() throws UserException {
+        return 
HiveMetaStoreClientHelper.ugiDoAs(source.getCatalog().getConfiguration(), 
this::doGetSplits);
+    }
+
+    private List<Split> doGetSplits() throws UserException {
 
         TableScan scan = icebergTable.newScan();
 


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

Reply via email to