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); + } + }