This is an automated email from the ASF dual-hosted git repository.
xyuanlu pushed a commit to branch ApplicationClusterManager
in repository https://gitbox.apache.org/repos/asf/helix.git
The following commit(s) were added to refs/heads/ApplicationClusterManager by
this push:
new 85bbe47d1 Instance Evacuation operation sanity check (#2598)
85bbe47d1 is described below
commit 85bbe47d1555d5886cbdfa701f0005e0ab0ad327
Author: xyuanlu <[email protected]>
AuthorDate: Mon Aug 21 10:03:50 2023 -0700
Instance Evacuation operation sanity check (#2598)
Instance Evacuation operation sanity check
---
.../org/apache/helix/model/InstanceConfig.java | 31 ++++++++++++++++++----
.../helix/rest/server/TestPerInstanceAccessor.java | 21 +++++++++++++++
2 files changed, 47 insertions(+), 5 deletions(-)
diff --git
a/helix-core/src/main/java/org/apache/helix/model/InstanceConfig.java
b/helix-core/src/main/java/org/apache/helix/model/InstanceConfig.java
index bdd49cafb..fdcb74517 100644
--- a/helix-core/src/main/java/org/apache/helix/model/InstanceConfig.java
+++ b/helix-core/src/main/java/org/apache/helix/model/InstanceConfig.java
@@ -264,9 +264,22 @@ public class InstanceConfig extends HelixProperty {
* @param enabled true to enable, false to disable
*/
public void setInstanceEnabled(boolean enabled) {
+ // set instance operation only when we need to change InstanceEnabled
value.
+ // When enabling an instance where current HELIX_ENABLED is false, we
update INSTANCE_OPERATION to 'ENABLE'
+ // When disabling and instance where current HELIX_ENABLED is false, we
overwrite what current operation and
+ // update INSTANCE_OPERATION to 'DISABLE'.
+ String instanceOperationKey =
InstanceConfigProperty.INSTANCE_OPERATION.toString();
+ if (enabled != getInstanceEnabled()) {
+ _record.setSimpleField(instanceOperationKey,
+ enabled ? InstanceConstants.InstanceOperation.ENABLE.name()
+ : InstanceConstants.InstanceOperation.DISABLE.name());
+ }
+ setInstanceEnabledHelper(enabled);
+ }
+
+ private void setInstanceEnabledHelper(boolean enabled) {
_record.setBooleanField(InstanceConfigProperty.HELIX_ENABLED.toString(),
enabled);
- _record.setLongField(InstanceConfigProperty.HELIX_ENABLED_TIMESTAMP.name(),
- System.currentTimeMillis());
+
_record.setLongField(InstanceConfigProperty.HELIX_ENABLED_TIMESTAMP.name(),
System.currentTimeMillis());
if (enabled) {
resetInstanceDisabledTypeAndReason();
}
@@ -331,10 +344,17 @@ public class InstanceConfig extends HelixProperty {
}
public void setInstanceOperation(InstanceConstants.InstanceOperation
operation) {
- // TODO: also setInstanceEnabled after sanity check.
+ if (operation != InstanceConstants.InstanceOperation.DISABLE
+ && operation != InstanceConstants.InstanceOperation.ENABLE ){
+ if( !getInstanceEnabled()) {
+ throw new HelixException(
+ "setting non enable/disable operation (e.g. evacuate, swap) to
helix disabled instance is not allowed");
+ }
+ } else {
+ setInstanceEnabledHelper(operation ==
InstanceConstants.InstanceOperation.ENABLE);
+ }
- _record.setSimpleField(InstanceConfigProperty.INSTANCE_OPERATION.name(),
- operation.name());
+
_record.setSimpleField(InstanceConfigProperty.INSTANCE_OPERATION.toString(),
operation.toString());
}
public String getInstanceOperation() {
@@ -361,6 +381,7 @@ public class InstanceConfig extends HelixProperty {
/**
* Check if this instance is enabled for a given partition
+ *
* @param partition the partition name to check
* @return true if the instance is enabled for the partition, false otherwise
*/
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
index fe4e19906..d721c372a 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
@@ -497,6 +497,27 @@ public class TestPerInstanceAccessor extends
AbstractTestClass {
.expectedReturnStatusCode(Response.Status.NOT_FOUND.getStatusCode()).format(CLUSTER_NAME,
INSTANCE_NAME).post(this, entity);
new
JerseyUriRequestBuilder("clusters/{}/instances/{}?command=setInstanceOperation")
.expectedReturnStatusCode(Response.Status.BAD_REQUEST.getStatusCode()).format(CLUSTER_NAME,
INSTANCE_NAME).post(this, entity);
+ // TODO: enable the following test when we add sanity check.
+ // set operation to be DISABLE
+ new
JerseyUriRequestBuilder("clusters/{}/instances/{}?command=setInstanceOperation&instanceOperation=DISABLE")
+ .format(CLUSTER_NAME, INSTANCE_NAME).post(this, entity);
+ instanceConfig = _configAccessor.getInstanceConfig(CLUSTER_NAME,
INSTANCE_NAME);
+ Assert.assertEquals(
+ instanceConfig.getInstanceOperation(),
InstanceConstants.InstanceOperation.DISABLE.toString());
+ Assert.assertTrue(!instanceConfig.getInstanceEnabled());
+
+ // set operation to EVACUATE, expect error
+ new
JerseyUriRequestBuilder("clusters/{}/instances/{}?command=setInstanceOperation&instanceOperation=EVACUATE")
+ .expectedReturnStatusCode(Response.Status.BAD_REQUEST.getStatusCode())
+ .format(CLUSTER_NAME, INSTANCE_NAME).post(this, entity);
+ // set back to enable
+ new
JerseyUriRequestBuilder("clusters/{}/instances/{}?command=setInstanceOperation&instanceOperation=ENABLE")
+ .format(CLUSTER_NAME, INSTANCE_NAME).post(this, entity);
+ instanceConfig = _configAccessor.getInstanceConfig(CLUSTER_NAME,
INSTANCE_NAME);
+ Assert.assertEquals(
+ instanceConfig.getInstanceOperation(),
InstanceConstants.InstanceOperation.ENABLE.toString());
+ Assert.assertTrue(instanceConfig.getInstanceEnabled());
+
System.out.println("End test :" + TestHelper.getTestMethodName());
}