This is an automated email from the ASF dual-hosted git repository.

roryqi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-uniffle.git


The following commit(s) were added to refs/heads/master by this push:
     new a3e2c91ca [#1178]  improvement: set 
`rss.coordinator.quota.default.app.num` default -1 to indicate no quota check 
(#1186)
a3e2c91ca is described below

commit a3e2c91ca8c917ff73eef96b126aafa7670947f7
Author: xumanbu <[email protected]>
AuthorDate: Tue Sep 5 00:43:33 2023 +0800

    [#1178]  improvement: set `rss.coordinator.quota.default.app.num` default 
-1 to indicate no quota check (#1186)
    
    ### What changes were proposed in this pull request?
    
    1、set `rss.coordinator.quota.default.app.num`  default value as -1
    2、the logic for  quota check is the user app quota value < 0, then this 
user app quota check would passed
    
    ### Why are the changes needed?
    
    Fix:  #1178
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    UT
    
    Co-authored-by: jam.xu <[email protected]>
---
 .../uniffle/coordinator/CoordinatorConf.java       | 10 +++--
 .../apache/uniffle/coordinator/QuotaManager.java   |  4 +-
 .../uniffle/coordinator/QuotaManagerTest.java      | 49 ++++++++++++++++++++++
 .../src/test/resources/quotaFile.properties        |  2 +
 4 files changed, 60 insertions(+), 5 deletions(-)

diff --git 
a/coordinator/src/main/java/org/apache/uniffle/coordinator/CoordinatorConf.java 
b/coordinator/src/main/java/org/apache/uniffle/coordinator/CoordinatorConf.java
index 8472ae56d..466dda8b2 100644
--- 
a/coordinator/src/main/java/org/apache/uniffle/coordinator/CoordinatorConf.java
+++ 
b/coordinator/src/main/java/org/apache/uniffle/coordinator/CoordinatorConf.java
@@ -201,13 +201,17 @@ public class CoordinatorConf extends RssBaseConf {
   public static final ConfigOption<Integer> COORDINATOR_QUOTA_DEFAULT_APP_NUM =
       ConfigOptions.key("rss.coordinator.quota.default.app.num")
           .intType()
-          .defaultValue(5)
-          .withDescription("Default number of apps at user level");
+          .defaultValue(-1)
+          .withDescription(
+              "Default number of apps at user level, if set value < 0,then 
this user app quota "
+                  + "check would passed");
   public static final ConfigOption<String> COORDINATOR_QUOTA_DEFAULT_PATH =
       ConfigOptions.key("rss.coordinator.quota.default.path")
           .stringType()
           .noDefaultValue()
-          .withDescription("A configuration file for the number of apps for a 
user-defined user");
+          .withDescription(
+              "A configuration file for the number of apps for a user-defined 
user, if set value < 0,then this user app quota "
+                  + "check would passed.");
   public static final ConfigOption<Long> COORDINATOR_QUOTA_UPDATE_INTERVAL =
       ConfigOptions.key("rss.coordinator.quota.update.interval")
           .longType()
diff --git 
a/coordinator/src/main/java/org/apache/uniffle/coordinator/QuotaManager.java 
b/coordinator/src/main/java/org/apache/uniffle/coordinator/QuotaManager.java
index 597932099..d661f90df 100644
--- a/coordinator/src/main/java/org/apache/uniffle/coordinator/QuotaManager.java
+++ b/coordinator/src/main/java/org/apache/uniffle/coordinator/QuotaManager.java
@@ -118,10 +118,10 @@ public class QuotaManager {
   public boolean checkQuota(String user, String uuid) {
     Map<String, Long> appAndTimes =
         currentUserAndApp.computeIfAbsent(user, x -> 
JavaUtils.newConcurrentMap());
-    Integer defaultAppNum = defaultUserApps.computeIfAbsent(user, x -> 
quotaAppNum);
+    Integer userAppQuotaNum = defaultUserApps.computeIfAbsent(user, x -> 
quotaAppNum);
     synchronized (this) {
       int currentAppNum = appAndTimes.size();
-      if (currentAppNum >= defaultAppNum) {
+      if (userAppQuotaNum >= 0 && currentAppNum >= userAppQuotaNum) {
         return true;
       } else {
         appAndTimes.put(uuid, System.currentTimeMillis());
diff --git 
a/coordinator/src/test/java/org/apache/uniffle/coordinator/QuotaManagerTest.java
 
b/coordinator/src/test/java/org/apache/uniffle/coordinator/QuotaManagerTest.java
index dd9d682d5..ff378d63d 100644
--- 
a/coordinator/src/test/java/org/apache/uniffle/coordinator/QuotaManagerTest.java
+++ 
b/coordinator/src/test/java/org/apache/uniffle/coordinator/QuotaManagerTest.java
@@ -44,6 +44,7 @@ public class QuotaManagerTest {
   private final String quotaFile =
       
Objects.requireNonNull(this.getClass().getClassLoader().getResource(fileName)).getFile();
   private static final String fileName = "quotaFile.properties";
+  private static final AtomicInteger uuid = new AtomicInteger();
 
   @BeforeAll
   public static void setup() {
@@ -91,6 +92,7 @@ public class QuotaManagerTest {
   public void testCheckQuota() throws Exception {
     CoordinatorConf conf = new CoordinatorConf();
     conf.set(CoordinatorConf.COORDINATOR_QUOTA_DEFAULT_PATH, quotaFile);
+    conf.setInteger(CoordinatorConf.COORDINATOR_QUOTA_DEFAULT_APP_NUM, 5);
     final ApplicationManager applicationManager = new ApplicationManager(conf);
     final AtomicInteger uuid = new AtomicInteger();
     Map<String, Long> uuidAndTime = new ConcurrentHashMap<>();
@@ -123,6 +125,8 @@ public class QuotaManagerTest {
 
   @Test
   public void testCheckQuotaMetrics() {
+    CoordinatorMetrics.clear();
+    CoordinatorMetrics.register();
     CoordinatorConf conf = new CoordinatorConf();
     conf.set(CoordinatorConf.COORDINATOR_QUOTA_DEFAULT_PATH, quotaFile);
     conf.setLong(CoordinatorConf.COORDINATOR_APP_EXPIRED, 1500);
@@ -150,6 +154,7 @@ public class QuotaManagerTest {
     assertFalse(icCheck2);
     // The default number of tasks submitted is 2, and the third will be 
rejected
     assertTrue(icCheck3);
+    assertFalse(icCheck4);
     assertEquals(
         
applicationManager.getQuotaManager().getCurrentUserAndApp().get("user4").size(),
 2);
     
assertEquals(CoordinatorMetrics.gaugeRunningAppNumToUser.labels("user4").get(), 
2);
@@ -164,4 +169,48 @@ public class QuotaManagerTest {
                   && 
CoordinatorMetrics.gaugeRunningAppNumToUser.labels("user3").get() == 0;
             });
   }
+
+  @Test
+  public void testCheckQuotaWithDefault() {
+    CoordinatorConf conf = new CoordinatorConf();
+    conf.set(CoordinatorConf.COORDINATOR_QUOTA_DEFAULT_PATH, quotaFile);
+    final ApplicationManager applicationManager = new ApplicationManager(conf);
+    Awaitility.await()
+        .timeout(5, TimeUnit.SECONDS)
+        .until(() -> applicationManager.getDefaultUserApps().size() > 2);
+
+    QuotaManager quotaManager = applicationManager.getQuotaManager();
+    Map<String, Map<String, Long>> currentUserAndApp = 
quotaManager.getCurrentUserAndApp();
+
+    currentUserAndApp.computeIfAbsent("user1", x -> mockUUidAppAndTime(30));
+    currentUserAndApp.computeIfAbsent("user2", x -> mockUUidAppAndTime(20));
+    currentUserAndApp.computeIfAbsent("user3", x -> mockUUidAppAndTime(29));
+    currentUserAndApp.computeIfAbsent("disable_quota_user1", x -> 
mockUUidAppAndTime(100));
+    currentUserAndApp.computeIfAbsent("blank_user1", x -> 
mockUUidAppAndTime(0));
+
+    assertEquals(currentUserAndApp.get("user1").size(), 30);
+    assertEquals(currentUserAndApp.get("user2").size(), 20);
+    assertEquals(currentUserAndApp.get("user3").size(), 29);
+    assertEquals(currentUserAndApp.get("disable_quota_user1").size(), 100);
+    assertEquals(currentUserAndApp.get("blank_user1").size(), 0);
+
+    assertTrue(quotaManager.checkQuota("user1", mockUUidAppId()));
+    assertTrue(quotaManager.checkQuota("user2", mockUUidAppId()));
+    assertFalse(quotaManager.checkQuota("user3", mockUUidAppId()));
+    assertTrue(quotaManager.checkQuota("user3", mockUUidAppId()));
+    assertFalse(quotaManager.checkQuota("disable_quota_user1", 
mockUUidAppId()));
+    assertTrue(quotaManager.checkQuota("blank_user1", mockUUidAppId()));
+  }
+
+  private String mockUUidAppId() {
+    return String.valueOf(uuid.incrementAndGet());
+  }
+
+  private Map<String, Long> mockUUidAppAndTime(int mockAppNum) {
+    Map<String, Long> uuidAndTime = new ConcurrentHashMap<>();
+    for (int i = 0; i < mockAppNum; i++) {
+      uuidAndTime.put(mockUUidAppId(), System.currentTimeMillis());
+    }
+    return uuidAndTime;
+  }
 }
diff --git a/coordinator/src/test/resources/quotaFile.properties 
b/coordinator/src/test/resources/quotaFile.properties
index 7d4110285..a67c07f38 100644
--- a/coordinator/src/test/resources/quotaFile.properties
+++ b/coordinator/src/test/resources/quotaFile.properties
@@ -18,3 +18,5 @@
 user1 =10
 user2= 20
 user3 = 30
+disable_quota_user1=-1
+blank_user1=0

Reply via email to