This is an automated email from the ASF dual-hosted git repository. xyuanlu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/helix.git
commit a51c587f7dbb29bdbfd2476e98a880b1e64ad5da Author: Xiaxuan Gao <[email protected]> AuthorDate: Fri Aug 25 15:41:27 2023 -0700 Add on-demand rebalance API (#2601) Add on-demand rebalance API --- .../rest/server/resources/AbstractResource.java | 3 ++- .../rest/server/resources/helix/ClusterAccessor.java | 9 +++++++++ .../helix/rest/server/TestClusterAccessor.java | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java index 76733b92a..48b467eaa 100644 --- a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java +++ b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java @@ -85,7 +85,8 @@ public class AbstractResource { purgeOfflineParticipants, getInstance, getAllInstances, - setInstanceOperation // TODO: Name is just a place holder, may change in future + setInstanceOperation, // TODO: Name is just a place holder, may change in future + onDemandRebalance } @Context diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java index 9c563b9c3..cb56d009c 100644 --- a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java +++ b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java @@ -352,6 +352,15 @@ public class ClusterAccessor extends AbstractHelixResource { helixAdmin.purgeOfflineInstances(clusterId, duration); } break; + case onDemandRebalance: + try { + helixAdmin.onDemandRebalance(clusterId); + } catch (Exception ex) { + LOG.error( + "Cannot start on-demand rebalance for cluster: {}, Exception: {}", clusterId, ex); + return serverError(ex); + } + break; default: return badRequest("Unsupported command {}." + command); } diff --git a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java index 310b989a7..a81799df2 100644 --- a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java +++ b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java @@ -1415,6 +1415,26 @@ public class TestClusterAccessor extends AbstractTestClass { System.out.println("End test :" + TestHelper.getTestMethodName()); } + @Test(dependsOnMethods = "testUpdateCustomizedConfig") + public void testOnDemandRebalance() throws IOException { + System.out.println("Start test :" + TestHelper.getTestMethodName()); + long currentTime = System.currentTimeMillis(); + String cluster = "TestCluster_1"; + new JerseyUriRequestBuilder("clusters/{}?command=onDemandRebalance").format(cluster) + .post(this, Entity.entity("{}", MediaType.APPLICATION_JSON_TYPE)); + + ClusterConfig config = _configAccessor.getClusterConfig(cluster); + long lastOnDemandRebalanceTime = config.getLastOnDemandRebalanceTimestamp(); + Assert.assertFalse(lastOnDemandRebalanceTime == -1L, + "The last on-demand rebalance timestamp is not found."); + Assert.assertTrue(lastOnDemandRebalanceTime > currentTime, String.format( + "The last on-demand rebalance timestamp {} is stale. Expect a timestamp that is larger than {}.", + lastOnDemandRebalanceTime, currentTime)); + // restore the state + config.setLastOnDemandRebalanceTimestamp(-1L); + System.out.println("End test :" + TestHelper.getTestMethodName()); + } + @Test public void testClusterFreezeMode() throws Exception { String cluster = "TestCluster_0";
