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

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit f27ee335285670a745d3d4032f313f436acaa878
Author: Junqing Cai <caicai121...@163.com>
AuthorDate: Wed Jan 4 22:15:19 2023 +0800

    KYLIN-5460 fix upgrade in resource group
---
 .../apache/kylin/metadata/epoch/EpochManager.java  | 12 ++-
 .../kylin/metadata/epoch/EpochManagerTest.java     | 88 ++++++++++++++++++++++
 2 files changed, 97 insertions(+), 3 deletions(-)

diff --git 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/epoch/EpochManager.java
 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/epoch/EpochManager.java
index e8d3acc29b..a68d25eeec 100644
--- 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/epoch/EpochManager.java
+++ 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/epoch/EpochManager.java
@@ -691,8 +691,15 @@ public class EpochManager {
         if (force) {
             return true;
         }
+        return currentInstanceHasPermissionToOwn(epochTarget, 
AddressUtil.getLocalInstance());
+    }
+
+    private boolean currentInstanceHasPermissionToOwn(String epochTarget, 
String epochServer) {
+        if (isMaintenanceMode()) {
+            return true;
+        }
         ResourceGroupManager rgManager = 
ResourceGroupManager.getInstance(config);
-        return rgManager.instanceHasPermissionToOwnEpochTarget(epochTarget, 
AddressUtil.getLocalInstance());
+        return rgManager.instanceHasPermissionToOwnEpochTarget(epochTarget, 
epochServer);
     }
 
     private boolean isEpochLegal(Epoch epoch) {
@@ -709,9 +716,8 @@ public class EpochManager {
                 return false;
             }
 
-            ResourceGroupManager rgManager = 
ResourceGroupManager.getInstance(config);
             String epochServer = getHostAndPort(epoch.getCurrentEpochOwner());
-            if 
(!rgManager.instanceHasPermissionToOwnEpochTarget(epoch.getEpochTarget(), 
epochServer)) {
+            if (!currentInstanceHasPermissionToOwn(epoch.getEpochTarget(), 
epochServer)) {
                 logger.debug("Epoch {}'s owner is not in build request type 
resource group.", epoch);
                 return false;
             }
diff --git 
a/src/core-metadata/src/test/java/org/apache/kylin/metadata/epoch/EpochManagerTest.java
 
b/src/core-metadata/src/test/java/org/apache/kylin/metadata/epoch/EpochManagerTest.java
index 425d81697d..fb0856c4cc 100644
--- 
a/src/core-metadata/src/test/java/org/apache/kylin/metadata/epoch/EpochManagerTest.java
+++ 
b/src/core-metadata/src/test/java/org/apache/kylin/metadata/epoch/EpochManagerTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.metadata.Epoch;
 import org.apache.kylin.common.persistence.metadata.EpochStore;
+import org.apache.kylin.common.persistence.transaction.UnitOfWork;
 import org.apache.kylin.junit.annotation.MetadataInfo;
 import org.apache.kylin.junit.annotation.OverwriteProp;
 import org.apache.kylin.metadata.project.NProjectManager;
@@ -489,4 +490,91 @@ class EpochManagerTest {
         Assertions.assertFalse(epochManager.getOwnedEpochs().isEmpty());
     }
 
+    @Test
+    void testIsEpochLegal() {
+        EpochManager epochManager = EpochManager.getInstance();
+        {
+            Epoch epoch = null;
+            Boolean isEpochLegal = 
ReflectionTestUtils.invokeMethod(epochManager, "isEpochLegal", epoch);
+            Assertions.assertNotNull(isEpochLegal);
+            Assertions.assertFalse(isEpochLegal);
+        }
+
+        {
+            Epoch epoch = new Epoch();
+            epoch.setEpochTarget("test1");
+            epoch.setCurrentEpochOwner(null);
+            epoch.setEpochId(1);
+            epoch.setLastEpochRenewTime(System.currentTimeMillis());
+            Boolean isEpochLegal = 
ReflectionTestUtils.invokeMethod(epochManager, "isEpochLegal", epoch);
+            Assertions.assertNotNull(isEpochLegal);
+            Assertions.assertFalse(isEpochLegal);
+        }
+
+        {
+            Epoch epoch = new Epoch();
+            epoch.setEpochTarget("test1");
+            epoch.setCurrentEpochOwner("abc");
+            epoch.setEpochId(1);
+            epoch.setLastEpochRenewTime(System.currentTimeMillis() - 
TimeUnit.DAYS.toMillis(1));
+            Boolean isEpochLegal = 
ReflectionTestUtils.invokeMethod(epochManager, "isEpochLegal", epoch);
+            Assertions.assertNotNull(isEpochLegal);
+            Assertions.assertFalse(isEpochLegal);
+        }
+
+        {
+            Epoch epoch = new Epoch();
+            epoch.setEpochTarget("test1");
+            epoch.setCurrentEpochOwner("abc");
+            epoch.setEpochId(1);
+            epoch.setLastEpochRenewTime(System.currentTimeMillis());
+            Boolean isEpochLegal = 
ReflectionTestUtils.invokeMethod(epochManager, "isEpochLegal", epoch);
+            Assertions.assertNotNull(isEpochLegal);
+            Assertions.assertTrue(isEpochLegal);
+        }
+    }
+
+    @Test
+    @MetadataInfo
+    void testIsEpochLegal_WithResourceGroup() {
+        val manager = ResourceGroupManager.getInstance(getTestConfig());
+        manager.getResourceGroup();
+        manager.updateResourceGroup(copyForWrite -> 
copyForWrite.setResourceGroupEnabled(true));
+        val epochManager = EpochManager.getInstance();
+        Epoch epoch = new Epoch();
+        epoch.setEpochTarget("test1");
+        epoch.setCurrentEpochOwner("abc");
+        epoch.setEpochId(1);
+        epoch.setLastEpochRenewTime(System.currentTimeMillis());
+        Boolean isEpochLegal = ReflectionTestUtils.invokeMethod(epochManager, 
"isEpochLegal", epoch);
+        Assertions.assertNotNull(isEpochLegal);
+        Assertions.assertFalse(isEpochLegal);
+    }
+
+    @Test
+    @MetadataInfo
+    void testIsEpochLegal_WithResourceGroupInMaintMode() {
+        val manager = ResourceGroupManager.getInstance(getTestConfig());
+        manager.getResourceGroup();
+        manager.updateResourceGroup(copyForWrite -> 
copyForWrite.setResourceGroupEnabled(true));
+
+        val epochManager = EpochManager.getInstance();
+
+        Epoch epoch = new Epoch();
+        epoch.setEpochTarget(UnitOfWork.GLOBAL_UNIT);
+        epoch.setCurrentEpochOwner("testOwner");
+        epoch.setEpochId(1);
+        epoch.setLastEpochRenewTime(System.currentTimeMillis());
+        getEpochStore().insertBatch(Lists.newArrayList(epoch));
+
+        epochManager.setMaintenanceMode("test");
+
+        //test another target
+        epoch.setEpochTarget("test");
+
+        Boolean isEpochLegal = ReflectionTestUtils.invokeMethod(epochManager, 
"isEpochLegal", epoch);
+        Assertions.assertNotNull(isEpochLegal);
+        Assertions.assertTrue(isEpochLegal);
+    }
+
 }

Reply via email to