qqu0127 commented on code in PR #2106:
URL: https://github.com/apache/helix/pull/2106#discussion_r877551949


##########
helix-core/src/main/java/org/apache/helix/controller/dataproviders/BaseControllerDataProvider.java:
##########
@@ -241,13 +244,87 @@ private void refreshClusterConfig(final HelixDataAccessor 
accessor,
     if 
(_propertyDataChangedMap.get(HelixConstants.ChangeType.CLUSTER_CONFIG).getAndSet(false))
 {
       _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
       refreshedType.add(HelixConstants.ChangeType.CLUSTER_CONFIG);
+      // TODO: This is a temp function to clean up incompatible batched 
disabled instances format.
+      // Remove in later version.
+      if (checkBatchedDisabledInstanceFormat(_clusterConfig) && 
updateBatchDisableFormat(
+          accessor)) {
+        // read from zkz one more time
+        LogUtil.logInfo(logger, getClusterEventId(), String
+            .format("Clean ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+                getPipelineName()));
+        _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
+      }
       refreshAbnormalStateResolverMap(_clusterConfig);
     } else {
-      LogUtil.logInfo(logger, getClusterEventId(), String.format(
-          "No ClusterConfig change for cluster %s, pipeline %s", _clusterName, 
getPipelineName()));
+      LogUtil.logInfo(logger, getClusterEventId(), String
+          .format("No ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+              getPipelineName()));
     }
   }
 
+  // TODO: This function is used to clean up incompatible batched disabled 
instances format for
+  // "DISABLED_INSTANCES" introduced in 1.0.3.0. This temp change shoul dbe 
reverted after 1.0.5.0 \
+  // or later version.
+  private boolean updateBatchDisableFormat(final HelixDataAccessor accessor) {
+    return accessor
+        .updateProperty(accessor.keyBuilder().clusterConfig(), new 
DataUpdater<ZNRecord>() {
+          @Override
+          public ZNRecord update(ZNRecord currentData) {
+            if (currentData == null) {
+              throw new HelixException(
+                  "Cluster: " + _clusterConfig.getClusterName() + ": cluster 
config is null");
+            }
+
+            ClusterConfig clusterConfig = new ClusterConfig(currentData);
+            Map<String, String> disabledInstances = 
clusterConfig.getDisabledInstances();
+            Map<String, String> DisabledInstancesWithInfo =
+                clusterConfig.getDisabledInstancesWithInfo();
+
+            ClusterConfig newClusterConfig = new ClusterConfig(currentData);
+            Map<String, String> newDisabledInstances =
+                new TreeMap<>(newClusterConfig.getDisabledInstances());
+            Map<String, String> newDisabledInstancesWithInfo =
+                new TreeMap<>(newClusterConfig.getDisabledInstancesWithInfo());
+
+            // iterate through all k,v pairs and check for string format.
+            for (Map.Entry<String, String> instanceInfo : 
disabledInstances.entrySet()) {
+              String instanceName = instanceInfo.getKey();
+              if (!StringUtils.isNumeric(instanceInfo.getValue())) {
+                newDisabledInstances.put(instanceName,
+                    
ConfigStringUtil.parseConcatenatedConfig(instanceInfo.getValue()).get(
+                        
ClusterConfig.ClusterConfigProperty.HELIX_ENABLED_DISABLE_TIMESTAMP
+                            .toString()));
+                newDisabledInstancesWithInfo.put(instanceName, 
instanceInfo.getValue());
+              } else {
+                if (!DisabledInstancesWithInfo.containsKey(instanceName)) {
+                  newDisabledInstancesWithInfo.put(instanceName, 
ConfigStringUtil
+                      .concatenateMapping(Collections.singletonMap(
+                          
ClusterConfig.ClusterConfigProperty.HELIX_ENABLED_DISABLE_TIMESTAMP
+                              .toString(), instanceInfo.getValue())));
+                }
+              }
+            }
+            newClusterConfig.setDisabledInstances(newDisabledInstances);
+            
newClusterConfig.setDisabledInstancesWithInfo(newDisabledInstancesWithInfo);
+            return newClusterConfig.getRecord();
+          }
+        }, null);
+  }
+
+  private boolean checkBatchedDisabledInstanceFormat(ClusterConfig 
clusterConfig) {
+    Map<String, String> disabledInstances = 
clusterConfig.getDisabledInstances();
+    Map<String, String> DisabledInstancesWithInfo = 
clusterConfig.getDisabledInstancesWithInfo();

Review Comment:
   nit, naming convention



##########
helix-core/src/main/java/org/apache/helix/controller/dataproviders/BaseControllerDataProvider.java:
##########
@@ -556,8 +633,8 @@ public Set<String> getInstancesWithTag(String instanceTag) {
    */
   public Set<String> getDisabledInstancesForPartition(String resource, String 
partition) {
     Set<String> disabledInstancesForPartition = new 
HashSet<>(_disabledInstanceSet);
-    if (_disabledInstanceForPartitionMap.containsKey(resource)
-        && 
_disabledInstanceForPartitionMap.get(resource).containsKey(partition)) {
+    if (_disabledInstanceForPartitionMap.containsKey(resource) && 
_disabledInstanceForPartitionMap
+        .get(resource).containsKey(partition)) {

Review Comment:
   nit, `.getOrDefault(resource, EMPTY_MAP)` could be cleaner.



##########
helix-core/src/main/java/org/apache/helix/controller/dataproviders/BaseControllerDataProvider.java:
##########
@@ -241,13 +244,87 @@ private void refreshClusterConfig(final HelixDataAccessor 
accessor,
     if 
(_propertyDataChangedMap.get(HelixConstants.ChangeType.CLUSTER_CONFIG).getAndSet(false))
 {
       _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
       refreshedType.add(HelixConstants.ChangeType.CLUSTER_CONFIG);
+      // TODO: This is a temp function to clean up incompatible batched 
disabled instances format.
+      // Remove in later version.
+      if (checkBatchedDisabledInstanceFormat(_clusterConfig) && 
updateBatchDisableFormat(
+          accessor)) {
+        // read from zkz one more time
+        LogUtil.logInfo(logger, getClusterEventId(), String
+            .format("Clean ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+                getPipelineName()));
+        _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
+      }
       refreshAbnormalStateResolverMap(_clusterConfig);
     } else {
-      LogUtil.logInfo(logger, getClusterEventId(), String.format(
-          "No ClusterConfig change for cluster %s, pipeline %s", _clusterName, 
getPipelineName()));
+      LogUtil.logInfo(logger, getClusterEventId(), String
+          .format("No ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+              getPipelineName()));
     }
   }
 
+  // TODO: This function is used to clean up incompatible batched disabled 
instances format for
+  // "DISABLED_INSTANCES" introduced in 1.0.3.0. This temp change shoul dbe 
reverted after 1.0.5.0 \
+  // or later version.
+  private boolean updateBatchDisableFormat(final HelixDataAccessor accessor) {
+    return accessor
+        .updateProperty(accessor.keyBuilder().clusterConfig(), new 
DataUpdater<ZNRecord>() {
+          @Override
+          public ZNRecord update(ZNRecord currentData) {
+            if (currentData == null) {
+              throw new HelixException(
+                  "Cluster: " + _clusterConfig.getClusterName() + ": cluster 
config is null");
+            }
+
+            ClusterConfig clusterConfig = new ClusterConfig(currentData);
+            Map<String, String> disabledInstances = 
clusterConfig.getDisabledInstances();
+            Map<String, String> DisabledInstancesWithInfo =
+                clusterConfig.getDisabledInstancesWithInfo();
+
+            ClusterConfig newClusterConfig = new ClusterConfig(currentData);
+            Map<String, String> newDisabledInstances =
+                new TreeMap<>(newClusterConfig.getDisabledInstances());
+            Map<String, String> newDisabledInstancesWithInfo =
+                new TreeMap<>(newClusterConfig.getDisabledInstancesWithInfo());
+
+            // iterate through all k,v pairs and check for string format.
+            for (Map.Entry<String, String> instanceInfo : 
disabledInstances.entrySet()) {
+              String instanceName = instanceInfo.getKey();
+              if (!StringUtils.isNumeric(instanceInfo.getValue())) {
+                newDisabledInstances.put(instanceName,
+                    
ConfigStringUtil.parseConcatenatedConfig(instanceInfo.getValue()).get(
+                        
ClusterConfig.ClusterConfigProperty.HELIX_ENABLED_DISABLE_TIMESTAMP
+                            .toString()));
+                newDisabledInstancesWithInfo.put(instanceName, 
instanceInfo.getValue());
+              } else {
+                if (!DisabledInstancesWithInfo.containsKey(instanceName)) {
+                  newDisabledInstancesWithInfo.put(instanceName, 
ConfigStringUtil
+                      .concatenateMapping(Collections.singletonMap(
+                          
ClusterConfig.ClusterConfigProperty.HELIX_ENABLED_DISABLE_TIMESTAMP
+                              .toString(), instanceInfo.getValue())));
+                }
+              }
+            }
+            newClusterConfig.setDisabledInstances(newDisabledInstances);
+            
newClusterConfig.setDisabledInstancesWithInfo(newDisabledInstancesWithInfo);
+            return newClusterConfig.getRecord();
+          }
+        }, null);
+  }
+
+  private boolean checkBatchedDisabledInstanceFormat(ClusterConfig 
clusterConfig) {

Review Comment:
   Can we have a better method name? (if we still need this method) "check" 
might be too generic and it's unclear what it really means.



##########
helix-core/src/main/java/org/apache/helix/controller/dataproviders/BaseControllerDataProvider.java:
##########
@@ -241,13 +244,87 @@ private void refreshClusterConfig(final HelixDataAccessor 
accessor,
     if 
(_propertyDataChangedMap.get(HelixConstants.ChangeType.CLUSTER_CONFIG).getAndSet(false))
 {
       _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
       refreshedType.add(HelixConstants.ChangeType.CLUSTER_CONFIG);
+      // TODO: This is a temp function to clean up incompatible batched 
disabled instances format.
+      // Remove in later version.
+      if (checkBatchedDisabledInstanceFormat(_clusterConfig) && 
updateBatchDisableFormat(
+          accessor)) {
+        // read from zkz one more time
+        LogUtil.logInfo(logger, getClusterEventId(), String
+            .format("Clean ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+                getPipelineName()));
+        _clusterConfig = 
accessor.getProperty(accessor.keyBuilder().clusterConfig());
+      }
       refreshAbnormalStateResolverMap(_clusterConfig);
     } else {
-      LogUtil.logInfo(logger, getClusterEventId(), String.format(
-          "No ClusterConfig change for cluster %s, pipeline %s", _clusterName, 
getPipelineName()));
+      LogUtil.logInfo(logger, getClusterEventId(), String
+          .format("No ClusterConfig change for cluster %s, pipeline %s", 
_clusterName,
+              getPipelineName()));
     }
   }
 
+  // TODO: This function is used to clean up incompatible batched disabled 
instances format for
+  // "DISABLED_INSTANCES" introduced in 1.0.3.0. This temp change shoul dbe 
reverted after 1.0.5.0 \
+  // or later version.
+  private boolean updateBatchDisableFormat(final HelixDataAccessor accessor) {
+    return accessor
+        .updateProperty(accessor.keyBuilder().clusterConfig(), new 
DataUpdater<ZNRecord>() {
+          @Override
+          public ZNRecord update(ZNRecord currentData) {
+            if (currentData == null) {
+              throw new HelixException(
+                  "Cluster: " + _clusterConfig.getClusterName() + ": cluster 
config is null");
+            }
+
+            ClusterConfig clusterConfig = new ClusterConfig(currentData);
+            Map<String, String> disabledInstances = 
clusterConfig.getDisabledInstances();
+            Map<String, String> DisabledInstancesWithInfo =

Review Comment:
   nit, naming convention



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to