[feature](mtmv) mtmv support workload group (#29595)
MTMV supports controlling the resource usage of refresh tasks by setting the name of workload group about workload group : https://doris.apache.org/zh-CN/docs/dev/admin-manual/workload-group
This commit is contained in:
@ -40,6 +40,7 @@ import org.apache.doris.persist.gson.GsonUtils;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@ -47,6 +48,7 @@ import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
@ -190,6 +192,14 @@ public class MTMV extends OlapTable {
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<String> getWorkloadGroup() {
|
||||
if (mvProperties.containsKey(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP) && !StringUtils
|
||||
.isEmpty(mvProperties.get(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP))) {
|
||||
return Optional.of(mvProperties.get(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public int getRefreshPartitionNum() {
|
||||
if (mvProperties.containsKey(PropertyAnalyzer.PROPERTIES_REFRESH_PARTITION_NUM)) {
|
||||
int value = Integer.parseInt(mvProperties.get(PropertyAnalyzer.PROPERTIES_REFRESH_PARTITION_NUM));
|
||||
|
||||
@ -164,6 +164,7 @@ public class PropertyAnalyzer {
|
||||
public static final String PROPERTIES_GRACE_PERIOD = "grace_period";
|
||||
public static final String PROPERTIES_EXCLUDED_TRIGGER_TABLES = "excluded_trigger_tables";
|
||||
public static final String PROPERTIES_REFRESH_PARTITION_NUM = "refresh_partition_num";
|
||||
public static final String PROPERTIES_WORKLOAD_GROUP = "workload_group";
|
||||
// For unique key data model, the feature Merge-on-Write will leverage a primary
|
||||
// key index and a delete-bitmap to mark duplicate keys as deleted in load stage,
|
||||
// which can avoid the merging cost in read stage, and accelerate the aggregation
|
||||
|
||||
@ -43,6 +43,7 @@ import org.apache.doris.qe.SessionVariable;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public class MTMVPlanUtil {
|
||||
@ -59,6 +60,10 @@ public class MTMVPlanUtil {
|
||||
ctx.changeDefaultCatalog(catalog.getName());
|
||||
ctx.setDatabase(catalog.getDbOrAnalysisException(mtmv.getEnvInfo().getDbId()).getFullName());
|
||||
ctx.getSessionVariable().enableFallbackToOriginalPlanner = false;
|
||||
Optional<String> workloadGroup = mtmv.getWorkloadGroup();
|
||||
if (workloadGroup.isPresent()) {
|
||||
ctx.getSessionVariable().setWorkloadGroup(workloadGroup.get());
|
||||
}
|
||||
ctx.getSessionVariable().enableNereidsDML = true;
|
||||
return ctx;
|
||||
}
|
||||
|
||||
@ -20,9 +20,12 @@ package org.apache.doris.nereids.trees.plans.commands.info;
|
||||
import org.apache.doris.catalog.Env;
|
||||
import org.apache.doris.common.UserException;
|
||||
import org.apache.doris.common.util.PropertyAnalyzer;
|
||||
import org.apache.doris.mysql.privilege.PrivPredicate;
|
||||
import org.apache.doris.nereids.exceptions.AnalysisException;
|
||||
import org.apache.doris.qe.ConnectContext;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
@ -71,6 +74,16 @@ public class AlterMTMVPropertyInfo extends AlterMTMVInfo {
|
||||
}
|
||||
} else if (PropertyAnalyzer.PROPERTIES_EXCLUDED_TRIGGER_TABLES.equals(key)) {
|
||||
// nothing
|
||||
} else if (PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP.equals(key)) {
|
||||
String workloadGroup = properties.get(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP);
|
||||
if (!StringUtils.isEmpty(workloadGroup) && !Env.getCurrentEnv().getAccessManager()
|
||||
.checkWorkloadGroupPriv(ConnectContext.get(), workloadGroup, PrivPredicate.USAGE)) {
|
||||
String message = String
|
||||
.format("Access denied; you need (at least one of) "
|
||||
+ "the %s privilege(s) to use workload group '%s'.",
|
||||
"USAGE/ADMIN", workloadGroup);
|
||||
throw new AnalysisException(message);
|
||||
}
|
||||
} else {
|
||||
throw new org.apache.doris.nereids.exceptions.AnalysisException("illegal key:" + key);
|
||||
}
|
||||
|
||||
@ -202,6 +202,19 @@ public class CreateMTMVInfo {
|
||||
mvProperties.put(PropertyAnalyzer.PROPERTIES_EXCLUDED_TRIGGER_TABLES, excludedTriggerTables);
|
||||
properties.remove(PropertyAnalyzer.PROPERTIES_EXCLUDED_TRIGGER_TABLES);
|
||||
}
|
||||
if (properties.containsKey(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP)) {
|
||||
String workloadGroup = properties.get(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP);
|
||||
if (!Env.getCurrentEnv().getAccessManager()
|
||||
.checkWorkloadGroupPriv(ConnectContext.get(), workloadGroup, PrivPredicate.USAGE)) {
|
||||
String message = String
|
||||
.format("Access denied;"
|
||||
+ " you need (at least one of) the %s privilege(s) to use workload group '%s'.",
|
||||
"USAGE/ADMIN", workloadGroup);
|
||||
throw new AnalysisException(message);
|
||||
}
|
||||
mvProperties.put(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP, workloadGroup);
|
||||
properties.remove(PropertyAnalyzer.PROPERTIES_WORKLOAD_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user