This is an automated email from the ASF dual-hosted git repository. dataroaring pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new a0b2195ca08 branch-3.0: [fix](vault) fix `CreateTableLikeStmt` cannot work in stoarge vault mode #46625 (#46654) a0b2195ca08 is described below commit a0b2195ca082d899d8db9526253bae8a0b29b652 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> AuthorDate: Mon Jan 13 21:36:52 2025 +0800 branch-3.0: [fix](vault) fix `CreateTableLikeStmt` cannot work in stoarge vault mode #46625 (#46654) Cherry-picked from #46625 Co-authored-by: Lei Zhang <zhang...@selectdb.com> --- .../apache/doris/common/util/PropertyAnalyzer.java | 45 ++++++++++++++++++++-- .../apache/doris/datasource/InternalCatalog.java | 42 +++++--------------- .../test_vault_privilege_with_role.groovy | 20 +++++----- 3 files changed, 60 insertions(+), 47 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java index e093c3db13d..2548f8142c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java @@ -34,6 +34,7 @@ import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; +import org.apache.doris.common.Pair; import org.apache.doris.datasource.CatalogIf; import org.apache.doris.datasource.CatalogMgr; import org.apache.doris.datasource.ExternalCatalog; @@ -1177,14 +1178,50 @@ public class PropertyAnalyzer { return storagePolicy; } - public static String analyzeStorageVault(Map<String, String> properties) { - String storageVault = null; + /** + * @param properties + * @return <storageVaultName, storageVaultId> + * @throws AnalysisException + */ + public static Pair<String, String> analyzeStorageVault(Map<String, String> properties) throws AnalysisException { + String storageVaultName = null; if (properties != null && properties.containsKey(PROPERTIES_STORAGE_VAULT_NAME)) { - storageVault = properties.get(PROPERTIES_STORAGE_VAULT_NAME); + storageVaultName = properties.get(PROPERTIES_STORAGE_VAULT_NAME); properties.remove(PROPERTIES_STORAGE_VAULT_NAME); } - return storageVault; + if (Strings.isNullOrEmpty(storageVaultName)) { + // If user does not specify one storage vault then FE would use the default vault + Pair<String, String> info = Env.getCurrentEnv().getStorageVaultMgr().getDefaultStorageVault(); + if (info == null) { + throw new AnalysisException("No default storage vault." + + " You can use `SHOW STORAGE VAULT` to get all available vaults," + + " and pick one set default vault with `SET <vault_name> AS DEFAULT STORAGE VAULT`"); + } + storageVaultName = info.first; + LOG.info("Using default storage vault, name:{} id:{}", info.first, info.second); + } + + if (Strings.isNullOrEmpty(storageVaultName)) { + throw new AnalysisException("Invalid Storage Vault. " + + " You can use `SHOW STORAGE VAULT` to get all available vaults," + + " and pick one to set the table property `\"storage_vault_name\" = \"<vault_name>\"`"); + } + + String storageVaultId = Env.getCurrentEnv().getStorageVaultMgr().getVaultIdByName(storageVaultName); + if (Strings.isNullOrEmpty(storageVaultId)) { + throw new AnalysisException("Storage vault '" + storageVaultName + "' does not exist. " + + "You can use `SHOW STORAGE VAULT` to get all available vaults, " + + "or create a new one with `CREATE STORAGE VAULT`."); + } + + if (properties != null && properties.containsKey(PROPERTIES_STORAGE_VAULT_ID)) { + Preconditions.checkArgument(storageVaultId.equals(properties.get(PROPERTIES_STORAGE_VAULT_ID)), + "storageVaultId check failed, %s-%s", storageVaultId, properties.get(PROPERTIES_STORAGE_VAULT_ID)); + properties.remove(PROPERTIES_STORAGE_VAULT_ID); + } + + return Pair.of(storageVaultName, storageVaultId); } // analyze property like : "type" = "xxx"; diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java index dbae2993416..55fa51ebc47 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java @@ -2728,44 +2728,20 @@ public class InternalCatalog implements CatalogIf<Database> { olapTable.setEnableSingleReplicaCompaction(enableSingleReplicaCompaction); if (Config.isCloudMode() && ((CloudEnv) env).getEnableStorageVault()) { - // set storage vault - String storageVaultName = PropertyAnalyzer.analyzeStorageVault(properties); - String storageVaultId = null; - // If user does not specify one storage vault then FE would use the default vault - if (Strings.isNullOrEmpty(storageVaultName)) { - Pair<String, String> info = env.getStorageVaultMgr().getDefaultStorageVault(); - if (info != null) { - storageVaultName = info.first; - storageVaultId = info.second; - LOG.info("Using default storage vault: name={}, id={}", storageVaultName, storageVaultId); - } else { - throw new DdlException("No default storage vault." - + " You can use `SHOW STORAGE VAULT` to get all available vaults," - + " and pick one set default vault with `SET <vault_name> AS DEFAULT STORAGE VAULT`"); - } - } - - if (storageVaultName == null || storageVaultName.isEmpty()) { - throw new DdlException("Invalid Storage Vault. " - + " You can use `SHOW STORAGE VAULT` to get all available vaults," - + " and pick one to set the table property `\"storage_vault_name\" = \"<vault_name>\"`"); - } + // <storageVaultName, storageVaultId> + Pair<String, String> storageVaultInfoPair = PropertyAnalyzer.analyzeStorageVault(properties); // Check if user has storage vault usage privilege - if (ctx != null && !env.getAuth() - .checkStorageVaultPriv(ctx.getCurrentUserIdentity(), storageVaultName, PrivPredicate.USAGE)) { + if (ConnectContext.get() != null && !env.getAuth() + .checkStorageVaultPriv(ctx.getCurrentUserIdentity(), + storageVaultInfoPair.first, PrivPredicate.USAGE)) { throw new DdlException("USAGE denied to user '" + ConnectContext.get().getQualifiedUser() + "'@'" + ConnectContext.get().getRemoteIP() - + "' for storage vault '" + storageVaultName + "'"); - } - - storageVaultId = env.getStorageVaultMgr().getVaultIdByName(storageVaultName); - if (Strings.isNullOrEmpty(storageVaultId)) { - throw new DdlException("Storage vault '" + storageVaultName + "' does not exist. " - + "You can use `SHOW STORAGE VAULT` to get all available vaults, " - + "or create a new one with `CREATE STORAGE VAULT`."); + + "' for storage vault '" + storageVaultInfoPair.first + "'"); } - olapTable.setStorageVaultId(storageVaultId); + Preconditions.checkArgument(StringUtils.isNumeric(storageVaultInfoPair.second), + "Invaild storage vault id :%s", storageVaultInfoPair.second); + olapTable.setStorageVaultId(storageVaultInfoPair.second); } // check `update on current_timestamp` diff --git a/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy b/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy index 54cace642d4..7192dc40aed 100644 --- a/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy +++ b/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy @@ -46,6 +46,16 @@ suite("test_vault_privilege_with_role", "nonConcurrent") { sql """CREATE USER ${userName} identified by '${userPassword}' DEFAULT ROLE '${roleName}'""" sql """GRANT create_priv ON *.*.* TO '${userName}'; """ + sql """ + CREATE STORAGE VAULT ${hdfsVaultName} + PROPERTIES ( + "type"="HDFS", + "fs.defaultFS"="${getHmsHdfsFs()}", + "path_prefix" = "${hdfsVaultName}", + "hadoop.username" = "${getHmsUser()}" + ); + """ + connect(userName, userPassword, context.config.jdbcUrl) { expectExceptionLike({ sql """ @@ -65,16 +75,6 @@ suite("test_vault_privilege_with_role", "nonConcurrent") { sql """ GRANT usage_priv ON STORAGE VAULT '${hdfsVaultName}' TO ROLE '${roleName}';""" - sql """ - CREATE STORAGE VAULT ${hdfsVaultName} - PROPERTIES ( - "type"="HDFS", - "fs.defaultFS"="${getHmsHdfsFs()}", - "path_prefix" = "${hdfsVaultName}", - "hadoop.username" = "${getHmsUser()}" - ); - """ - connect(userName, userPassword, context.config.jdbcUrl) { sql """ CREATE TABLE IF NOT EXISTS ${dbName}.${tableName} ( --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org