This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 087fc596b1 [feature] add remote storage policy config for create table properties (#10159) 087fc596b1 is described below commit 087fc596b111ebeab38726841c2bdc7733961e1e Author: pengxiangyu <diablo...@163.com> AuthorDate: Mon Jun 20 12:42:23 2022 +0800 [feature] add remote storage policy config for create table properties (#10159) Add remote storage policy config for create table properties. It will set storage policy for table and partitions in `CREATE TABLE` and `ALTER TABLE`. This policy will be used when partition is being migrated from local to remote. grammy: 1. `CREATE TABLE TblPxy1 (...) ENGINE=olap DISTRIBUTED BY HASH (aa) BUCKETS 1 PROPERTIES( "remote_storage_policy" = "testPolicy3" );` 2. `ALTER TABLE TblPxy01 SET ("remote_storage_policy" = "testPolicy3");` 3. `ALTER TABLE TblPxy01 MODIFY PARTITION p2 SET ("remote_storage_policy" = "testPolicy3");` --- .../Data-Definition-Statements/Drop/DROP-POLICY.md | 24 ++++-- .../Data-Definition-Statements/Drop/DROP-POLICY.md | 10 +++ .../main/java/org/apache/doris/alter/Alter.java | 9 +- .../apache/doris/alter/SchemaChangeHandler.java | 4 + .../doris/analysis/ModifyPartitionClause.java | 11 +-- .../analysis/ModifyTablePropertiesClause.java | 4 +- .../java/org/apache/doris/catalog/Catalog.java | 10 +-- .../org/apache/doris/catalog/DataProperty.java | 41 ++++----- .../java/org/apache/doris/catalog/OlapTable.java | 20 +++-- .../java/org/apache/doris/catalog/ResourceMgr.java | 41 ++------- .../org/apache/doris/catalog/TableProperty.java | 21 +++-- .../doris/common/proc/PartitionsProcDir.java | 6 +- .../apache/doris/common/util/PropertyAnalyzer.java | 99 +++++++++++----------- .../doris/datasource/InternalDataSource.java | 5 +- .../org/apache/doris/policy/DropPolicyLog.java | 20 +++-- .../java/org/apache/doris/policy/PolicyMgr.java | 30 ++++++- .../org/apache/doris/policy/StoragePolicy.java | 10 ++- .../java/org/apache/doris/alter/AlterTest.java | 56 ++++++------ .../org/apache/doris/catalog/DataPropertyTest.java | 4 +- 19 files changed, 231 insertions(+), 194 deletions(-) diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md similarity index 72% copy from docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md copy to docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md index 2e8d2e96a8..38c553a3e9 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md +++ b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md @@ -1,7 +1,7 @@ --- { - "title": "DROP-POLICY", - "language": "zh-CN" + "title": "DROP-MATERIALIZED-VIEW", + "language": "en" } --- @@ -32,30 +32,40 @@ DROP POLICY ### Description -删除安全策略 +drop policy for row or storage -#### 行安全策略 +#### ROW POLICY -语法: +Grammar: +1. Drop row policy ```sql DROP ROW POLICY test_row_policy_1 on table1 [FOR user]; ``` +2. Drop storage policy +```sql +DROP STORAGE POLICY policy_name1 +``` + ### Example -1. 删除 table1 的 test_row_policy_1 +1. Drop the row policy for table1 named test_row_policy_1 ```sql DROP ROW POLICY test_row_policy_1 on table1 ``` -2. 删除 table1 作用于 test 的 test_row_policy_1 行安全策略 +2. Drop the row policy for table1 using by user test ```sql DROP ROW POLICY test_row_policy_1 on table1 for test ``` +3. Drop the storage policy named policy_name1 + ```sql + DROP STORAGE POLICY policy_name1 + ``` ### Keywords DROP, POLICY diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md index 2e8d2e96a8..4a15088e53 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY.md @@ -38,10 +38,16 @@ DROP POLICY 语法: +1. 删除行安全策略 ```sql DROP ROW POLICY test_row_policy_1 on table1 [FOR user]; ``` +2. 删除冷热数据存储策略 +```sql +DROP STORAGE POLICY policy_name1 +``` + ### Example 1. 删除 table1 的 test_row_policy_1 @@ -56,6 +62,10 @@ DROP ROW POLICY test_row_policy_1 on table1 [FOR user]; DROP ROW POLICY test_row_policy_1 on table1 for test ``` +3. 删除 policy_name1 对应的冷热数据存储策略 + ```sql + DROP STORAGE POLICY policy_name1 + ``` ### Keywords DROP, POLICY diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java index a11537eb33..e4da3cb4e3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java @@ -690,14 +690,11 @@ public class Alter { DateLiteral dateLiteral = new DateLiteral(dataProperty.getCooldownTimeMs(), TimeUtils.getTimeZone(), Type.DATETIME); newProperties.put(PropertyAnalyzer.PROPERTIES_STORAGE_COOLDOWN_TIME, dateLiteral.getStringValue()); - newProperties.put(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE, - dataProperty.getRemoteStorageResourceName()); - DateLiteral dateLiteral1 = new DateLiteral(dataProperty.getRemoteCooldownTimeMs(), - TimeUtils.getTimeZone(), Type.DATETIME); - newProperties.put(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_COOLDOWN_TIME, dateLiteral1.getStringValue()); + newProperties.put(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY, dataProperty.getRemoteStoragePolicy()); newProperties.putAll(properties); // 4.3 analyze new properties - DataProperty newDataProperty = PropertyAnalyzer.analyzeDataProperty(newProperties, null); + DataProperty newDataProperty = + PropertyAnalyzer.analyzeDataProperty(newProperties, DataProperty.DEFAULT_DATA_PROPERTY); // 1. date property if (newDataProperty != null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index 6329834d59..433812d6d1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -1532,6 +1532,10 @@ public class SchemaChangeHandler extends AlterHandler { } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_REPLICATION_ALLOCATION)) { Catalog.getCurrentCatalog().modifyTableReplicaAllocation(db, olapTable, properties); return; + } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY)) { + olapTable.setRemoteStoragePolicy( + properties.get(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY)); + return; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyPartitionClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyPartitionClause.java index 72aa81d24b..6656730419 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyPartitionClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyPartitionClause.java @@ -96,18 +96,13 @@ public class ModifyPartitionClause extends AlterTableClause { // 3. in_memory // 4. tablet type private void checkProperties(Map<String, String> properties) throws AnalysisException { - // 1. data property, can not modify partition property remote_storage_resource - if (properties.containsKey(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE)) { - throw new AnalysisException("Do not support modify partition data property `remote_storage_resource`."); - } - - // 2. replica allocation + // 1. replica allocation PropertyAnalyzer.analyzeReplicaAllocation(properties, ""); - // 3. in memory + // 2. in memory PropertyAnalyzer.analyzeBooleanProp(properties, PropertyAnalyzer.PROPERTIES_INMEMORY, false); - // 4. tablet type + // 3. tablet type PropertyAnalyzer.analyzeTabletType(properties); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyTablePropertiesClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyTablePropertiesClause.java index d91b770ec9..a56f2fbae3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyTablePropertiesClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyTablePropertiesClause.java @@ -87,10 +87,10 @@ public class ModifyTablePropertiesClause extends AlterTableClause { } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_INMEMORY)) { this.needTableStable = false; this.opType = AlterOpType.MODIFY_TABLE_PROPERTY_SYNC; + } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY)) { + // do nothing, just check valid. } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_TABLET_TYPE)) { throw new AnalysisException("Alter tablet type not supported"); - } else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE)) { - throw new AnalysisException("Alter table remote_storage_resource is not supported."); } else { throw new AnalysisException("Unknown table property: " + properties.keySet()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java index 9bf9608a45..8f9660760f 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java @@ -2853,11 +2853,11 @@ public class Catalog { sb.append(",\n\"").append(PropertyAnalyzer.PROPERTIES_STORAGE_FORMAT).append("\" = \""); sb.append(olapTable.getStorageFormat()).append("\""); - // remote storage resource - String remoteStorageResource = olapTable.getRemoteStorageResource(); - if (!Strings.isNullOrEmpty(remoteStorageResource)) { - sb.append(",\n\"").append(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE).append("\" = \""); - sb.append(remoteStorageResource).append("\""); + // remote storage + String remoteStoragePolicy = olapTable.getRemoteStoragePolicy(); + if (!Strings.isNullOrEmpty(remoteStoragePolicy)) { + sb.append(",\n\"").append(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY).append("\" = \""); + sb.append(remoteStoragePolicy).append("\""); } // compression type if (olapTable.getCompressionType() != TCompressionType.LZ4F) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/DataProperty.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/DataProperty.java index 5340e7a89d..5af708384d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/DataProperty.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/DataProperty.java @@ -42,10 +42,8 @@ public class DataProperty implements Writable { private TStorageMedium storageMedium; @SerializedName(value = "cooldownTimeMs") private long cooldownTimeMs; - @SerializedName(value = "remoteStorageResourceName") - private String remoteStorageResourceName; - @SerializedName(value = "remoteCooldownTimeMs") - private long remoteCooldownTimeMs; + @SerializedName(value = "remoteStoragePolicy") + private String remoteStoragePolicy; private DataProperty() { // for persist @@ -59,16 +57,20 @@ public class DataProperty implements Writable { } else { this.cooldownTimeMs = MAX_COOLDOWN_TIME_MS; } - this.remoteStorageResourceName = ""; - this.remoteCooldownTimeMs = MAX_COOLDOWN_TIME_MS; + this.remoteStoragePolicy = ""; } - public DataProperty(TStorageMedium medium, long cooldown, - String remoteStorageResourceName, long remoteCooldownTimeMs) { + /** + * DataProperty construction. + * + * @param medium storage medium for the init storage of the table + * @param cooldown cool down time for SSD->HDD + * @param remoteStoragePolicy remote storage policy for remote storage + */ + public DataProperty(TStorageMedium medium, long cooldown, String remoteStoragePolicy) { this.storageMedium = medium; this.cooldownTimeMs = cooldown; - this.remoteStorageResourceName = remoteStorageResourceName; - this.remoteCooldownTimeMs = remoteCooldownTimeMs; + this.remoteStoragePolicy = remoteStoragePolicy; } public TStorageMedium getStorageMedium() { @@ -79,12 +81,8 @@ public class DataProperty implements Writable { return cooldownTimeMs; } - public long getRemoteCooldownTimeMs() { - return remoteCooldownTimeMs; - } - - public String getRemoteStorageResourceName() { - return remoteStorageResourceName; + public String getRemoteStoragePolicy() { + return remoteStoragePolicy; } public static DataProperty read(DataInput in) throws IOException { @@ -106,13 +104,12 @@ public class DataProperty implements Writable { public void readFields(DataInput in) throws IOException { storageMedium = TStorageMedium.valueOf(Text.readString(in)); cooldownTimeMs = in.readLong(); - remoteStorageResourceName = ""; - remoteCooldownTimeMs = MAX_COOLDOWN_TIME_MS; + remoteStoragePolicy = ""; } @Override public int hashCode() { - return Objects.hash(storageMedium, cooldownTimeMs, remoteStorageResourceName, remoteCooldownTimeMs); + return Objects.hash(storageMedium, cooldownTimeMs, remoteStoragePolicy); } @Override @@ -129,8 +126,7 @@ public class DataProperty implements Writable { return this.storageMedium == other.storageMedium && this.cooldownTimeMs == other.cooldownTimeMs - && this.remoteCooldownTimeMs == other.remoteCooldownTimeMs - && this.remoteStorageResourceName.equals(other.remoteStorageResourceName); + && this.remoteStoragePolicy.equals(other.remoteStoragePolicy); } @Override @@ -138,8 +134,7 @@ public class DataProperty implements Writable { StringBuilder sb = new StringBuilder(); sb.append("Storage medium[").append(this.storageMedium).append("]. "); sb.append("cool down[").append(TimeUtils.longToTimeString(cooldownTimeMs)).append("]. "); - sb.append("remote storage resource name[").append(this.remoteStorageResourceName).append("]. "); - sb.append("remote cool down[").append(TimeUtils.longToTimeString(remoteCooldownTimeMs)).append("]."); + sb.append("remote storage policy[").append(this.remoteStoragePolicy).append("]. "); return sb.toString(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index a117762274..80ab60064d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -1547,12 +1547,17 @@ public class OlapTable extends Table { tableProperty.buildDataSortInfo(); } - public void setRemoteStorageResource(String resourceName) { + /** + * set remote storage policy for table. + * + * @param remoteStoragePolicy remote storage policy name + */ + public void setRemoteStoragePolicy(String remoteStoragePolicy) { if (tableProperty == null) { tableProperty = new TableProperty(new HashMap<>()); } - tableProperty.setRemoteStorageResource(resourceName); - tableProperty.buildRemoteStorageResource(); + tableProperty.setRemoteStoragePolicy(remoteStoragePolicy); + tableProperty.buildRemoteStoragePolicy(); } // return true if partition with given name already exist, both in partitions and temp partitions. @@ -1722,11 +1727,16 @@ public class OlapTable extends Table { return tableProperty.getDataSortInfo(); } - public String getRemoteStorageResource() { + /** + * get remote storage policy name. + * + * @return remote storage policy name for this table. + */ + public String getRemoteStoragePolicy() { if (tableProperty == null) { return ""; } - return tableProperty.getRemoteStorageResource(); + return tableProperty.getRemoteStoragePolicy(); } // For non partitioned table: diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ResourceMgr.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ResourceMgr.java index d7d57272ab..6f9537392b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ResourceMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ResourceMgr.java @@ -31,6 +31,9 @@ import org.apache.doris.common.proc.ProcResult; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.persist.DropResourceOperationLog; import org.apache.doris.persist.gson.GsonUtils; +import org.apache.doris.policy.Policy; +import org.apache.doris.policy.PolicyTypeEnum; +import org.apache.doris.policy.StoragePolicy; import org.apache.doris.qe.ConnectContext; import com.google.common.collect.ImmutableList; @@ -43,10 +46,8 @@ import org.apache.logging.log4j.Logger; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; /** @@ -99,36 +100,12 @@ public class ResourceMgr implements Writable { throw new DdlException("Resource(" + resourceName + ") does not exist"); } // Check whether the resource is in use before deleting it, except spark resource - List<String> usedTables = new ArrayList<>(); - List<Long> dbIds = Catalog.getCurrentCatalog().getDbIds(); - for (Long dbId : dbIds) { - Optional<Database> database = Catalog.getCurrentCatalog().getDb(dbId); - database.ifPresent(db -> { - List<Table> tables = db.getTablesOnIdOrder(); - for (Table table : tables) { - if (table instanceof OdbcTable) { - // odbc resource - if (resourceName.equals(((OdbcTable) table).getOdbcCatalogResourceName())) { - usedTables.add(db.getFullName() + "." + table.getName()); - } - } else if (table instanceof OlapTable) { - // remote resource, such as s3 resource - PartitionInfo partitionInfo = ((OlapTable) table).getPartitionInfo(); - List<Long> partitionIds = ((OlapTable) table).getPartitionIds(); - for (Long partitionId : partitionIds) { - DataProperty dataProperty = partitionInfo.getDataProperty(partitionId); - if (resourceName.equals(dataProperty.getRemoteStorageResourceName())) { - usedTables.add(db.getFullName() + "." + table.getName()); - break; - } - } - } - } - }); - } - if (usedTables.size() > 0) { - LOG.warn("Can not drop resource, since it's used in tables {}", usedTables); - throw new DdlException("Can not drop resource, since it's used in tables " + usedTables); + StoragePolicy checkedStoragePolicy = new StoragePolicy(PolicyTypeEnum.STORAGE, null); + checkedStoragePolicy.setStorageResource(resourceName); + if (Catalog.getCurrentCatalog().getPolicyMgr().existPolicy(checkedStoragePolicy)) { + Policy policy = Catalog.getCurrentCatalog().getPolicyMgr().getPolicy(checkedStoragePolicy); + LOG.warn("Can not drop resource, since it's used in policy {}", policy.getPolicyName()); + throw new DdlException("Can not drop resource, since it's used in policy " + policy.getPolicyName()); } nameToResource.remove(resourceName); // log drop diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java index fd70e718e9..049fea9fcf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java @@ -72,8 +72,8 @@ public class TableProperty implements Writable { private DataSortInfo dataSortInfo = new DataSortInfo(); - // remote storage resource, for cold data - private String remoteStorageResource; + // remote storage policy, for cold data + private String remoteStoragePolicy; public TableProperty(Map<String, String> properties) { this.properties = properties; @@ -162,8 +162,8 @@ public class TableProperty implements Writable { return this; } - public TableProperty buildRemoteStorageResource() { - remoteStorageResource = properties.getOrDefault(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE, ""); + public TableProperty buildRemoteStoragePolicy() { + remoteStoragePolicy = properties.getOrDefault(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY, ""); return this; } @@ -184,10 +184,9 @@ public class TableProperty implements Writable { replicaAlloc.toCreateStmt()); } - public void setRemoteStorageResource(String resourceName) { - this.remoteStorageResource = resourceName; - properties.put(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_RESOURCE, - resourceName); + public void setRemoteStoragePolicy(String remotePolicyName) { + this.remoteStoragePolicy = remotePolicyName; + properties.put(PropertyAnalyzer.PROPERTIES_REMOTE_STORAGE_POLICY, remotePolicyName); } public ReplicaAllocation getReplicaAllocation() { @@ -232,8 +231,8 @@ public class TableProperty implements Writable { return dataSortInfo; } - public String getRemoteStorageResource() { - return remoteStorageResource; + public String getRemoteStoragePolicy() { + return remoteStoragePolicy; } public TCompressionType getCompressionType() { @@ -264,7 +263,7 @@ public class TableProperty implements Writable { .buildInMemory() .buildStorageFormat() .buildDataSortInfo() - .buildRemoteStorageResource() + .buildRemoteStoragePolicy() .buildCompressionType(); if (Catalog.getCurrentCatalogJournalVersion() < FeMetaVersion.VERSION_105) { // get replica num from property map and create replica allocation diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java index c29a8cbfd4..5a6c4261ea 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java @@ -66,8 +66,7 @@ public class PartitionsProcDir implements ProcDirInterface { .add("PartitionId").add("PartitionName") .add("VisibleVersion").add("VisibleVersionTime") .add("State").add("PartitionKey").add("Range").add("DistributionKey") - .add("Buckets").add("ReplicationNum").add("StorageMedium").add("CooldownTime") - .add("RemoteStorageResource").add("RemoteStorageCooldownTime") + .add("Buckets").add("ReplicationNum").add("StorageMedium").add("CooldownTime").add("RemoteStoragePolicy") .add("LastConsistencyCheckTime").add("DataSize").add("IsInMemory").add("ReplicaAllocation") .build(); @@ -273,8 +272,7 @@ public class PartitionsProcDir implements ProcDirInterface { DataProperty dataProperty = tblPartitionInfo.getDataProperty(partitionId); partitionInfo.add(dataProperty.getStorageMedium().name()); partitionInfo.add(TimeUtils.longToTimeString(dataProperty.getCooldownTimeMs())); - partitionInfo.add(dataProperty.getRemoteStorageResourceName()); - partitionInfo.add(TimeUtils.longToTimeString(dataProperty.getRemoteCooldownTimeMs())); + partitionInfo.add(dataProperty.getRemoteStoragePolicy()); partitionInfo.add(TimeUtils.longToTimeString(partition.getLastCheckTime())); 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 88ac119aeb..84b29b9803 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 @@ -26,11 +26,13 @@ import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.ReplicaAllocation; -import org.apache.doris.catalog.Resource; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; +import org.apache.doris.policy.Policy; +import org.apache.doris.policy.PolicyTypeEnum; +import org.apache.doris.policy.StoragePolicy; import org.apache.doris.resource.Tag; import org.apache.doris.thrift.TCompressionType; import org.apache.doris.thrift.TSortType; @@ -50,8 +52,6 @@ import java.util.Map; import java.util.Set; public class PropertyAnalyzer { - private static final Logger LOG = LogManager.getLogger(PropertyAnalyzer.class); - private static final String COMMA_SEPARATOR = ","; public static final String PROPERTIES_SHORT_KEY = "short_key"; public static final String PROPERTIES_REPLICATION_NUM = "replication_num"; @@ -59,7 +59,6 @@ public class PropertyAnalyzer { public static final String PROPERTIES_STORAGE_TYPE = "storage_type"; public static final String PROPERTIES_STORAGE_MEDIUM = "storage_medium"; public static final String PROPERTIES_STORAGE_COOLDOWN_TIME = "storage_cooldown_time"; - public static final String PROPERTIES_REMOTE_STORAGE_COOLDOWN_TIME = "remote_storage_cooldown_time"; // for 1.x -> 2.x migration public static final String PROPERTIES_VERSION_INFO = "version_info"; // for restore @@ -67,8 +66,6 @@ public class PropertyAnalyzer { public static final String PROPERTIES_BF_COLUMNS = "bloom_filter_columns"; public static final String PROPERTIES_BF_FPP = "bloom_filter_fpp"; - private static final double MAX_FPP = 0.05; - private static final double MIN_FPP = 0.0001; public static final String PROPERTIES_COLUMN_SEPARATOR = "column_separator"; public static final String PROPERTIES_LINE_DELIMITER = "line_delimiter"; @@ -89,7 +86,7 @@ public class PropertyAnalyzer { public static final String PROPERTIES_INMEMORY = "in_memory"; - public static final String PROPERTIES_REMOTE_STORAGE_RESOURCE = "remote_storage_resource"; + public static final String PROPERTIES_REMOTE_STORAGE_POLICY = "remote_storage_policy"; public static final String PROPERTIES_TABLET_TYPE = "tablet_type"; @@ -109,6 +106,11 @@ public class PropertyAnalyzer { public static final String PROPERTIES_DISABLE_LOAD = "disable_load"; + private static final Logger LOG = LogManager.getLogger(PropertyAnalyzer.class); + private static final String COMMA_SEPARATOR = ","; + private static final double MAX_FPP = 0.05; + private static final double MIN_FPP = 0.0001; + public static DataProperty analyzeDataProperty(Map<String, String> properties, DataProperty oldDataProperty) throws AnalysisException { if (properties == null || properties.isEmpty()) { @@ -117,13 +119,11 @@ public class PropertyAnalyzer { TStorageMedium storageMedium = null; long cooldownTimeStamp = DataProperty.MAX_COOLDOWN_TIME_MS; - String remoteStorageResourceName = ""; - long remoteCooldownTimeStamp = DataProperty.MAX_COOLDOWN_TIME_MS; + String remoteStoragePolicy = ""; boolean hasMedium = false; boolean hasCooldown = false; - boolean hasRemoteStorageResource = false; - boolean hasRemoteCooldown = false; + boolean hasRemoteStoragePolicy = false; for (Map.Entry<String, String> entry : properties.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); @@ -142,31 +142,23 @@ public class PropertyAnalyzer { if (cooldownTimeStamp != DataProperty.MAX_COOLDOWN_TIME_MS) { hasCooldown = true; } - } else if (!hasRemoteStorageResource && key.equalsIgnoreCase(PROPERTIES_REMOTE_STORAGE_RESOURCE)) { + } else if (!hasRemoteStoragePolicy && key.equalsIgnoreCase(PROPERTIES_REMOTE_STORAGE_POLICY)) { if (!Strings.isNullOrEmpty(value)) { - hasRemoteStorageResource = true; - remoteStorageResourceName = value; - } - } else if (!hasRemoteCooldown && key.equalsIgnoreCase(PROPERTIES_REMOTE_STORAGE_COOLDOWN_TIME)) { - DateLiteral dateLiteral = new DateLiteral(value, Type.DATETIME); - remoteCooldownTimeStamp = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); - if (remoteCooldownTimeStamp != DataProperty.MAX_COOLDOWN_TIME_MS) { - hasRemoteCooldown = true; + hasRemoteStoragePolicy = true; + remoteStoragePolicy = value; } } } // end for properties // Check properties - if (!hasCooldown && !hasMedium) { + if (!hasCooldown && !hasMedium && !hasRemoteStoragePolicy) { return oldDataProperty; } properties.remove(PROPERTIES_STORAGE_MEDIUM); properties.remove(PROPERTIES_STORAGE_COOLDOWN_TIME); - properties.remove(PROPERTIES_REMOTE_STORAGE_RESOURCE); - properties.remove(PROPERTIES_REMOTE_STORAGE_COOLDOWN_TIME); - + properties.remove(PROPERTIES_REMOTE_STORAGE_POLICY); if (hasCooldown && !hasMedium) { throw new AnalysisException("Invalid data property. storage medium property is not found"); @@ -190,30 +182,28 @@ public class PropertyAnalyzer { cooldownTimeStamp = currentTimeMs + Config.storage_cooldown_second * 1000L; } - // check remote_storage_resource and remote_storage_cooldown_time - if ((!hasRemoteCooldown && hasRemoteStorageResource) || (hasRemoteCooldown && !hasRemoteStorageResource)) { - throw new AnalysisException("Invalid data property, " - + "`remote_storage_resource` and `remote_storage_cooldown_time` must be used together."); - } - if (hasRemoteStorageResource && hasRemoteCooldown) { + if (hasRemoteStoragePolicy) { // check remote resource - Resource resource = Catalog.getCurrentCatalog().getResourceMgr().getResource(remoteStorageResourceName); - if (resource == null) { - throw new AnalysisException("Invalid data property, " - + "`remote_storage_resource` [" + remoteStorageResourceName + "] dose not exist."); + StoragePolicy checkedPolicy = new StoragePolicy(PolicyTypeEnum.STORAGE, remoteStoragePolicy); + Policy policy = Catalog.getCurrentCatalog().getPolicyMgr().getPolicy(checkedPolicy); + if (!(policy instanceof StoragePolicy)) { + throw new AnalysisException("No PolicyStorage: " + remoteStoragePolicy); } + StoragePolicy storagePolicy = (StoragePolicy) policy; // check remote storage cool down timestamp - if (remoteCooldownTimeStamp <= currentTimeMs) { - throw new AnalysisException("Remote storage cool down time should later than now"); - } - if (hasCooldown && (remoteCooldownTimeStamp <= cooldownTimeStamp)) { - throw new AnalysisException( - "`remote_storage_cooldown_time` should later than `storage_cooldown_time`."); + if (storagePolicy.getCooldownDatetime() != null) { + if (storagePolicy.getCooldownDatetime().getTime() <= currentTimeMs) { + throw new AnalysisException("Remote storage cool down time should later than now"); + } + if (hasCooldown && (storagePolicy.getCooldownDatetime().getTime() <= cooldownTimeStamp)) { + throw new AnalysisException("`remote_storage_cooldown_time`" + + " should later than `storage_cooldown_time`."); + } } } Preconditions.checkNotNull(storageMedium); - return new DataProperty(storageMedium, cooldownTimeStamp, remoteStorageResourceName, remoteCooldownTimeStamp); + return new DataProperty(storageMedium, cooldownTimeStamp, remoteStoragePolicy); } public static short analyzeShortKeyColumnCount(Map<String, String> properties) throws AnalysisException { @@ -501,19 +491,26 @@ public class PropertyAnalyzer { return defaultVal; } - // analyze remote storage resource - public static String analyzeRemoteStorageResource(Map<String, String> properties) throws AnalysisException { - String resourceName = ""; - if (properties != null && properties.containsKey(PROPERTIES_REMOTE_STORAGE_RESOURCE)) { - resourceName = properties.get(PROPERTIES_REMOTE_STORAGE_RESOURCE); - // check resource existence - Resource resource = Catalog.getCurrentCatalog().getResourceMgr().getResource(resourceName); - if (resource == null) { - throw new AnalysisException("Resource does not exist, name: " + resourceName); + /** + * analyze remote storage policy. + * + * @param properties property for table + * @return remote storage policy name + * @throws AnalysisException policy name doesn't exist + */ + public static String analyzeRemoteStoragePolicy(Map<String, String> properties) throws AnalysisException { + String remoteStoragePolicy = ""; + if (properties != null && properties.containsKey(PROPERTIES_REMOTE_STORAGE_POLICY)) { + remoteStoragePolicy = properties.get(PROPERTIES_REMOTE_STORAGE_POLICY); + // check remote storage policy existence + StoragePolicy checkedStoragePolicy = new StoragePolicy(PolicyTypeEnum.STORAGE, remoteStoragePolicy); + Policy policy = Catalog.getCurrentCatalog().getPolicyMgr().getPolicy(checkedStoragePolicy); + if (!(policy instanceof StoragePolicy)) { + throw new AnalysisException("StoragePolicy: " + remoteStoragePolicy + " does not exist."); } } - return resourceName; + return remoteStoragePolicy; } // analyze property like : "type" = "xxx"; diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java index d9c4c711bb..fccf262082 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java @@ -1828,8 +1828,8 @@ public class InternalDataSource implements DataSourceIf { olapTable.setIsInMemory(isInMemory); // set remote storage - String resourceName = PropertyAnalyzer.analyzeRemoteStorageResource(properties); - olapTable.setRemoteStorageResource(resourceName); + String remoteStoragePolicy = PropertyAnalyzer.analyzeRemoteStoragePolicy(properties); + olapTable.setRemoteStoragePolicy(remoteStoragePolicy); TTabletType tabletType; try { @@ -1838,7 +1838,6 @@ public class InternalDataSource implements DataSourceIf { throw new DdlException(e.getMessage()); } - if (partitionInfo.getType() == PartitionType.UNPARTITIONED) { // if this is an unpartitioned table, we should analyze data property and replication num here. // if this is a partitioned table, there properties are already analyzed diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java b/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java index 90fb824e15..04f854fd84 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java @@ -62,13 +62,21 @@ public class DropPolicyLog implements Writable { * Generate delete logs through stmt. **/ public static DropPolicyLog fromDropStmt(DropPolicyStmt stmt) throws AnalysisException { - String curDb = stmt.getTableName().getDb(); - if (curDb == null) { - curDb = ConnectContext.get().getDatabase(); + switch (stmt.getType()) { + case STORAGE: + return new DropPolicyLog(-1, -1, stmt.getType(), stmt.getPolicyName(), null); + case ROW: + String curDb = stmt.getTableName().getDb(); + if (curDb == null) { + curDb = ConnectContext.get().getDatabase(); + } + Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(curDb); + Table table = db.getTableOrAnalysisException(stmt.getTableName().getTbl()); + return new DropPolicyLog(db.getId(), table.getId(), stmt.getType(), + stmt.getPolicyName(), stmt.getUser()); + default: + throw new AnalysisException("Invalid policy type: " + stmt.getType().name()); } - Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(curDb); - Table table = db.getTableOrAnalysisException(stmt.getTableName().getTbl()); - return new DropPolicyLog(db.getId(), table.getId(), stmt.getType(), stmt.getPolicyName(), stmt.getUser()); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java index bb72d75c48..af21632168 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java @@ -136,16 +136,44 @@ public class PolicyMgr implements Writable { return userPolicySet.contains(user); } - private boolean existPolicy(Policy checkedPolicy) { + /** + * Check whether the policy exist. + * + * @param checkedPolicy policy condition to check + * @return exist or not + */ + public boolean existPolicy(Policy checkedPolicy) { List<Policy> policies = getPoliciesByType(checkedPolicy.getType()); return policies.stream().anyMatch(policy -> policy.matchPolicy(checkedPolicy)); } + /** + * CCheck whether the policy exist for the DropPolicyLog. + * + * @param checkedDropPolicy policy log condition to check + * @return exist or not + */ private boolean existPolicy(DropPolicyLog checkedDropPolicy) { List<Policy> policies = getPoliciesByType(checkedDropPolicy.getType()); return policies.stream().anyMatch(policy -> policy.matchPolicy(checkedDropPolicy)); } + /** + * Get policy by type and name. + * + * @param checkedPolicy condition to get policy + * @return Policy in typeToPolicyMap + */ + public Policy getPolicy(Policy checkedPolicy) { + List<Policy> policies = getPoliciesByType(checkedPolicy.getType()); + for (Policy policy : policies) { + if (policy.matchPolicy(checkedPolicy)) { + return policy; + } + } + return null; + } + private List<Policy> getPoliciesByType(PolicyTypeEnum policyType) { if (typeToPolicyMap == null) { return new ArrayList<>(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/StoragePolicy.java b/fe/fe-core/src/main/java/org/apache/doris/policy/StoragePolicy.java index c5a48c4a7e..e6a1ef7c1a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/policy/StoragePolicy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/policy/StoragePolicy.java @@ -147,8 +147,12 @@ public class StoragePolicy extends Policy { props = Catalog.getCurrentCatalog().getResourceMgr().getResource(this.storageResource).toString(); } SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String cooldownDatetimeStr = ""; + if (this.cooldownDatetime != null) { + cooldownDatetimeStr = df.format(this.cooldownDatetime); + } return Lists.newArrayList(this.policyName, this.type.name(), this.storageResource, - df.format(this.cooldownDatetime), this.cooldownTtl, props); + cooldownDatetimeStr, this.cooldownTtl, props); } @Override @@ -166,7 +170,9 @@ public class StoragePolicy extends Policy { return false; } StoragePolicy storagePolicy = (StoragePolicy) checkedPolicyCondition; - return checkMatched(storagePolicy.getType(), storagePolicy.getPolicyName()); + return (storagePolicy.getStorageResource() == null + || storagePolicy.getStorageResource().equals(this.storageResource)) + && checkMatched(storagePolicy.getType(), storagePolicy.getPolicyName()); } @Override diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java index 85c7ba577c..e6cdb5fee4 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java @@ -19,6 +19,7 @@ package org.apache.doris.alter; import org.apache.doris.analysis.AlterTableStmt; import org.apache.doris.analysis.CreateDbStmt; +import org.apache.doris.analysis.CreatePolicyStmt; import org.apache.doris.analysis.CreateResourceStmt; import org.apache.doris.analysis.CreateTableStmt; import org.apache.doris.analysis.DateLiteral; @@ -198,6 +199,18 @@ public class AlterTest { + " \"s3_connection_timeout_ms\" = \"1000\"\n" + ");"); + createRemoteStoragePolicy("CREATE STORAGE POLICY testPolicy\n" + + "PROPERTIES(\n" + + " \"storage_resource\" = \"remote_s3\",\n" + + " \"cooldown_datetime\" = \"2100-05-10 00:00:00\"\n" + + ");"); + + createRemoteStoragePolicy("CREATE STORAGE POLICY testPolicy2\n" + + "PROPERTIES(\n" + + " \"storage_resource\" = \"remote_s3\",\n" + + " \"cooldown_ttl\" = \"1d\"\n" + + ");"); + createTable("CREATE TABLE test.tbl_remote\n" + "(\n" + " k1 date,\n" @@ -217,9 +230,8 @@ public class AlterTest { + " 'replication_num' = '1',\n" + " 'in_memory' = 'false',\n" + " 'storage_medium' = 'SSD',\n" - + " 'storage_cooldown_time' = '2122-04-01 20:24:00',\n" - + " 'remote_storage_resource' = 'remote_s3',\n" - + " 'remote_storage_cooldown_time' = '2122-12-01 20:23:00'" + + " 'storage_cooldown_time' = '2100-05-09 00:00:00',\n" + + " 'remote_storage_policy' = 'testPolicy'\n" + ");"); } @@ -239,6 +251,11 @@ public class AlterTest { Catalog.getCurrentCatalog().getResourceMgr().createResource(stmt); } + private static void createRemoteStoragePolicy(String sql) throws Exception { + CreatePolicyStmt stmt = (CreatePolicyStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext); + Catalog.getCurrentCatalog().getPolicyMgr().createPolicy(stmt); + } + private static void alterTable(String sql, boolean expectedException) throws Exception { try { AlterTableStmt alterTableStmt = (AlterTableStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext); @@ -447,13 +464,13 @@ public class AlterTest { stmt = "alter table test.tbl4 modify partition (p3, p4) set ('storage_medium' = 'HDD')"; DateLiteral dateLiteral = new DateLiteral("2999-12-31 00:00:00", Type.DATETIME); long cooldownTimeMs = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); - DataProperty oldDataProperty = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, "", DataProperty.MAX_COOLDOWN_TIME_MS); + DataProperty oldDataProperty = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, ""); partitionList = Lists.newArrayList(p3, p4); for (Partition partition : partitionList) { Assert.assertEquals(oldDataProperty, tbl4.getPartitionInfo().getDataProperty(partition.getId())); } alterTable(stmt, false); - DataProperty newDataProperty = new DataProperty(TStorageMedium.HDD, DataProperty.MAX_COOLDOWN_TIME_MS, "", DataProperty.MAX_COOLDOWN_TIME_MS); + DataProperty newDataProperty = new DataProperty(TStorageMedium.HDD, DataProperty.MAX_COOLDOWN_TIME_MS, ""); for (Partition partition : partitionList) { Assert.assertEquals(newDataProperty, tbl4.getPartitionInfo().getDataProperty(partition.getId())); } @@ -466,7 +483,7 @@ public class AlterTest { dateLiteral = new DateLiteral("2100-12-31 00:00:00", Type.DATETIME); cooldownTimeMs = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); - DataProperty newDataProperty1 = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, "", DataProperty.MAX_COOLDOWN_TIME_MS); + DataProperty newDataProperty1 = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, ""); partitionList = Lists.newArrayList(p1, p2); for (Partition partition : partitionList) { Assert.assertEquals(newDataProperty1, tbl4.getPartitionInfo().getDataProperty(partition.getId())); @@ -492,11 +509,9 @@ public class AlterTest { Partition p3 = tblRemote.getPartition("p3"); Partition p4 = tblRemote.getPartition("p4"); - DateLiteral dateLiteral = new DateLiteral("2122-04-01 20:24:00", Type.DATETIME); + DateLiteral dateLiteral = new DateLiteral("2100-05-09 00:00:00", Type.DATETIME); long cooldownTimeMs = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); - DateLiteral dateLiteral1 = new DateLiteral("2122-12-01 20:23:00", Type.DATETIME); - long remoteCooldownTimeMs = dateLiteral1.unixTimestamp(TimeUtils.getTimeZone()); - DataProperty oldDataProperty = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, "remote_s3", remoteCooldownTimeMs); + DataProperty oldDataProperty = new DataProperty(TStorageMedium.SSD, cooldownTimeMs, "testPolicy"); List<Partition> partitionList = Lists.newArrayList(p2, p3, p4); for (Partition partition : partitionList) { Assert.assertEquals(oldDataProperty, tblRemote.getPartitionInfo().getDataProperty(partition.getId())); @@ -507,7 +522,7 @@ public class AlterTest { alterTable(stmt, false); DateLiteral newDateLiteral = new DateLiteral("2100-04-01 22:22:22", Type.DATETIME); long newCooldownTimeMs = newDateLiteral.unixTimestamp(TimeUtils.getTimeZone()); - DataProperty dataProperty2 = new DataProperty(TStorageMedium.SSD, newCooldownTimeMs, "remote_s3", remoteCooldownTimeMs); + DataProperty dataProperty2 = new DataProperty(TStorageMedium.SSD, newCooldownTimeMs, "testPolicy"); for (Partition partition : partitionList) { Assert.assertEquals(dataProperty2, tblRemote.getPartitionInfo().getDataProperty(partition.getId())); } @@ -516,33 +531,22 @@ public class AlterTest { // alter storage_medium stmt = "alter table test.tbl_remote modify partition (p2, p3, p4) set ('storage_medium' = 'HDD')"; alterTable(stmt, false); - DataProperty dataProperty1 = new DataProperty(TStorageMedium.HDD, DataProperty.MAX_COOLDOWN_TIME_MS, "remote_s3", remoteCooldownTimeMs); + DataProperty dataProperty1 = new DataProperty( + TStorageMedium.HDD, DataProperty.MAX_COOLDOWN_TIME_MS, "testPolicy"); for (Partition partition : partitionList) { Assert.assertEquals(dataProperty1, tblRemote.getPartitionInfo().getDataProperty(partition.getId())); } Assert.assertEquals(oldDataProperty, tblRemote.getPartitionInfo().getDataProperty(p1.getId())); // alter remote_storage - stmt = "alter table test.tbl_remote modify partition (p2, p3, p4) set ('remote_storage_resource' = 'remote_s3_1')"; + stmt = "alter table test.tbl_remote modify partition (p2, p3, p4) set ('remote_storage_policy' = 'testPolicy3')"; alterTable(stmt, true); Assert.assertEquals(oldDataProperty, tblRemote.getPartitionInfo().getDataProperty(p1.getId())); - // alter remote_storage_cooldown_time - stmt = "alter table test.tbl_remote modify partition (p2, p3, p4) set ('remote_storage_cooldown_time' = '2122-12-01 20:23:00')"; - alterTable(stmt, false); - DateLiteral newRemoteDate = new DateLiteral("2122-12-01 20:23:00", Type.DATETIME); - long newRemoteCooldownTimeMs = newRemoteDate.unixTimestamp(TimeUtils.getTimeZone()); - DataProperty dataProperty4 = new DataProperty(TStorageMedium.HDD, DataProperty.MAX_COOLDOWN_TIME_MS, "remote_s3", newRemoteCooldownTimeMs); - for (Partition partition : partitionList) { - Assert.assertEquals(dataProperty4, tblRemote.getPartitionInfo().getDataProperty(partition.getId())); - } - Assert.assertEquals(oldDataProperty, tblRemote.getPartitionInfo().getDataProperty(p1.getId())); - // alter recover to old state stmt = "alter table test.tbl_remote modify partition (p2, p3, p4) set (" + "'storage_medium' = 'SSD', " - + "'storage_cooldown_time' = '2122-04-01 20:24:00', " - + "'remote_storage_cooldown_time' = '2122-12-01 20:23:00'" + + "'storage_cooldown_time' = '2100-05-09 00:00:00'" + ")"; alterTable(stmt, false); for (Partition partition : partitionList) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/DataPropertyTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/DataPropertyTest.java index 1669749cf1..5114142569 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/catalog/DataPropertyTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/DataPropertyTest.java @@ -26,7 +26,7 @@ import org.junit.Test; public class DataPropertyTest { @Test - public void tesCooldownTimeMs() throws Exception { + public void testCooldownTimeMs() throws Exception { Config.default_storage_medium = "ssd"; DataProperty dataProperty = DataProperty.DEFAULT_DATA_PROPERTY; Assert.assertNotEquals(DataProperty.MAX_COOLDOWN_TIME_MS, dataProperty.getCooldownTimeMs()); @@ -35,7 +35,7 @@ public class DataPropertyTest { Assert.assertNotEquals(DataProperty.MAX_COOLDOWN_TIME_MS, dataProperty.getCooldownTimeMs()); long storageCooldownTimeMs = System.currentTimeMillis() + 24 * 3600 * 1000L; - dataProperty = new DataProperty(TStorageMedium.SSD, storageCooldownTimeMs, "", DataProperty.MAX_COOLDOWN_TIME_MS); + dataProperty = new DataProperty(TStorageMedium.SSD, storageCooldownTimeMs, ""); Assert.assertEquals(storageCooldownTimeMs, dataProperty.getCooldownTimeMs()); dataProperty = new DataProperty(TStorageMedium.HDD); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org