From 945cc6fa2bea3d36b8b4d6296f9cf0e098b617b9 Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 14:57:05 +0800 Subject: [PATCH 1/6] [improvement](fe) Migrate HMS client pool to Commons Pool ### What problem does this PR solve? Issue Number: N/A Related PR: N/A Problem Summary: Replace the self-managed HMS client queue in ThriftHMSCachedClient with commons-pool2 while keeping the external interface unchanged. This also preserves broken-client invalidation and adds coverage for pool borrow/return semantics. ### Release note None ### Check List (For Author) - Test: Manual test - FE compilation passed locally - Behavior changed: Yes (the HMS client pool implementation now uses commons-pool2 internally while preserving the existing public behavior) - Does this need documentation: No --- .../hive/ThriftHMSCachedClient.java | 254 ++++++++++++------ .../hive/ThriftHMSCachedClientTest.java | 234 ++++++++++++++++ 2 files changed, 402 insertions(+), 86 deletions(-) create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java index 840ad765587e34..1a0cfcf2bb796d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java @@ -31,6 +31,11 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.apache.commons.pool2.impl.GenericObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.hadoop.hive.common.ValidReadTxnList; import org.apache.hadoop.hive.common.ValidReaderWriteIdList; import org.apache.hadoop.hive.common.ValidTxnList; @@ -69,12 +74,10 @@ import java.util.BitSet; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; -import java.util.Queue; import java.util.function.Function; import java.util.stream.Collectors; @@ -89,31 +92,28 @@ public class ThriftHMSCachedClient implements HMSCachedClient { // -1 means no limit on the partitions returned. private static final short MAX_LIST_PARTITION_NUM = Config.max_hive_list_partition_num; - private Queue clientPool = new LinkedList<>(); - private boolean isClosed = false; - private final int poolSize; + private final GenericObjectPool clientPool; + private volatile boolean isClosed = false; private final HiveConf hiveConf; - private ExecutionAuthenticator executionAuthenticator; + private final ExecutionAuthenticator executionAuthenticator; public ThriftHMSCachedClient(HiveConf hiveConf, int poolSize, ExecutionAuthenticator executionAuthenticator) { Preconditions.checkArgument(poolSize > 0, poolSize); this.hiveConf = hiveConf; - this.poolSize = poolSize; - this.isClosed = false; this.executionAuthenticator = executionAuthenticator; + this.clientPool = new GenericObjectPool<>(new ThriftHMSClientFactory(), createPoolConfig(poolSize)); } @Override public void close() { - synchronized (clientPool) { - this.isClosed = true; - while (!clientPool.isEmpty()) { - try { - clientPool.poll().close(); - } catch (Exception e) { - LOG.warn("failed to close thrift client", e); - } - } + if (isClosed) { + return; + } + isClosed = true; + try { + clientPool.close(); + } catch (Exception e) { + LOG.warn("failed to close thrift client pool", e); } } @@ -545,7 +545,7 @@ public void acquireSharedLock(String queryId, long txnId, String user, TableName "acquire lock timeout for txn " + txnId + " of query " + queryId + ", timeout(ms): " + timeoutMs); } - response = checkLock(lockId); + response = checkLock(client, lockId); } if (response.getState() != LockState.ACQUIRED) { @@ -599,15 +599,11 @@ public Map getValidWriteIds(String fullTableName, long currentTr } } - private LockResponse checkLock(long lockId) { - try (ThriftHMSClient client = getClient()) { - try { - return ugiDoAs(() -> client.client.checkLock(lockId)); - } catch (Exception e) { - client.setThrowable(e); - throw e; - } + private LockResponse checkLock(ThriftHMSClient client, long lockId) { + try { + return ugiDoAs(() -> client.client.checkLock(lockId)); } catch (Exception e) { + client.setThrowable(e); throw new RuntimeException("failed to check lock " + lockId, e); } } @@ -636,53 +632,120 @@ private static LockComponent createLockComponentForRead(TableNameInfo tblName, O return builder.build(); } + private GenericObjectPoolConfig createPoolConfig(int poolSize) { + GenericObjectPoolConfig config = new GenericObjectPoolConfig(); + config.setMaxTotal(poolSize); + config.setMaxIdle(poolSize); + config.setMinIdle(0); + config.setBlockWhenExhausted(true); + config.setMaxWaitMillis(-1L); + config.setTestOnBorrow(false); + config.setTestOnReturn(false); + config.setTestWhileIdle(false); + config.setTimeBetweenEvictionRunsMillis(-1L); + return config; + } + + private IMetaStoreClient createHiveMetastoreClient() throws MetaException { + String type = hiveConf.get(HMSBaseProperties.HIVE_METASTORE_TYPE); + if (HMSBaseProperties.DLF_TYPE.equalsIgnoreCase(type)) { + return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, + ProxyMetaStoreClient.class.getName()); + } else if (HMSBaseProperties.GLUE_TYPE.equalsIgnoreCase(type)) { + return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, + AWSCatalogMetastoreClient.class.getName()); + } else { + return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, + HiveMetaStoreClient.class.getName()); + } + } + + private T withSystemClassLoader(PrivilegedExceptionAction action) throws Exception { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); + return action.run(); + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } + } + + private class ThriftHMSClientFactory extends BasePooledObjectFactory { + @Override + public ThriftHMSClient create() throws Exception { + return withSystemClassLoader(() -> ugiDoAs(() -> new ThriftHMSClient(createHiveMetastoreClient()))); + } + + @Override + public PooledObject wrap(ThriftHMSClient client) { + return new DefaultPooledObject<>(client); + } + + @Override + public boolean validateObject(PooledObject pooledObject) { + return !isClosed && pooledObject.getObject().isValid(); + } + + @Override + public void destroyObject(PooledObject pooledObject) throws Exception { + pooledObject.getObject().destroy(); + } + } + private class ThriftHMSClient implements AutoCloseable { private final IMetaStoreClient client; - private volatile Throwable throwable; - - private ThriftHMSClient(HiveConf hiveConf) throws MetaException { - String type = hiveConf.get(HMSBaseProperties.HIVE_METASTORE_TYPE); - if (HMSBaseProperties.DLF_TYPE.equalsIgnoreCase(type)) { - client = RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - ProxyMetaStoreClient.class.getName()); - } else if (HMSBaseProperties.GLUE_TYPE.equalsIgnoreCase(type)) { - client = RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - AWSCatalogMetastoreClient.class.getName()); - } else { - client = RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - HiveMetaStoreClient.class.getName()); - } + private volatile boolean broken; + private volatile boolean destroyed; + + private ThriftHMSClient(IMetaStoreClient client) { + this.client = client; } public void setThrowable(Throwable throwable) { - this.throwable = throwable; + this.broken = true; + } + + private boolean isValid() { + return !destroyed; + } + + private void destroy() { + if (destroyed) { + return; + } + destroyed = true; + client.close(); } @Override public void close() throws Exception { - synchronized (clientPool) { - if (isClosed || throwable != null || clientPool.size() > poolSize) { - client.close(); + if (isClosed) { + destroy(); + return; + } + try { + if (broken) { + clientPool.invalidateObject(this); } else { - clientPool.offer(this); + clientPool.returnObject(this); } + } catch (IllegalStateException e) { + destroy(); + } catch (Exception e) { + destroy(); + throw e; } } } private ThriftHMSClient getClient() { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); - synchronized (clientPool) { - ThriftHMSClient client = clientPool.poll(); - if (client == null) { - return ugiDoAs(() -> new ThriftHMSClient(hiveConf)); - } - return client; - } - } finally { - Thread.currentThread().setContextClassLoader(classLoader); + Preconditions.checkState(!isClosed, "HMS client pool is closed"); + return clientPool.borrowObject(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new HMSClientException("failed to borrow hms client from pool", e); } } @@ -715,17 +778,21 @@ public void updateTableStatistics( String tableName, Function update) { try (ThriftHMSClient client = getClient()) { - - Table originTable = getTable(dbName, tableName); - Map originParams = originTable.getParameters(); - HivePartitionStatistics updatedStats = update.apply(HiveUtil.toHivePartitionStatistics(originParams)); - - Table newTable = originTable.deepCopy(); - Map newParams = - HiveUtil.updateStatisticsParameters(originParams, updatedStats.getCommonStatistics()); - newParams.put("transient_lastDdlTime", String.valueOf(System.currentTimeMillis() / 1000)); - newTable.setParameters(newParams); - client.client.alter_table(dbName, tableName, newTable); + try { + Table originTable = ugiDoAs(() -> client.client.getTable(dbName, tableName)); + Map originParams = originTable.getParameters(); + HivePartitionStatistics updatedStats = update.apply(HiveUtil.toHivePartitionStatistics(originParams)); + + Table newTable = originTable.deepCopy(); + Map newParams = + HiveUtil.updateStatisticsParameters(originParams, updatedStats.getCommonStatistics()); + newParams.put("transient_lastDdlTime", String.valueOf(System.currentTimeMillis() / 1000)); + newTable.setParameters(newParams); + client.client.alter_table(dbName, tableName, newTable); + } catch (Exception e) { + client.setThrowable(e); + throw e; + } } catch (Exception e) { throw new RuntimeException("failed to update table statistics for " + dbName + "." + tableName, e); } @@ -738,22 +805,27 @@ public void updatePartitionStatistics( String partitionName, Function update) { try (ThriftHMSClient client = getClient()) { - List partitions = client.client.getPartitionsByNames( - dbName, tableName, ImmutableList.of(partitionName)); - if (partitions.size() != 1) { - throw new RuntimeException("Metastore returned multiple partitions for name: " + partitionName); - } + try { + List partitions = client.client.getPartitionsByNames( + dbName, tableName, ImmutableList.of(partitionName)); + if (partitions.size() != 1) { + throw new RuntimeException("Metastore returned multiple partitions for name: " + partitionName); + } - Partition originPartition = partitions.get(0); - Map originParams = originPartition.getParameters(); - HivePartitionStatistics updatedStats = update.apply(HiveUtil.toHivePartitionStatistics(originParams)); + Partition originPartition = partitions.get(0); + Map originParams = originPartition.getParameters(); + HivePartitionStatistics updatedStats = update.apply(HiveUtil.toHivePartitionStatistics(originParams)); - Partition modifiedPartition = originPartition.deepCopy(); - Map newParams = - HiveUtil.updateStatisticsParameters(originParams, updatedStats.getCommonStatistics()); - newParams.put("transient_lastDdlTime", String.valueOf(System.currentTimeMillis() / 1000)); - modifiedPartition.setParameters(newParams); - client.client.alter_partition(dbName, tableName, modifiedPartition); + Partition modifiedPartition = originPartition.deepCopy(); + Map newParams = + HiveUtil.updateStatisticsParameters(originParams, updatedStats.getCommonStatistics()); + newParams.put("transient_lastDdlTime", String.valueOf(System.currentTimeMillis() / 1000)); + modifiedPartition.setParameters(newParams); + client.client.alter_partition(dbName, tableName, modifiedPartition); + } catch (Exception e) { + client.setThrowable(e); + throw e; + } } catch (Exception e) { throw new RuntimeException("failed to update table statistics for " + dbName + "." + tableName, e); } @@ -762,10 +834,15 @@ public void updatePartitionStatistics( @Override public void addPartitions(String dbName, String tableName, List partitions) { try (ThriftHMSClient client = getClient()) { - List hivePartitions = partitions.stream() - .map(HiveUtil::toMetastoreApiPartition) - .collect(Collectors.toList()); - client.client.add_partitions(hivePartitions); + try { + List hivePartitions = partitions.stream() + .map(HiveUtil::toMetastoreApiPartition) + .collect(Collectors.toList()); + client.client.add_partitions(hivePartitions); + } catch (Exception e) { + client.setThrowable(e); + throw e; + } } catch (Exception e) { throw new RuntimeException("failed to add partitions for " + dbName + "." + tableName, e); } @@ -774,7 +851,12 @@ public void addPartitions(String dbName, String tableName, List partitionValues, boolean deleteData) { try (ThriftHMSClient client = getClient()) { - client.client.dropPartition(dbName, tableName, partitionValues, deleteData); + try { + client.client.dropPartition(dbName, tableName, partitionValues, deleteData); + } catch (Exception e) { + client.setThrowable(e); + throw e; + } } catch (Exception e) { throw new RuntimeException("failed to drop partition for " + dbName + "." + tableName, e); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java new file mode 100644 index 00000000000000..23c787913ea838 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java @@ -0,0 +1,234 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.datasource.hive; + +import org.apache.doris.common.jmockit.Deencapsulation; +import org.apache.doris.common.security.authentication.ExecutionAuthenticator; + +import mockit.Mock; +import mockit.MockUp; +import org.apache.commons.pool2.impl.GenericObjectPool; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.metastore.HiveMetaHookLoader; +import org.apache.hadoop.hive.metastore.IMetaStoreClient; +import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient; +import org.apache.hadoop.hive.metastore.api.Table; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class ThriftHMSCachedClientTest { + private AtomicInteger createdClients; + private AtomicInteger closedClients; + + @Before + public void setUp() { + createdClients = new AtomicInteger(); + closedClients = new AtomicInteger(); + new MockUp() { + @Mock + public IMetaStoreClient getProxy(HiveConf hiveConf, HiveMetaHookLoader hookLoader, String mscClassName) { + return createMockClient(); + } + }; + } + + @Test + public void testReturnObjectToPool() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + + Object firstBorrowed = borrowClient(cachedClient); + closeBorrowed(firstBorrowed); + + Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); + Assert.assertEquals(0, getPool(cachedClient).getNumActive()); + Assert.assertEquals(1, createdClients.get()); + Assert.assertEquals(0, closedClients.get()); + + Object secondBorrowed = borrowClient(cachedClient); + Assert.assertSame(firstBorrowed, secondBorrowed); + closeBorrowed(secondBorrowed); + } + + @Test + public void testInvalidateBrokenObject() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + + Object brokenBorrowed = borrowClient(cachedClient); + markBorrowedBroken(brokenBorrowed); + closeBorrowed(brokenBorrowed); + + Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); + Assert.assertEquals(0, getPool(cachedClient).getNumActive()); + Assert.assertEquals(1, createdClients.get()); + Assert.assertEquals(1, closedClients.get()); + + Object nextBorrowed = borrowClient(cachedClient); + Assert.assertNotSame(brokenBorrowed, nextBorrowed); + Assert.assertEquals(2, createdClients.get()); + closeBorrowed(nextBorrowed); + } + + @Test + public void testBorrowBlocksUntilObjectReturned() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + Object firstBorrowed = borrowClient(cachedClient); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + try { + Future waitingBorrow = executor.submit(() -> borrowClient(cachedClient)); + Thread.sleep(200L); + Assert.assertFalse(waitingBorrow.isDone()); + + closeBorrowed(firstBorrowed); + + Object secondBorrowed = waitingBorrow.get(2, TimeUnit.SECONDS); + Assert.assertSame(firstBorrowed, secondBorrowed); + closeBorrowed(secondBorrowed); + } finally { + executor.shutdownNow(); + } + } + + @Test + public void testCloseDestroysIdleObjectsAndRejectsBorrow() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + Object borrowed = borrowClient(cachedClient); + closeBorrowed(borrowed); + + cachedClient.close(); + + Assert.assertTrue(getPool(cachedClient).isClosed()); + Assert.assertEquals(1, closedClients.get()); + Assert.assertThrows(IllegalStateException.class, () -> borrowClient(cachedClient)); + } + + @Test + public void testCloseWhileObjectBorrowedClosesClientOnReturn() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + Object borrowed = borrowClient(cachedClient); + + cachedClient.close(); + Assert.assertEquals(0, closedClients.get()); + + closeBorrowed(borrowed); + + Assert.assertEquals(1, closedClients.get()); + Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); + } + + @Test + public void testUpdateTableStatisticsDoesNotBorrowSecondClient() { + ThriftHMSCachedClient cachedClient = newClient(1); + + cachedClient.updateTableStatistics("db1", "tbl1", statistics -> statistics); + + Assert.assertEquals(1, createdClients.get()); + Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); + Assert.assertEquals(0, getPool(cachedClient).getNumActive()); + } + + private ThriftHMSCachedClient newClient(int poolSize) { + return new ThriftHMSCachedClient(new HiveConf(), poolSize, new ExecutionAuthenticator() { + }); + } + + private GenericObjectPool getPool(ThriftHMSCachedClient cachedClient) { + return Deencapsulation.getField(cachedClient, "clientPool"); + } + + private Object borrowClient(ThriftHMSCachedClient cachedClient) { + return Deencapsulation.invoke(cachedClient, "getClient"); + } + + private void markBorrowedBroken(Object borrowedClient) { + Deencapsulation.invoke(borrowedClient, "setThrowable", new RuntimeException("broken")); + } + + private void closeBorrowed(Object borrowedClient) throws Exception { + ((AutoCloseable) borrowedClient).close(); + } + + private IMetaStoreClient createMockClient() { + createdClients.incrementAndGet(); + return (IMetaStoreClient) Proxy.newProxyInstance( + IMetaStoreClient.class.getClassLoader(), + new Class[] {IMetaStoreClient.class}, + (proxy, method, args) -> { + String methodName = method.getName(); + if ("close".equals(methodName)) { + closedClients.incrementAndGet(); + return null; + } + if ("hashCode".equals(methodName)) { + return System.identityHashCode(proxy); + } + if ("equals".equals(methodName)) { + return proxy == args[0]; + } + if ("toString".equals(methodName)) { + return "MockHmsClient"; + } + if ("getTable".equals(methodName)) { + Table table = new Table(); + table.setParameters(new HashMap<>()); + return table; + } + return defaultValue(method.getReturnType()); + }); + } + + private Object defaultValue(Class returnType) { + if (!returnType.isPrimitive()) { + return null; + } + if (returnType == boolean.class) { + return false; + } + if (returnType == byte.class) { + return (byte) 0; + } + if (returnType == short.class) { + return (short) 0; + } + if (returnType == int.class) { + return 0; + } + if (returnType == long.class) { + return 0L; + } + if (returnType == float.class) { + return 0F; + } + if (returnType == double.class) { + return 0D; + } + if (returnType == char.class) { + return '\0'; + } + return null; + } +} From e79d42e1da174d0e7af041ed1e072604f5cdc757 Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 15:33:14 +0800 Subject: [PATCH 2/6] [improvement](fe) Clarify HMS pool responsibility boundary ### What problem does this PR solve? Issue Number: N/A Related PR: N/A Problem Summary: Refine the Commons Pool based HMS client pool so that it only manages FE-side client lifecycle. Hive socket lifetime and reconnect remain the responsibility of RetryingMetaStoreClient. Keep setThrowable storing the failure cause for invalidated borrowers and document the pool scope in code comments. ### Release note None ### Check List (For Author) - Test: Manual test - No additional test run for this incremental cleanup - Behavior changed: No (this change clarifies pool scope and preserves throwable-based invalidation) - Does this need documentation: No --- .../hive/ThriftHMSCachedClient.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java index 1a0cfcf2bb796d..212723c69bcac9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java @@ -632,6 +632,18 @@ private static LockComponent createLockComponentForRead(TableNameInfo tblName, O return builder.build(); } + /** + * The Doris HMS pool only manages client object lifecycle in FE: + * 1. Create clients. + * 2. Borrow and return clients. + * 3. Invalidate borrowers that have already failed. + * 4. Destroy clients when the pool is closed. + * + * The pool does not manage Hive-side socket lifetime or reconnect: + * 1. RetryingMetaStoreClient handles hive.metastore.client.socket.lifetime itself. + * 2. The pool does not interpret that config. + * 3. The pool does not probe remote socket health. + */ private GenericObjectPoolConfig createPoolConfig(int poolSize) { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); config.setMaxTotal(poolSize); @@ -694,19 +706,19 @@ public void destroyObject(PooledObject pooledObject) throws Exc private class ThriftHMSClient implements AutoCloseable { private final IMetaStoreClient client; - private volatile boolean broken; private volatile boolean destroyed; + private volatile Throwable throwable; private ThriftHMSClient(IMetaStoreClient client) { this.client = client; } public void setThrowable(Throwable throwable) { - this.broken = true; + this.throwable = throwable; } private boolean isValid() { - return !destroyed; + return !destroyed && throwable == null; } private void destroy() { @@ -724,7 +736,7 @@ public void close() throws Exception { return; } try { - if (broken) { + if (throwable != null) { clientPool.invalidateObject(this); } else { clientPool.returnObject(this); From 02914feeb6288626b9c719ac2f2db4d2d75b37f6 Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 15:52:03 +0800 Subject: [PATCH 3/6] add more ut --- .../hive/ThriftHMSCachedClientTest.java | 340 ++++++++++++++---- 1 file changed, 269 insertions(+), 71 deletions(-) diff --git a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java index 23c787913ea838..6c4e06e557e89a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java @@ -19,21 +19,36 @@ import org.apache.doris.common.jmockit.Deencapsulation; import org.apache.doris.common.security.authentication.ExecutionAuthenticator; +import org.apache.doris.datasource.NameMapping; +import org.apache.doris.datasource.property.metastore.HMSBaseProperties; +import org.apache.doris.info.TableNameInfo; +import com.aliyun.datalake.metastore.hive2.ProxyMetaStoreClient; +import com.amazonaws.glue.catalog.metastore.AWSCatalogMetastoreClient; import mockit.Mock; import mockit.MockUp; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.HiveMetaHookLoader; +import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; import org.apache.hadoop.hive.metastore.IMetaStoreClient; import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient; +import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.metastore.api.LockResponse; +import org.apache.hadoop.hive.metastore.api.LockState; +import org.apache.hadoop.hive.metastore.api.Partition; import org.apache.hadoop.hive.metastore.api.Table; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.lang.reflect.Proxy; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.Deque; import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -41,21 +56,30 @@ import java.util.concurrent.atomic.AtomicInteger; public class ThriftHMSCachedClientTest { - private AtomicInteger createdClients; - private AtomicInteger closedClients; + private MockMetastoreController controller; @Before public void setUp() { - createdClients = new AtomicInteger(); - closedClients = new AtomicInteger(); + controller = new MockMetastoreController(); new MockUp() { @Mock public IMetaStoreClient getProxy(HiveConf hiveConf, HiveMetaHookLoader hookLoader, String mscClassName) { - return createMockClient(); + return controller.createClient(mscClassName); } }; } + @Test + public void testPoolConfigKeepsBorrowValidationAndIdleEvictionDisabled() { + ThriftHMSCachedClient cachedClient = newClient(1); + + GenericObjectPool pool = getPool(cachedClient); + Assert.assertFalse(pool.getTestOnBorrow()); + Assert.assertFalse(pool.getTestOnReturn()); + Assert.assertFalse(pool.getTestWhileIdle()); + Assert.assertEquals(-1L, pool.getTimeBetweenEvictionRunsMillis()); + } + @Test public void testReturnObjectToPool() throws Exception { ThriftHMSCachedClient cachedClient = newClient(1); @@ -65,8 +89,8 @@ public void testReturnObjectToPool() throws Exception { Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); - Assert.assertEquals(1, createdClients.get()); - Assert.assertEquals(0, closedClients.get()); + Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(0, controller.closedClients.get()); Object secondBorrowed = borrowClient(cachedClient); Assert.assertSame(firstBorrowed, secondBorrowed); @@ -78,17 +102,17 @@ public void testInvalidateBrokenObject() throws Exception { ThriftHMSCachedClient cachedClient = newClient(1); Object brokenBorrowed = borrowClient(cachedClient); - markBorrowedBroken(brokenBorrowed); + markBorrowedBroken(brokenBorrowed, new RuntimeException("broken")); closeBorrowed(brokenBorrowed); Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); - Assert.assertEquals(1, createdClients.get()); - Assert.assertEquals(1, closedClients.get()); + Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(1, controller.closedClients.get()); Object nextBorrowed = borrowClient(cachedClient); Assert.assertNotSame(brokenBorrowed, nextBorrowed); - Assert.assertEquals(2, createdClients.get()); + Assert.assertEquals(2, controller.createdClients.get()); closeBorrowed(nextBorrowed); } @@ -122,7 +146,7 @@ public void testCloseDestroysIdleObjectsAndRejectsBorrow() throws Exception { cachedClient.close(); Assert.assertTrue(getPool(cachedClient).isClosed()); - Assert.assertEquals(1, closedClients.get()); + Assert.assertEquals(1, controller.closedClients.get()); Assert.assertThrows(IllegalStateException.class, () -> borrowClient(cachedClient)); } @@ -132,27 +156,127 @@ public void testCloseWhileObjectBorrowedClosesClientOnReturn() throws Exception Object borrowed = borrowClient(cachedClient); cachedClient.close(); - Assert.assertEquals(0, closedClients.get()); + Assert.assertEquals(0, controller.closedClients.get()); closeBorrowed(borrowed); - Assert.assertEquals(1, closedClients.get()); + Assert.assertEquals(1, controller.closedClients.get()); Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); } + @Test + public void testDefaultMetastoreTypeUsesHiveClient() throws Exception { + ThriftHMSCachedClient cachedClient = newClient(1); + + Object borrowed = borrowClient(cachedClient); + closeBorrowed(borrowed); + + Assert.assertEquals(Collections.singletonList(HiveMetaStoreClient.class.getName()), + controller.requestedClientClassNames); + } + + @Test + public void testGlueMetastoreTypeUsesGlueClient() throws Exception { + HiveConf hiveConf = new HiveConf(); + hiveConf.set(HMSBaseProperties.HIVE_METASTORE_TYPE, HMSBaseProperties.GLUE_TYPE); + ThriftHMSCachedClient cachedClient = newClient(hiveConf, 1); + + Object borrowed = borrowClient(cachedClient); + closeBorrowed(borrowed); + + Assert.assertEquals(Collections.singletonList(AWSCatalogMetastoreClient.class.getName()), + controller.requestedClientClassNames); + } + + @Test + public void testDlfMetastoreTypeUsesDlfClient() throws Exception { + HiveConf hiveConf = new HiveConf(); + hiveConf.set(HMSBaseProperties.HIVE_METASTORE_TYPE, HMSBaseProperties.DLF_TYPE); + ThriftHMSCachedClient cachedClient = newClient(hiveConf, 1); + + Object borrowed = borrowClient(cachedClient); + closeBorrowed(borrowed); + + Assert.assertEquals(Collections.singletonList(ProxyMetaStoreClient.class.getName()), + controller.requestedClientClassNames); + } + @Test public void testUpdateTableStatisticsDoesNotBorrowSecondClient() { ThriftHMSCachedClient cachedClient = newClient(1); cachedClient.updateTableStatistics("db1", "tbl1", statistics -> statistics); - Assert.assertEquals(1, createdClients.get()); + Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); + Assert.assertEquals(0, getPool(cachedClient).getNumActive()); + } + + @Test + public void testAcquireSharedLockDoesNotBorrowSecondClient() { + controller.lockStates.add(LockState.WAITING); + controller.lockStates.add(LockState.ACQUIRED); + ThriftHMSCachedClient cachedClient = newClient(1); + + cachedClient.acquireSharedLock("query-1", 1L, "user", + new TableNameInfo("db1", "tbl1"), Collections.emptyList(), 5_000L); + + Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(1, controller.checkLockCalls.get()); Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); } + @Test + public void testUpdatePartitionStatisticsInvalidatesFailedClient() throws Exception { + controller.alterPartitionFailure = new RuntimeException("alter partition failed"); + ThriftHMSCachedClient cachedClient = newClient(1); + + RuntimeException exception = Assert.assertThrows(RuntimeException.class, + () -> cachedClient.updatePartitionStatistics("db1", "tbl1", "p1", statistics -> statistics)); + Assert.assertTrue(exception.getMessage().contains("failed to update table statistics")); + assertBrokenBorrowerIsNotReused(cachedClient); + } + + @Test + public void testAddPartitionsInvalidatesFailedClient() throws Exception { + controller.addPartitionsFailure = new RuntimeException("add partitions failed"); + ThriftHMSCachedClient cachedClient = newClient(1); + + RuntimeException exception = Assert.assertThrows(RuntimeException.class, + () -> cachedClient.addPartitions("db1", "tbl1", Collections.singletonList(newPartitionWithStatistics()))); + Assert.assertTrue(exception.getMessage().contains("failed to add partitions")); + assertBrokenBorrowerIsNotReused(cachedClient); + } + + @Test + public void testDropPartitionInvalidatesFailedClient() throws Exception { + controller.dropPartitionFailure = new RuntimeException("drop partition failed"); + ThriftHMSCachedClient cachedClient = newClient(1); + + RuntimeException exception = Assert.assertThrows(RuntimeException.class, + () -> cachedClient.dropPartition("db1", "tbl1", Collections.singletonList("p1"), false)); + Assert.assertTrue(exception.getMessage().contains("failed to drop partition")); + assertBrokenBorrowerIsNotReused(cachedClient); + } + + private void assertBrokenBorrowerIsNotReused(ThriftHMSCachedClient cachedClient) throws Exception { + Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); + Assert.assertEquals(0, getPool(cachedClient).getNumActive()); + Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(1, controller.closedClients.get()); + + Object nextBorrowed = borrowClient(cachedClient); + Assert.assertEquals(2, controller.createdClients.get()); + closeBorrowed(nextBorrowed); + } + private ThriftHMSCachedClient newClient(int poolSize) { - return new ThriftHMSCachedClient(new HiveConf(), poolSize, new ExecutionAuthenticator() { + return newClient(new HiveConf(), poolSize); + } + + private ThriftHMSCachedClient newClient(HiveConf hiveConf, int poolSize) { + return new ThriftHMSCachedClient(hiveConf, poolSize, new ExecutionAuthenticator() { }); } @@ -164,71 +288,145 @@ private Object borrowClient(ThriftHMSCachedClient cachedClient) { return Deencapsulation.invoke(cachedClient, "getClient"); } - private void markBorrowedBroken(Object borrowedClient) { - Deencapsulation.invoke(borrowedClient, "setThrowable", new RuntimeException("broken")); + private void markBorrowedBroken(Object borrowedClient, Throwable throwable) { + Deencapsulation.invoke(borrowedClient, "setThrowable", throwable); } private void closeBorrowed(Object borrowedClient) throws Exception { ((AutoCloseable) borrowedClient).close(); } - private IMetaStoreClient createMockClient() { - createdClients.incrementAndGet(); - return (IMetaStoreClient) Proxy.newProxyInstance( - IMetaStoreClient.class.getClassLoader(), - new Class[] {IMetaStoreClient.class}, - (proxy, method, args) -> { - String methodName = method.getName(); - if ("close".equals(methodName)) { - closedClients.incrementAndGet(); - return null; - } - if ("hashCode".equals(methodName)) { - return System.identityHashCode(proxy); - } - if ("equals".equals(methodName)) { - return proxy == args[0]; - } - if ("toString".equals(methodName)) { - return "MockHmsClient"; - } - if ("getTable".equals(methodName)) { - Table table = new Table(); - table.setParameters(new HashMap<>()); - return table; - } - return defaultValue(method.getReturnType()); - }); - } - - private Object defaultValue(Class returnType) { - if (!returnType.isPrimitive()) { - return null; - } - if (returnType == boolean.class) { - return false; - } - if (returnType == byte.class) { - return (byte) 0; - } - if (returnType == short.class) { - return (short) 0; - } - if (returnType == int.class) { - return 0; + private HivePartitionWithStatistics newPartitionWithStatistics() { + HivePartition partition = new HivePartition( + NameMapping.createForTest("db1", "tbl1"), + false, + "input-format", + "file:///tmp/part", + Collections.singletonList("p1"), + new HashMap<>(), + "output-format", + "serde", + Collections.singletonList(new FieldSchema("c1", "string", ""))); + return new HivePartitionWithStatistics("k1=v1", partition, HivePartitionStatistics.EMPTY); + } + + private static class MockMetastoreController { + private final AtomicInteger createdClients = new AtomicInteger(); + private final AtomicInteger closedClients = new AtomicInteger(); + private final AtomicInteger checkLockCalls = new AtomicInteger(); + private final List requestedClientClassNames = new CopyOnWriteArrayList<>(); + private final Deque lockStates = new ArrayDeque<>(); + + private volatile RuntimeException alterPartitionFailure; + private volatile RuntimeException addPartitionsFailure; + private volatile RuntimeException dropPartitionFailure; + + private IMetaStoreClient createClient(String mscClassName) { + requestedClientClassNames.add(mscClassName); + createdClients.incrementAndGet(); + return (IMetaStoreClient) Proxy.newProxyInstance( + IMetaStoreClient.class.getClassLoader(), + new Class[] {IMetaStoreClient.class}, + (proxy, method, args) -> handleMethod(proxy, method.getName(), args, method.getReturnType())); } - if (returnType == long.class) { - return 0L; + + private Object handleMethod(Object proxy, String methodName, Object[] args, Class returnType) { + if ("close".equals(methodName)) { + closedClients.incrementAndGet(); + return null; + } + if ("hashCode".equals(methodName)) { + return System.identityHashCode(proxy); + } + if ("equals".equals(methodName)) { + return proxy == args[0]; + } + if ("toString".equals(methodName)) { + return "MockHmsClient"; + } + if ("getTable".equals(methodName)) { + Table table = new Table(); + table.setParameters(new HashMap<>()); + return table; + } + if ("getPartitionsByNames".equals(methodName)) { + Partition partition = new Partition(); + partition.setParameters(new HashMap<>()); + return Collections.singletonList(partition); + } + if ("alter_partition".equals(methodName)) { + if (alterPartitionFailure != null) { + throw alterPartitionFailure; + } + return null; + } + if ("add_partitions".equals(methodName)) { + if (addPartitionsFailure != null) { + throw addPartitionsFailure; + } + return 1; + } + if ("dropPartition".equals(methodName)) { + if (dropPartitionFailure != null) { + throw dropPartitionFailure; + } + return true; + } + if ("lock".equals(methodName)) { + return newLockResponse(nextLockState()); + } + if ("checkLock".equals(methodName)) { + checkLockCalls.incrementAndGet(); + return newLockResponse(nextLockState()); + } + return defaultValue(returnType); } - if (returnType == float.class) { - return 0F; + + private LockState nextLockState() { + synchronized (lockStates) { + if (lockStates.isEmpty()) { + return LockState.ACQUIRED; + } + return lockStates.removeFirst(); + } } - if (returnType == double.class) { - return 0D; + + private LockResponse newLockResponse(LockState state) { + LockResponse response = new LockResponse(); + response.setLockid(1L); + response.setState(state); + return response; } - if (returnType == char.class) { - return '\0'; + + private Object defaultValue(Class returnType) { + if (!returnType.isPrimitive()) { + return null; + } + if (returnType == boolean.class) { + return false; + } + if (returnType == byte.class) { + return (byte) 0; + } + if (returnType == short.class) { + return (short) 0; + } + if (returnType == int.class) { + return 0; + } + if (returnType == long.class) { + return 0L; + } + if (returnType == float.class) { + return 0F; + } + if (returnType == double.class) { + return 0D; + } + if (returnType == char.class) { + return '\0'; + } + return null; } - return null; } } From 91373e547eba0795b7eda8e091a425456893abcf Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 18:25:48 +0800 Subject: [PATCH 4/6] [improvement](fe) Make HMS cached client tests use injected provider ### What problem does this PR solve? Issue Number: N/A Related PR: #61553 Problem Summary: ThriftHMSCachedClient tests were tightly coupled to RetryingMetaStoreClient static construction, which made the UTs fragile and prone to falling through to real Hive client initialization. This change introduces an injectable MetaStoreClientProvider for tests while preserving the production construction path, and rewrites the unit tests to validate Doris pool behavior with a fake provider instead of static Hive mocks. ### Release note None ### Check List (For Author) - Test: Unit Test - Started Target system: Darwin; Target arch: arm64 Python 3.14.3 Check JAVA_HOME version Apache Maven 3.9.14 (996c630dbc656c76214ce58821dcc58be960875b) Maven home: /opt/homebrew/Cellar/maven/3.9.14/libexec Java version: 17.0.18, vendor: Homebrew, runtime: /opt/homebrew/Cellar/openjdk@17/17.0.18/libexec/openjdk.jdk/Contents/Home Default locale: en_CN, platform encoding: UTF-8 OS name: "mac os x", version: "26.3.1", arch: "aarch64", family: "mac" cmake version 4.3.0 CMake suite maintained and supported by Kitware (kitware.com/cmake). ninja 1.13.2 ccache version 4.13.1 Build Frontend UT ****************************** Runing DorisFe Unittest ****************************** Target system: Darwin; Target arch: arm64 Python 3.14.3 Check JAVA_HOME version Apache Maven 3.9.14 (996c630dbc656c76214ce58821dcc58be960875b) Maven home: /opt/homebrew/Cellar/maven/3.9.14/libexec Java version: 17.0.18, vendor: Homebrew, runtime: /opt/homebrew/Cellar/openjdk@17/17.0.18/libexec/openjdk.jdk/Contents/Home Default locale: en_CN, platform encoding: UTF-8 OS name: "mac os x", version: "26.3.1", arch: "aarch64", family: "mac" cmake version 4.3.0 CMake suite maintained and supported by Kitware (kitware.com/cmake). ninja 1.13.2 ccache version 4.13.1 Build generated code rm -rf /Users/xiaogangsu/code/doris/gensrc/build /Library/Developer/CommandLineTools/usr/bin/make -C script /Library/Developer/CommandLineTools/usr/bin/make -C proto /Users/xiaogangsu/code/doris/gensrc/script/gen_build_version.sh mkdir -p /Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/cloud.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/types.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/data.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/internal_service.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/column_data_file.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/runtime_profile.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/olap_common.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/segment_v2.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/function_service.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/file_cache.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/descriptors.proto /Users/xiaogangsu/code/doris/thirdparty/installed/bin/protoc --proto_path=/Users/xiaogangsu/code/doris/gensrc/proto --cpp_out=/Users/xiaogangsu/code/doris/gensrc/proto/../build//gen_cpp /Users/xiaogangsu/code/doris/gensrc/proto/olap_file.proto get java cmd: /opt/homebrew/Cellar/openjdk@17/17.0.18/libexec/openjdk.jdk/Contents/Home/bin/java get java version: openjdk full version \"17.0.18+0\" /Library/Developer/CommandLineTools/usr/bin/make -C thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/QueryCache.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Data.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/QueryPlanExtra.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/MasterService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/parquet.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/DorisExternalService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/FrontendService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/ExternalTableSchema.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Types.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Exprs.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/BackendService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/HeartbeatService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Planner.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PaloInternalService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/RuntimeProfile.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PlanNodes.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Metrics.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Data.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/QueryCache.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/ExternalTableSchema.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/RuntimeProfile.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/DorisExternalService.thrift [WARNING:/Users/xiaogangsu/code/doris/gensrc/thrift/parquet.thrift:583] Uncaptured doctext at on line 575. /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Exprs.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/parquet.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/AgentService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/MetricDefs.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/DataSinks.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Partitions.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Opcodes.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Metrics.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Types.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Status.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Normalization.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/NetworkTest.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Descriptors.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen cpp:moveable_types,no_skeleton -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_cpp --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PaloBrokerService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Opcodes.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Status.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/NetworkTest.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Partitions.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/MetricDefs.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PaloBrokerService.thrift [WARNING:/Users/xiaogangsu/code/doris/gensrc/thrift/parquet.thrift:583] Uncaptured doctext at on line 575. /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Descriptors.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PlanNodes.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/DataSinks.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Normalization.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/QueryPlanExtra.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/Planner.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/PaloInternalService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/HeartbeatService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/AgentService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/MasterService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/FrontendService.thrift /Users/xiaogangsu/code/doris/thirdparty/installed/bin/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift -I /Users/xiaogangsu/code/doris/gensrc/thrift/../build//thrift/ --gen java:fullcamel -out /Users/xiaogangsu/code/doris/gensrc/thrift/../build//gen_java --allow-64bit-consts -strict /Users/xiaogangsu/code/doris/gensrc/thrift/BackendService.thrift Done Unit test parallel is: 1 Run the specified class: org.apache.doris.datasource.hive.ThriftHMSCachedClientTest [INFO] Scanning for projects... [INFO] Cache configuration is not available at configured path /Users/xiaogangsu/code/doris/fe/.mvn/maven-build-cache-config.xml, cache is enabled with defaults [INFO] Using XX hash algorithm for cache [INFO] ------------------------------------------------------------------------ [INFO] Detecting the operating system and CPU architecture [INFO] ------------------------------------------------------------------------ [INFO] os.detected.name: osx [INFO] os.detected.arch: aarch_64 [INFO] os.detected.bitness: 64 [INFO] os.detected.version: 26.3 [INFO] os.detected.version.major: 26 [INFO] os.detected.version.minor: 3 [INFO] os.detected.classifier: osx-aarch_64 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Doris FE Project Parent POM [pom] [INFO] Doris FE Foundation [jar] [INFO] Doris FE Common Utils [jar] [INFO] Doris FE Catalog API [jar] [INFO] Doris FE Extension SPI [jar] [INFO] Doris FE Extension Loader [jar] [INFO] Doris FE Generated Thrift RPC [jar] [INFO] Doris FE Catalog Type [jar] [INFO] Doris FE Core [jar] [INFO] hive-udf [jar] [INFO] be-java-extensions [pom] [INFO] java-common [jar] [INFO] iceberg-metadata-scanner [jar] [INFO] hadoop-deps [jar] [INFO] hadoop-hudi-scanner [jar] [INFO] java-udf [jar] [INFO] jdbc-scanner [jar] [INFO] paimon-scanner [jar] [INFO] max-compute-connector [jar] [INFO] avro-scanner [jar] [INFO] preload-extensions [jar] [INFO] trino-connector-scanner [jar] [INFO] java-writer [jar] [INFO] Doris FE Authentication [pom] [INFO] Doris FE Authentication API [jar] [INFO] Doris FE Authentication SPI [jar] [INFO] Doris FE Authentication Plugins [pom] [INFO] Doris FE - Authentication Plugin - Password [jar] [INFO] Doris FE Authentication Handler [jar] [INFO] Doris FE - Authentication Plugin - LDAP [jar] [INFO] [INFO] ------------------------< org.apache.doris:fe >------------------------- [INFO] Building Doris FE Project Parent POM 1.2-SNAPSHOT [1/30] [INFO] from pom.xml [INFO] --------------------------------[ pom ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 10 ms. XX checksum [a9c61382c13f7495] calculated in 3 ms. [INFO] Attempting to restore project org.apache.doris:fe from build cache [INFO] Local build found by checksum a9c61382c13f7495 [INFO] Found cached build, restoring org.apache.doris:fe from cache by checksum a9c61382c13f7495 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] [INFO] -------------------< org.apache.doris:fe-foundation >------------------- [INFO] Building Doris FE Foundation 1.2-SNAPSHOT [2/30] [INFO] from fe-foundation/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-foundation [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-foundation, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 20 input files. Project dir processing: 4, plugins: 3 millis [INFO] Project inputs calculated in 10 ms. XX checksum [1e6453cc2800b43a] calculated in 28 ms. [INFO] Attempting to restore project org.apache.doris:fe-foundation from build cache [INFO] Local build found by checksum 1e6453cc2800b43a [INFO] Found cached build, restoring org.apache.doris:fe-foundation from cache by checksum 1e6453cc2800b43a [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): jar:test-jar [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------------< org.apache.doris:fe-common >--------------------- [INFO] Building Doris FE Common Utils 1.2-SNAPSHOT [3/30] [INFO] from fe-common/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-common [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 97 input files. Project dir processing: 6, plugins: 2 millis [INFO] Project inputs calculated in 12 ms. XX checksum [b52b47309ec648cd] calculated in 27 ms. [INFO] Attempting to restore project org.apache.doris:fe-common from build cache [INFO] Local build found by checksum b52b47309ec648cd [INFO] Found cached build, restoring org.apache.doris:fe-common from cache by checksum b52b47309ec648cd [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): antlr4:antlr4 [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): jar:test-jar [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] --------------------< org.apache.doris:fe-catalog >--------------------- [INFO] Building Doris FE Catalog API 1.2-SNAPSHOT [4/30] [INFO] from fe-catalog/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-catalog [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-catalog, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 10 input files. Project dir processing: 2, plugins: 1 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 5 ms. XX checksum [c3a722a9a2d80cde] calculated in 2 ms. [INFO] Attempting to restore project org.apache.doris:fe-catalog from build cache [INFO] Local build found by checksum c3a722a9a2d80cde [INFO] Found cached build, restoring org.apache.doris:fe-catalog from cache by checksum c3a722a9a2d80cde [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): jar:test-jar [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -----------------< org.apache.doris:fe-extension-spi >------------------ [INFO] Building Doris FE Extension SPI 1.2-SNAPSHOT [5/30] [INFO] from fe-extension-spi/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-extension-spi [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-spi, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 5 input files. Project dir processing: 2, plugins: 1 millis [INFO] Project inputs calculated in 4 ms. XX checksum [cb31b9449a708664] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:fe-extension-spi from build cache [INFO] Local build found by checksum cb31b9449a708664 [INFO] Found cached build, restoring org.apache.doris:fe-extension-spi from cache by checksum cb31b9449a708664 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------< org.apache.doris:fe-extension-loader >---------------- [INFO] Building Doris FE Extension Loader 1.2-SNAPSHOT [6/30] [INFO] from fe-extension-loader/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-extension-loader [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-loader, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 8 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-spi, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [caccb4cb682888b5] calculated in 3 ms. [INFO] Attempting to restore project org.apache.doris:fe-extension-loader from build cache [INFO] Local build found by checksum caccb4cb682888b5 [INFO] Found cached build, restoring org.apache.doris:fe-extension-loader from cache by checksum caccb4cb682888b5 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------------< org.apache.doris:fe-thrift >--------------------- [INFO] Building Doris FE Generated Thrift RPC 1.2-SNAPSHOT [7/30] [INFO] from fe-thrift/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-thrift [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-thrift, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 781 input files. Project dir processing: 24, plugins: 1 millis [INFO] Project inputs calculated in 28 ms. XX checksum [1fc72c8ffeb7ac7e] calculated in 97 ms. [INFO] Attempting to restore project org.apache.doris:fe-thrift from build cache [INFO] Local build found by checksum 1fc72c8ffeb7ac7e [INFO] Found cached build, restoring org.apache.doris:fe-thrift from cache by checksum 1fc72c8ffeb7ac7e [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------------< org.apache.doris:fe-type >---------------------- [INFO] Building Doris FE Catalog Type 1.2-SNAPSHOT [8/30] [INFO] from fe-type/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-type [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-type, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 16 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-thrift, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 3 ms. XX checksum [c88ba09e3a35b4da] calculated in 4 ms. [INFO] Attempting to restore project org.apache.doris:fe-type from build cache [INFO] Local build found by checksum c88ba09e3a35b4da [INFO] Found cached build, restoring org.apache.doris:fe-type from cache by checksum c88ba09e3a35b4da [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): jar:test-jar [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------------< org.apache.doris:fe-core >---------------------- [INFO] Building Doris FE Core 1.2-SNAPSHOT [9/30] [INFO] from fe-core/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-core [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-core, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 5988 input files. Project dir processing: 303, plugins: 4 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-foundation, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-thrift, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-type, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-catalog, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-spi, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-loader, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 332 ms. XX checksum [bebcecbad7ccad2d] calculated in 958 ms. [INFO] Attempting to restore project org.apache.doris:fe-core from build cache [INFO] Local build found by checksum bebcecbad7ccad2d [INFO] Found cached build, restoring org.apache.doris:fe-core from cache by checksum bebcecbad7ccad2d [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): clean:clean [INFO] Skipping plugin execution (cached): antlr4:antlr4 [INFO] Skipping plugin execution (cached): protoc-jar:run [INFO] Skipping plugin execution (cached): exec:exec [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): build-helper:add-source [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------------< org.apache.doris:hive-udf >---------------------- [INFO] Building hive-udf 1.2-SNAPSHOT [10/30] [INFO] from hive-udf/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:hive-udf [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=hive-udf, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 13 input files. Project dir processing: 3, plugins: 1 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 5 ms. XX checksum [b7bc024ec834a82f] calculated in 3 ms. [INFO] Attempting to restore project org.apache.doris:hive-udf from build cache [INFO] Local build found by checksum b7bc024ec834a82f [INFO] Found cached build, restoring org.apache.doris:hive-udf from cache by checksum b7bc024ec834a82f [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------< org.apache.doris:be-java-extensions >----------------- [INFO] Building be-java-extensions 1.2-SNAPSHOT [11/30] [INFO] from be-java-extensions/pom.xml [INFO] --------------------------------[ pom ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:be-java-extensions [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=be-java-extensions, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 1 ms. XX checksum [0d6f98691f4ea56a] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:be-java-extensions from build cache [INFO] Local build found by checksum 0d6f98691f4ea56a [INFO] Found cached build, restoring org.apache.doris:be-java-extensions from cache by checksum 0d6f98691f4ea56a [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] [INFO] --------------------< org.apache.doris:java-common >-------------------- [INFO] Building java-common 1.2-SNAPSHOT [12/30] [INFO] from be-java-extensions/java-common/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:java-common [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 33 input files. Project dir processing: 2, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-common, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-type, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 3 ms. XX checksum [c2480266da574aa0] calculated in 6 ms. [INFO] Attempting to restore project org.apache.doris:java-common from build cache [INFO] Local build found by checksum c2480266da574aa0 [INFO] Found cached build, restoring org.apache.doris:java-common from cache by checksum c2480266da574aa0 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -------------< org.apache.doris:iceberg-metadata-scanner >-------------- [INFO] Building iceberg-metadata-scanner 1.2-SNAPSHOT [13/30] [INFO] from be-java-extensions/iceberg-metadata-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:iceberg-metadata-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=iceberg-metadata-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 4 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [b8b85b70a18c0ab4] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:iceberg-metadata-scanner from build cache [INFO] Local build found by checksum b8b85b70a18c0ab4 [INFO] Found cached build, restoring org.apache.doris:iceberg-metadata-scanner from cache by checksum b8b85b70a18c0ab4 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] --------------------< org.apache.doris:hadoop-deps >-------------------- [INFO] Building hadoop-deps 1.2-SNAPSHOT [14/30] [INFO] from be-java-extensions/hadoop-deps/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:hadoop-deps [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=hadoop-deps, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 0 input files. Project dir processing: 0, plugins: 2 millis [INFO] Project inputs calculated in 2 ms. XX checksum [c7a6f7d8ee01f64b] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:hadoop-deps from build cache [INFO] Local build found by checksum c7a6f7d8ee01f64b [INFO] Found cached build, restoring org.apache.doris:hadoop-deps from cache by checksum c7a6f7d8ee01f64b [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------< org.apache.doris:hadoop-hudi-scanner >---------------- [INFO] Building hadoop-hudi-scanner 1.2-SNAPSHOT [15/30] [INFO] from be-java-extensions/hadoop-hudi-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:hadoop-hudi-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=hadoop-hudi-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 3 input files. Project dir processing: 0, plugins: 1 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=hadoop-deps, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [3c7f51e9a425b0b5] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:hadoop-hudi-scanner from build cache [INFO] Local build found by checksum 3c7f51e9a425b0b5 [INFO] Found cached build, restoring org.apache.doris:hadoop-hudi-scanner from cache by checksum 3c7f51e9a425b0b5 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------------< org.apache.doris:java-udf >---------------------- [INFO] Building java-udf 1.2-SNAPSHOT [16/30] [INFO] from be-java-extensions/java-udf/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:java-udf [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-udf, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 10 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 3 ms. XX checksum [de3dcd120d77eb95] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:java-udf from build cache [INFO] Local build found by checksum de3dcd120d77eb95 [INFO] Found cached build, restoring org.apache.doris:java-udf from cache by checksum de3dcd120d77eb95 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -------------------< org.apache.doris:jdbc-scanner >-------------------- [INFO] Building jdbc-scanner 1.2-SNAPSHOT [17/30] [INFO] from be-java-extensions/jdbc-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:jdbc-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=jdbc-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 31 input files. Project dir processing: 2, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 4 ms. XX checksum [902164b8976c0f43] calculated in 6 ms. [INFO] Attempting to restore project org.apache.doris:jdbc-scanner from build cache [INFO] Local build found by checksum 902164b8976c0f43 [INFO] Found cached build, restoring org.apache.doris:jdbc-scanner from cache by checksum 902164b8976c0f43 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ------------------< org.apache.doris:paimon-scanner >------------------- [INFO] Building paimon-scanner 1.2-SNAPSHOT [18/30] [INFO] from be-java-extensions/paimon-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:paimon-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=paimon-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 5 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [f73cdb044ff0d6c1] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:paimon-scanner from build cache [INFO] Local build found by checksum f73cdb044ff0d6c1 [INFO] Found cached build, restoring org.apache.doris:paimon-scanner from cache by checksum f73cdb044ff0d6c1 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------< org.apache.doris:max-compute-connector >--------------- [INFO] Building max-compute-connector 1.2-SNAPSHOT [19/30] [INFO] from be-java-extensions/max-compute-connector/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:max-compute-connector [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=max-compute-connector, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 4 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [3fb4a819ed790f01] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:max-compute-connector from build cache [INFO] Local build found by checksum 3fb4a819ed790f01 [INFO] Found cached build, restoring org.apache.doris:max-compute-connector from cache by checksum 3fb4a819ed790f01 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -------------------< org.apache.doris:avro-scanner >-------------------- [INFO] Building avro-scanner 1.2-SNAPSHOT [20/30] [INFO] from be-java-extensions/avro-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:avro-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=avro-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 11 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 3 ms. XX checksum [21a2c9700e73bdae] calculated in 2 ms. [INFO] Attempting to restore project org.apache.doris:avro-scanner from build cache [INFO] Local build found by checksum 21a2c9700e73bdae [INFO] Found cached build, restoring org.apache.doris:avro-scanner from cache by checksum 21a2c9700e73bdae [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ----------------< org.apache.doris:preload-extensions >----------------- [INFO] Building preload-extensions 1.2-SNAPSHOT [21/30] [INFO] from be-java-extensions/preload-extensions/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:preload-extensions [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=preload-extensions, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 1 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 1 ms. XX checksum [e30ef30306b68d9b] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:preload-extensions from build cache [INFO] Local build found by checksum e30ef30306b68d9b [INFO] Found cached build, restoring org.apache.doris:preload-extensions from cache by checksum e30ef30306b68d9b [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] --------------< org.apache.doris:trino-connector-scanner >-------------- [INFO] Building trino-connector-scanner 1.2-SNAPSHOT [22/30] [INFO] from be-java-extensions/trino-connector-scanner/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:trino-connector-scanner [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=trino-connector-scanner, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 7 input files. Project dir processing: 1, plugins: 1 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=preload-extensions, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [6f4f3eb08f1352d5] calculated in 1 ms. [INFO] Attempting to restore project org.apache.doris:trino-connector-scanner from build cache [INFO] Local build found by checksum 6f4f3eb08f1352d5 [INFO] Found cached build, restoring org.apache.doris:trino-connector-scanner from cache by checksum 6f4f3eb08f1352d5 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] --------------------< org.apache.doris:java-writer >-------------------- [INFO] Building java-writer 1.2-SNAPSHOT [23/30] [INFO] from be-java-extensions/java-writer/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:java-writer [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-writer, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 2 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=java-common, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [fe706afb45ec2db6] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:java-writer from build cache [INFO] Local build found by checksum fe706afb45ec2db6 [INFO] Found cached build, restoring org.apache.doris:java-writer from cache by checksum fe706afb45ec2db6 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -----------------< org.apache.doris:fe-authentication >----------------- [INFO] Building Doris FE Authentication 1.2-SNAPSHOT [24/30] [INFO] from fe-authentication/pom.xml [INFO] --------------------------------[ pom ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 1 ms. XX checksum [ac55b96edac4cf93] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication from build cache [INFO] Local build found by checksum ac55b96edac4cf93 [INFO] Found cached build, restoring org.apache.doris:fe-authentication from cache by checksum ac55b96edac4cf93 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] [INFO] ---------------< org.apache.doris:fe-authentication-api >--------------- [INFO] Building Doris FE Authentication API 1.2-SNAPSHOT [25/30] [INFO] from fe-authentication/fe-authentication-api/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-api [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-api, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 13 input files. Project dir processing: 1, plugins: 0 millis [INFO] Project inputs calculated in 2 ms. XX checksum [fa8f67313bbe6940] calculated in 3 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-api from build cache [INFO] Local build found by checksum fa8f67313bbe6940 [INFO] Found cached build, restoring org.apache.doris:fe-authentication-api from cache by checksum fa8f67313bbe6940 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] ---------------< org.apache.doris:fe-authentication-spi >--------------- [INFO] Building Doris FE Authentication SPI 1.2-SNAPSHOT [26/30] [INFO] from fe-authentication/fe-authentication-spi/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-spi [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-spi, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 4 input files. Project dir processing: 1, plugins: 1 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-api, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-spi, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [34f9bb5e98365c50] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-spi from build cache [INFO] Local build found by checksum 34f9bb5e98365c50 [INFO] Found cached build, restoring org.apache.doris:fe-authentication-spi from cache by checksum 34f9bb5e98365c50 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -------------< org.apache.doris:fe-authentication-plugins >------------- [INFO] Building Doris FE Authentication Plugins 1.2-SNAPSHOT [27/30] [INFO] from fe-authentication/fe-authentication-plugins/pom.xml [INFO] --------------------------------[ pom ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-plugins [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-plugins, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 0 ms. XX checksum [ef0e62e1c6805c3c] calculated in 0 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-plugins from build cache [INFO] Local build found by checksum ef0e62e1c6805c3c [INFO] Found cached build, restoring org.apache.doris:fe-authentication-plugins from cache by checksum ef0e62e1c6805c3c [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] [INFO] ---------< org.apache.doris:fe-authentication-plugin-password >--------- [INFO] Building Doris FE - Authentication Plugin - Password 1.2-SNAPSHOT [28/30] [INFO] from fe-authentication/fe-authentication-plugins/fe-authentication-plugin-password/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-plugin-password [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-plugin-password, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 7 input files. Project dir processing: 3, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-api, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-spi, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 3 ms. XX checksum [e4a1ca6e865f3dbf] calculated in 2 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-plugin-password from build cache [INFO] Local build found by checksum e4a1ca6e865f3dbf [INFO] Found cached build, restoring org.apache.doris:fe-authentication-plugin-password from cache by checksum e4a1ca6e865f3dbf [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -------------< org.apache.doris:fe-authentication-handler >------------- [INFO] Building Doris FE Authentication Handler 1.2-SNAPSHOT [29/30] [INFO] from fe-authentication/fe-authentication-handler/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-handler [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-handler, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 12 input files. Project dir processing: 1, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-api, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-spi, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-loader, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-extension-spi, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-plugin-password, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [314644fbe2f4e1b0] calculated in 2 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-handler from build cache [INFO] Local build found by checksum 314644fbe2f4e1b0 [INFO] Found cached build, restoring org.apache.doris:fe-authentication-handler from cache by checksum 314644fbe2f4e1b0 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] [INFO] -----------< org.apache.doris:fe-authentication-plugin-ldap >----------- [INFO] Building Doris FE - Authentication Plugin - LDAP 1.2-SNAPSHOT [30/30] [INFO] from fe-authentication/fe-authentication-plugins/fe-authentication-plugin-ldap/pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] Cache is INITIALIZED on project level for org.apache.doris:fe-authentication-plugin-ldap [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-plugin-ldap, version=1.2-SNAPSHOT] [INFO] Scanning plugins configurations to find input files. Probing is enabled, values will be checked for presence in file system [INFO] Found 10 input files. Project dir processing: 2, plugins: 0 millis [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-api, version=1.2-SNAPSHOT] [INFO] Going to calculate checksum for project [groupId=org.apache.doris, artifactId=fe-authentication-spi, version=1.2-SNAPSHOT] [INFO] Project inputs calculated in 2 ms. XX checksum [5fe491460ef58cb7] calculated in 5 ms. [INFO] Attempting to restore project org.apache.doris:fe-authentication-plugin-ldap from build cache [INFO] Local build found by checksum 5fe491460ef58cb7 [INFO] Found cached build, restoring org.apache.doris:fe-authentication-plugin-ldap from cache by checksum 5fe491460ef58cb7 [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): enforcer:enforce [INFO] Skipping plugin execution (cached): checkstyle:check [INFO] Skipping plugin execution (cached): directory:directory-of [INFO] Skipping plugin execution (cached): jacoco:prepare-agent [INFO] Skipping plugin execution (cached): remote-resources:process [INFO] Skipping plugin execution (cached): license:add-third-party [INFO] Skipping plugin execution (cached): resources:resources [INFO] Skipping plugin execution (cached): flatten:flatten [INFO] Skipping plugin execution (cached): compiler:compile [INFO] Skipping plugin execution (cached): resources:testResources [INFO] Skipping plugin execution (cached): compiler:testCompile [INFO] Skipping plugin execution (cached): surefire:test [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for Doris FE Project Parent POM 1.2-SNAPSHOT: [INFO] [INFO] Doris FE Project Parent POM ........................ SUCCESS [ 1.191 s] [INFO] Doris FE Foundation ................................ SUCCESS [ 0.262 s] [INFO] Doris FE Common Utils .............................. SUCCESS [ 0.086 s] [INFO] Doris FE Catalog API ............................... SUCCESS [ 0.018 s] [INFO] Doris FE Extension SPI ............................. SUCCESS [ 0.014 s] [INFO] Doris FE Extension Loader .......................... SUCCESS [ 0.016 s] [INFO] Doris FE Generated Thrift RPC ...................... SUCCESS [ 0.151 s] [INFO] Doris FE Catalog Type .............................. SUCCESS [ 0.018 s] [INFO] Doris FE Core ...................................... SUCCESS [ 4.364 s] [INFO] hive-udf ........................................... SUCCESS [ 0.024 s] [INFO] be-java-extensions ................................. SUCCESS [ 0.004 s] [INFO] java-common ........................................ SUCCESS [ 0.031 s] [INFO] iceberg-metadata-scanner ........................... SUCCESS [ 0.011 s] [INFO] hadoop-deps ........................................ SUCCESS [ 0.008 s] [INFO] hadoop-hudi-scanner ................................ SUCCESS [ 0.010 s] [INFO] java-udf ........................................... SUCCESS [ 0.021 s] [INFO] jdbc-scanner ....................................... SUCCESS [ 0.039 s] [INFO] paimon-scanner ..................................... SUCCESS [ 0.016 s] [INFO] max-compute-connector .............................. SUCCESS [ 0.012 s] [INFO] avro-scanner ....................................... SUCCESS [ 0.015 s] [INFO] preload-extensions ................................. SUCCESS [ 0.009 s] [INFO] trino-connector-scanner ............................ SUCCESS [ 0.015 s] [INFO] java-writer ........................................ SUCCESS [ 0.010 s] [INFO] Doris FE Authentication ............................ SUCCESS [ 0.004 s] [INFO] Doris FE Authentication API ........................ SUCCESS [ 0.015 s] [INFO] Doris FE Authentication SPI ........................ SUCCESS [ 0.008 s] [INFO] Doris FE Authentication Plugins .................... SUCCESS [ 0.003 s] [INFO] Doris FE - Authentication Plugin - Password ........ SUCCESS [ 0.013 s] [INFO] Doris FE Authentication Handler .................... SUCCESS [ 0.013 s] [INFO] Doris FE - Authentication Plugin - LDAP ............ SUCCESS [ 0.016 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.072 s [INFO] Finished at: 2026-03-20T18:25:48+08:00 [INFO] ------------------------------------------------------------------------; the run entered the FE build/test flow but the final result was not observed in this environment - Behavior changed: No - Does this need documentation: No --- .../hive/ThriftHMSCachedClient.java | 33 ++++-- .../hive/ThriftHMSCachedClientTest.java | 106 ++++++------------ 2 files changed, 61 insertions(+), 78 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java index 212723c69bcac9..1867925a0a40c7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java @@ -96,11 +96,18 @@ public class ThriftHMSCachedClient implements HMSCachedClient { private volatile boolean isClosed = false; private final HiveConf hiveConf; private final ExecutionAuthenticator executionAuthenticator; + private final MetaStoreClientProvider metaStoreClientProvider; public ThriftHMSCachedClient(HiveConf hiveConf, int poolSize, ExecutionAuthenticator executionAuthenticator) { + this(hiveConf, poolSize, executionAuthenticator, new DefaultMetaStoreClientProvider()); + } + + ThriftHMSCachedClient(HiveConf hiveConf, int poolSize, ExecutionAuthenticator executionAuthenticator, + MetaStoreClientProvider metaStoreClientProvider) { Preconditions.checkArgument(poolSize > 0, poolSize); this.hiveConf = hiveConf; this.executionAuthenticator = executionAuthenticator; + this.metaStoreClientProvider = Preconditions.checkNotNull(metaStoreClientProvider, "metaStoreClientProvider"); this.clientPool = new GenericObjectPool<>(new ThriftHMSClientFactory(), createPoolConfig(poolSize)); } @@ -658,17 +665,14 @@ private GenericObjectPoolConfig createPoolConfig(int poolSize) { return config; } - private IMetaStoreClient createHiveMetastoreClient() throws MetaException { + static String getMetastoreClientClassName(HiveConf hiveConf) { String type = hiveConf.get(HMSBaseProperties.HIVE_METASTORE_TYPE); if (HMSBaseProperties.DLF_TYPE.equalsIgnoreCase(type)) { - return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - ProxyMetaStoreClient.class.getName()); + return ProxyMetaStoreClient.class.getName(); } else if (HMSBaseProperties.GLUE_TYPE.equalsIgnoreCase(type)) { - return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - AWSCatalogMetastoreClient.class.getName()); + return AWSCatalogMetastoreClient.class.getName(); } else { - return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, - HiveMetaStoreClient.class.getName()); + return HiveMetaStoreClient.class.getName(); } } @@ -685,7 +689,8 @@ private T withSystemClassLoader(PrivilegedExceptionAction action) throws private class ThriftHMSClientFactory extends BasePooledObjectFactory { @Override public ThriftHMSClient create() throws Exception { - return withSystemClassLoader(() -> ugiDoAs(() -> new ThriftHMSClient(createHiveMetastoreClient()))); + return withSystemClassLoader(() -> ugiDoAs( + () -> new ThriftHMSClient(metaStoreClientProvider.create(hiveConf)))); } @Override @@ -761,6 +766,18 @@ private ThriftHMSClient getClient() { } } + interface MetaStoreClientProvider { + IMetaStoreClient create(HiveConf hiveConf) throws MetaException; + } + + private static class DefaultMetaStoreClientProvider implements MetaStoreClientProvider { + @Override + public IMetaStoreClient create(HiveConf hiveConf) throws MetaException { + return RetryingMetaStoreClient.getProxy(hiveConf, DUMMY_HOOK_LOADER, + getMetastoreClientClassName(hiveConf)); + } + } + @Override public String getCatalogLocation(String catalogName) { try (ThriftHMSClient client = getClient()) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java index 6c4e06e557e89a..697f5dd4fb6914 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java @@ -23,16 +23,10 @@ import org.apache.doris.datasource.property.metastore.HMSBaseProperties; import org.apache.doris.info.TableNameInfo; -import com.aliyun.datalake.metastore.hive2.ProxyMetaStoreClient; -import com.amazonaws.glue.catalog.metastore.AWSCatalogMetastoreClient; -import mockit.Mock; -import mockit.MockUp; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.hadoop.hive.conf.HiveConf; -import org.apache.hadoop.hive.metastore.HiveMetaHookLoader; import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; import org.apache.hadoop.hive.metastore.IMetaStoreClient; -import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.LockResponse; import org.apache.hadoop.hive.metastore.api.LockState; @@ -42,13 +36,14 @@ import org.junit.Before; import org.junit.Test; +import com.aliyun.datalake.metastore.hive2.ProxyMetaStoreClient; +import com.amazonaws.glue.catalog.metastore.AWSCatalogMetastoreClient; + import java.lang.reflect.Proxy; import java.util.ArrayDeque; import java.util.Collections; import java.util.Deque; import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -56,17 +51,11 @@ import java.util.concurrent.atomic.AtomicInteger; public class ThriftHMSCachedClientTest { - private MockMetastoreController controller; + private MockMetastoreClientProvider provider; @Before public void setUp() { - controller = new MockMetastoreController(); - new MockUp() { - @Mock - public IMetaStoreClient getProxy(HiveConf hiveConf, HiveMetaHookLoader hookLoader, String mscClassName) { - return controller.createClient(mscClassName); - } - }; + provider = new MockMetastoreClientProvider(); } @Test @@ -89,8 +78,8 @@ public void testReturnObjectToPool() throws Exception { Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); - Assert.assertEquals(1, controller.createdClients.get()); - Assert.assertEquals(0, controller.closedClients.get()); + Assert.assertEquals(1, provider.createdClients.get()); + Assert.assertEquals(0, provider.closedClients.get()); Object secondBorrowed = borrowClient(cachedClient); Assert.assertSame(firstBorrowed, secondBorrowed); @@ -107,12 +96,12 @@ public void testInvalidateBrokenObject() throws Exception { Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); - Assert.assertEquals(1, controller.createdClients.get()); - Assert.assertEquals(1, controller.closedClients.get()); + Assert.assertEquals(1, provider.createdClients.get()); + Assert.assertEquals(1, provider.closedClients.get()); Object nextBorrowed = borrowClient(cachedClient); Assert.assertNotSame(brokenBorrowed, nextBorrowed); - Assert.assertEquals(2, controller.createdClients.get()); + Assert.assertEquals(2, provider.createdClients.get()); closeBorrowed(nextBorrowed); } @@ -146,7 +135,7 @@ public void testCloseDestroysIdleObjectsAndRejectsBorrow() throws Exception { cachedClient.close(); Assert.assertTrue(getPool(cachedClient).isClosed()); - Assert.assertEquals(1, controller.closedClients.get()); + Assert.assertEquals(1, provider.closedClients.get()); Assert.assertThrows(IllegalStateException.class, () -> borrowClient(cachedClient)); } @@ -156,49 +145,27 @@ public void testCloseWhileObjectBorrowedClosesClientOnReturn() throws Exception Object borrowed = borrowClient(cachedClient); cachedClient.close(); - Assert.assertEquals(0, controller.closedClients.get()); + Assert.assertEquals(0, provider.closedClients.get()); closeBorrowed(borrowed); - Assert.assertEquals(1, controller.closedClients.get()); + Assert.assertEquals(1, provider.closedClients.get()); Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); } @Test - public void testDefaultMetastoreTypeUsesHiveClient() throws Exception { - ThriftHMSCachedClient cachedClient = newClient(1); - - Object borrowed = borrowClient(cachedClient); - closeBorrowed(borrowed); - - Assert.assertEquals(Collections.singletonList(HiveMetaStoreClient.class.getName()), - controller.requestedClientClassNames); - } - - @Test - public void testGlueMetastoreTypeUsesGlueClient() throws Exception { + public void testGetMetastoreClientClassName() { HiveConf hiveConf = new HiveConf(); - hiveConf.set(HMSBaseProperties.HIVE_METASTORE_TYPE, HMSBaseProperties.GLUE_TYPE); - ThriftHMSCachedClient cachedClient = newClient(hiveConf, 1); + Assert.assertEquals(HiveMetaStoreClient.class.getName(), + ThriftHMSCachedClient.getMetastoreClientClassName(hiveConf)); - Object borrowed = borrowClient(cachedClient); - closeBorrowed(borrowed); - - Assert.assertEquals(Collections.singletonList(AWSCatalogMetastoreClient.class.getName()), - controller.requestedClientClassNames); - } + hiveConf.set(HMSBaseProperties.HIVE_METASTORE_TYPE, HMSBaseProperties.GLUE_TYPE); + Assert.assertEquals(AWSCatalogMetastoreClient.class.getName(), + ThriftHMSCachedClient.getMetastoreClientClassName(hiveConf)); - @Test - public void testDlfMetastoreTypeUsesDlfClient() throws Exception { - HiveConf hiveConf = new HiveConf(); hiveConf.set(HMSBaseProperties.HIVE_METASTORE_TYPE, HMSBaseProperties.DLF_TYPE); - ThriftHMSCachedClient cachedClient = newClient(hiveConf, 1); - - Object borrowed = borrowClient(cachedClient); - closeBorrowed(borrowed); - - Assert.assertEquals(Collections.singletonList(ProxyMetaStoreClient.class.getName()), - controller.requestedClientClassNames); + Assert.assertEquals(ProxyMetaStoreClient.class.getName(), + ThriftHMSCachedClient.getMetastoreClientClassName(hiveConf)); } @Test @@ -207,29 +174,29 @@ public void testUpdateTableStatisticsDoesNotBorrowSecondClient() { cachedClient.updateTableStatistics("db1", "tbl1", statistics -> statistics); - Assert.assertEquals(1, controller.createdClients.get()); + Assert.assertEquals(1, provider.createdClients.get()); Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); } @Test public void testAcquireSharedLockDoesNotBorrowSecondClient() { - controller.lockStates.add(LockState.WAITING); - controller.lockStates.add(LockState.ACQUIRED); + provider.lockStates.add(LockState.WAITING); + provider.lockStates.add(LockState.ACQUIRED); ThriftHMSCachedClient cachedClient = newClient(1); cachedClient.acquireSharedLock("query-1", 1L, "user", new TableNameInfo("db1", "tbl1"), Collections.emptyList(), 5_000L); - Assert.assertEquals(1, controller.createdClients.get()); - Assert.assertEquals(1, controller.checkLockCalls.get()); + Assert.assertEquals(1, provider.createdClients.get()); + Assert.assertEquals(1, provider.checkLockCalls.get()); Assert.assertEquals(1, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); } @Test public void testUpdatePartitionStatisticsInvalidatesFailedClient() throws Exception { - controller.alterPartitionFailure = new RuntimeException("alter partition failed"); + provider.alterPartitionFailure = new RuntimeException("alter partition failed"); ThriftHMSCachedClient cachedClient = newClient(1); RuntimeException exception = Assert.assertThrows(RuntimeException.class, @@ -240,7 +207,7 @@ public void testUpdatePartitionStatisticsInvalidatesFailedClient() throws Except @Test public void testAddPartitionsInvalidatesFailedClient() throws Exception { - controller.addPartitionsFailure = new RuntimeException("add partitions failed"); + provider.addPartitionsFailure = new RuntimeException("add partitions failed"); ThriftHMSCachedClient cachedClient = newClient(1); RuntimeException exception = Assert.assertThrows(RuntimeException.class, @@ -251,7 +218,7 @@ public void testAddPartitionsInvalidatesFailedClient() throws Exception { @Test public void testDropPartitionInvalidatesFailedClient() throws Exception { - controller.dropPartitionFailure = new RuntimeException("drop partition failed"); + provider.dropPartitionFailure = new RuntimeException("drop partition failed"); ThriftHMSCachedClient cachedClient = newClient(1); RuntimeException exception = Assert.assertThrows(RuntimeException.class, @@ -263,11 +230,11 @@ public void testDropPartitionInvalidatesFailedClient() throws Exception { private void assertBrokenBorrowerIsNotReused(ThriftHMSCachedClient cachedClient) throws Exception { Assert.assertEquals(0, getPool(cachedClient).getNumIdle()); Assert.assertEquals(0, getPool(cachedClient).getNumActive()); - Assert.assertEquals(1, controller.createdClients.get()); - Assert.assertEquals(1, controller.closedClients.get()); + Assert.assertEquals(1, provider.createdClients.get()); + Assert.assertEquals(1, provider.closedClients.get()); Object nextBorrowed = borrowClient(cachedClient); - Assert.assertEquals(2, controller.createdClients.get()); + Assert.assertEquals(2, provider.createdClients.get()); closeBorrowed(nextBorrowed); } @@ -277,7 +244,7 @@ private ThriftHMSCachedClient newClient(int poolSize) { private ThriftHMSCachedClient newClient(HiveConf hiveConf, int poolSize) { return new ThriftHMSCachedClient(hiveConf, poolSize, new ExecutionAuthenticator() { - }); + }, provider); } private GenericObjectPool getPool(ThriftHMSCachedClient cachedClient) { @@ -310,19 +277,18 @@ private HivePartitionWithStatistics newPartitionWithStatistics() { return new HivePartitionWithStatistics("k1=v1", partition, HivePartitionStatistics.EMPTY); } - private static class MockMetastoreController { + private static class MockMetastoreClientProvider implements ThriftHMSCachedClient.MetaStoreClientProvider { private final AtomicInteger createdClients = new AtomicInteger(); private final AtomicInteger closedClients = new AtomicInteger(); private final AtomicInteger checkLockCalls = new AtomicInteger(); - private final List requestedClientClassNames = new CopyOnWriteArrayList<>(); private final Deque lockStates = new ArrayDeque<>(); private volatile RuntimeException alterPartitionFailure; private volatile RuntimeException addPartitionsFailure; private volatile RuntimeException dropPartitionFailure; - private IMetaStoreClient createClient(String mscClassName) { - requestedClientClassNames.add(mscClassName); + @Override + public IMetaStoreClient create(HiveConf hiveConf) { createdClients.incrementAndGet(); return (IMetaStoreClient) Proxy.newProxyInstance( IMetaStoreClient.class.getClassLoader(), From 646122534716d57f591a1e88ddb45b74229eb345 Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 18:30:56 +0800 Subject: [PATCH 5/6] [doc](fe) Clarify HMS client provider test seam ### What problem does this PR solve? Issue Number: N/A Related PR: #61553 Problem Summary: Add a comment to clarify that MetaStoreClientProvider is introduced as an injectable seam for unit tests so ThriftHMSCachedClient tests can focus on Doris-side pool behavior without coupling to Hive static client construction. ### Release note None ### Check List (For Author) - Test: No need to test (comment-only change) - Behavior changed: No - Does this need documentation: No --- .../org/apache/doris/datasource/hive/ThriftHMSCachedClient.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java index 1867925a0a40c7..310ae901c4b1c4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/ThriftHMSCachedClient.java @@ -766,6 +766,8 @@ private ThriftHMSClient getClient() { } } + // Keep the HMS client creation behind an injectable seam so unit tests can verify + // Doris-side pool behavior without relying on Hive static construction internals. interface MetaStoreClientProvider { IMetaStoreClient create(HiveConf hiveConf) throws MetaException; } From 08793bd3c07203e16b9ea494bd03e237f9fe6eee Mon Sep 17 00:00:00 2001 From: Socrates Date: Fri, 20 Mar 2026 18:52:22 +0800 Subject: [PATCH 6/6] fix --- .../doris/datasource/hive/ThriftHMSCachedClientTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java index 697f5dd4fb6914..f1e65a07d5d59a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java @@ -23,6 +23,8 @@ import org.apache.doris.datasource.property.metastore.HMSBaseProperties; import org.apache.doris.info.TableNameInfo; +import com.aliyun.datalake.metastore.hive2.ProxyMetaStoreClient; +import com.amazonaws.glue.catalog.metastore.AWSCatalogMetastoreClient; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; @@ -36,9 +38,6 @@ import org.junit.Before; import org.junit.Test; -import com.aliyun.datalake.metastore.hive2.ProxyMetaStoreClient; -import com.amazonaws.glue.catalog.metastore.AWSCatalogMetastoreClient; - import java.lang.reflect.Proxy; import java.util.ArrayDeque; import java.util.Collections;