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/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new d1a994e  [fix](cpu-resource)(resource-tag) Allow set 
cpu_resource_limit to -1 and fix resource tag bug(#6830)
d1a994e is described below

commit d1a994eff9e826ad0ef9c5536d128166cb3a7006
Author: Mingyu Chen <[email protected]>
AuthorDate: Thu Jan 13 23:11:37 2022 +0800

    [fix](cpu-resource)(resource-tag) Allow set cpu_resource_limit to -1 and 
fix resource tag bug(#6830)
    
    1. Allow set cpu_resource_limit
    
        -1 means unlimited
    
    2. Drop replica not in valid tag
    
        Otherwise, the migration task from a resource group to another may 
never finish.
---
 .../org/apache/doris/clone/TabletScheduler.java    | 15 ++++++++++++++
 .../java/org/apache/doris/common/ErrorCode.java    |  4 ++--
 .../java/org/apache/doris/mysql/MysqlProto.java    |  2 +-
 .../apache/doris/mysql/privilege/UserProperty.java |  9 ++++----
 .../java/org/apache/doris/qe/ConnectProcessor.java |  2 +-
 .../org/apache/doris/catalog/UserPropertyTest.java | 24 ++++++++++++++++++++--
 6 files changed, 46 insertions(+), 10 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java 
b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
index c98de60..c941817 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
@@ -767,6 +767,7 @@ public class TabletScheduler extends MasterDaemon {
                 || deleteReplicaWithLowerVersion(tabletCtx, force)
                 || deleteReplicaOnSameHost(tabletCtx, force)
                 || deleteReplicaNotInCluster(tabletCtx, force)
+                || deleteReplicaNotInValidTag(tabletCtx, force)
                 || deleteReplicaChosenByRebalancer(tabletCtx, force)
                 || deleteReplicaOnHighLoadBackend(tabletCtx, force)) {
             // if we delete at least one redundant replica, we still throw a 
SchedException with status FINISHED
@@ -892,6 +893,20 @@ public class TabletScheduler extends MasterDaemon {
         return false;
     }
 
+    private boolean deleteReplicaNotInValidTag(TabletSchedCtx tabletCtx, 
boolean force) throws SchedException {
+        Tablet tablet = tabletCtx.getTablet();
+        List<Replica> replicas = tablet.getReplicas();
+        Map<Tag, Short> allocMap = tabletCtx.getReplicaAlloc().getAllocMap();
+        for (Replica replica : replicas) {
+            Backend be = infoService.getBackend(replica.getBackendId());
+            if (!allocMap.containsKey(be.getTag())) {
+                deleteReplicaInternal(tabletCtx, replica, "not in valid tag", 
force);
+                return true;
+            }
+        }
+        return false;
+    }
+
     private boolean deleteReplicaChosenByRebalancer(TabletSchedCtx tabletCtx, 
boolean force) throws SchedException {
         Long id = rebalancer.getToDeleteReplicaId(tabletCtx);
         if (id == -1L) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
index d5863bd..8950fca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
@@ -77,7 +77,7 @@ public enum ErrorCode {
     ERR_HANDSHAKE_ERROR(1043, new byte[]{'0', '8', 'S', '0', '1'}, "Bad 
handshake"),
     ERR_DBACCESS_DENIED_ERROR(1044, new byte[]{'4', '2', '0', '0', '0'}, 
"Access denied for user '%s'@'%s' to " +
             "database '%s'"),
-    ERR_ACCESS_DENIED_ERROR(1045, new byte[]{'2', '8', '0', '0', '0'}, "Access 
denied for user '%s'@'%s' (using " +
+    ERR_ACCESS_DENIED_ERROR(1045, new byte[]{'2', '8', '0', '0', '0'}, "Access 
denied for user '%s' (using " +
             "password: %s)"),
     ERR_NO_DB_ERROR(1046, new byte[]{'3', 'D', '0', '0', '0'}, "No database 
selected"),
     ERR_UNKNOWN_COM_ERROR(1047, new byte[]{'0', '8', 'S', '0', '1'}, "Unknown 
command"),
@@ -1685,7 +1685,7 @@ public enum ErrorCode {
             "data cannot be inserted into table with empty partition. " +
                     "Use `SHOW PARTITIONS FROM %s` to see the currently 
partitions of this table. "),
     ERROR_SQL_AND_LIMITATIONS_SET_IN_ONE_RULE(5084, new byte[]{'4', '2', '0', 
'0', '0'},
-            "sql/sqlHash and partition_num/tablet_num/cardinality cannot be 
set in one rule."),
+            "sql/sqlHash and partition_num/tablet_num/cardinality cannot be 
set in one rule.")
     ;
 
     // This is error code
diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java
index 046df2a..ae55381 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlProto.java
@@ -70,7 +70,7 @@ public class MysqlProto {
 
         String tmpUser = user;
         if (tmpUser == null || tmpUser.isEmpty()) {
-            ErrorReport.report(ErrorCode.ERR_ACCESS_DENIED_ERROR, "", 
usePasswd);
+            ErrorReport.report(ErrorCode.ERR_ACCESS_DENIED_ERROR, "no user", 
usePasswd);
             return null;
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserProperty.java 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserProperty.java
index 4041f8f..40f8725 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserProperty.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserProperty.java
@@ -276,8 +276,9 @@ public class UserProperty implements Writable {
                     throw new DdlException(key + " is not number");
                 }
 
-                if (limit <= 0) {
-                    throw new DdlException(key + " is not valid");
+                // -1 means unlimited
+                if (limit <= 0 && limit != -1) {
+                    throw new DdlException(key + " is not valid. Should not 
larger than 0 or equal to -1");
                 }
 
                 cpuResourceLimit = limit;
@@ -465,7 +466,7 @@ public class UserProperty implements Writable {
             result.add(Lists.newArrayList(clusterPrefix + 
DppConfig.getPriorityKey(),
                     String.valueOf(dppConfig.getPriority())));
         }
-        
+
         // get resolved ips if user has domain
         Map<String, Set<String>> resolvedIPs = whiteList.getResolvedIPs();
         List<String> ips = Lists.newArrayList();
@@ -526,7 +527,7 @@ public class UserProperty implements Writable {
             // consume the flag of empty user name
             in.readBoolean();
         }
-        
+
         // user name
         if (Catalog.getCurrentCatalogJournalVersion() < 
FeMetaVersion.VERSION_30) {
             qualifiedUser = 
ClusterNamespace.getFullName(SystemInfoService.DEFAULT_CLUSTER, 
Text.readString(in));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
index ef11cae..51d5dea 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
@@ -476,7 +476,7 @@ public class ConnectProcessor {
             // so ctx.getCurrentUserIdentity() will get null, and causing 
NullPointerException after using it.
             // return error directly.
             TMasterOpResult result = new TMasterOpResult();
-            ctx.getState().setError(ErrorCode.ERR_ACCESS_DENIED_ERROR, 
"Missing current user identity. You need to upgrade this Frontend " +
+            ctx.getState().setError(ErrorCode.ERR_COMMON_ERROR, "Missing 
current user identity. You need to upgrade this Frontend " +
                     "to the same version as Master Frontend.");
             
result.setMaxJournalId(Catalog.getCurrentCatalog().getMaxJournalId().longValue());
             result.setPacket(getResultPacket());
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/UserPropertyTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/UserPropertyTest.java
index 90c6bc2..0702e21 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/UserPropertyTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/UserPropertyTest.java
@@ -24,11 +24,11 @@ import org.apache.doris.common.UserException;
 import org.apache.doris.load.DppConfig;
 import org.apache.doris.mysql.privilege.UserProperty;
 
+import com.google.common.collect.Lists;
+
 import org.junit.Assert;
 import org.junit.Test;
 
-import com.google.common.collect.Lists;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
@@ -133,4 +133,24 @@ public class UserPropertyTest {
         userProperty.update(properties);
         Assert.assertEquals(3, userProperty.getSqlBlockRules().length);
     }
+
+    @Test
+    public void testValidation() throws UserException {
+        List<Pair<String, String>> properties = Lists.newArrayList();
+        properties.add(Pair.create("cpu_resource_limit", "-1"));
+        UserProperty userProperty = new UserProperty();
+        userProperty.update(properties);
+        Assert.assertEquals(-1, userProperty.getCpuResourceLimit());
+
+        properties = Lists.newArrayList();
+        properties.add(Pair.create("cpu_resource_limit", "-2"));
+        userProperty = new UserProperty();
+        try {
+            userProperty.update(properties);
+            Assert.fail();
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("is not valid"));
+        }
+        Assert.assertEquals(-1, userProperty.getCpuResourceLimit());
+    }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to