zpinto commented on code in PR #2772:
URL: https://github.com/apache/helix/pull/2772#discussion_r1546830360
##########
helix-core/src/main/java/org/apache/helix/model/InstanceConfig.java:
##########
@@ -777,6 +850,38 @@ public boolean
validateTopologySettingInInstanceConfig(ClusterConfig clusterConf
return true;
}
+ /**
+ * Overwrite the InstanceConfigProperties from the given InstanceConfig to
this InstanceConfig.
+ * The merge is done by overwriting the properties in this InstanceConfig
with the properties
+ * from the given InstanceConfig. {@link #NON_OVERWRITABLE_PROPERTIES} will
not be overridden.
+ *
+ * @param overwritingInstanceConfig the InstanceConfig to override into this
InstanceConfig
+ */
+ public void overwriteInstanceConfig(InstanceConfig
overwritingInstanceConfig) {
+ for (InstanceConfigProperty keyEnum : InstanceConfigProperty.values()) {
+ if (NON_OVERWRITABLE_PROPERTIES.contains(keyEnum)) {
+ continue;
+ }
+
+ String key = keyEnum.toString();
+ // Add key value pair if it exists in overwritingInstanceConfig and
remove it if it doesn't
+ // exist in overwritingInstanceConfig but does exist in this
InstanceConfig.
+ if
(overwritingInstanceConfig.getRecord().getSimpleFields().containsKey(key)) {
+ _record.setSimpleField(key,
overwritingInstanceConfig.getRecord().getSimpleField(key));
+ } else if (_record.getSimpleFields().containsKey(key)) {
+ _record.getSimpleFields().remove(key);
+ } else if
(overwritingInstanceConfig.getRecord().getListFields().containsKey(key)) {
+ _record.setListField(key,
overwritingInstanceConfig.getRecord().getListField(key));
+ } else if (_record.getListFields().containsKey(key)) {
+ _record.getListFields().remove(key);
+ } else if
(overwritingInstanceConfig.getRecord().getMapFields().containsKey(key)) {
+ _record.setMapField(key,
overwritingInstanceConfig.getRecord().getMapField(key));
+ } else if (_record.getMapFields().containsKey(key)) {
+ _record.getMapFields().remove(key);
+ }
Review Comment:
The reason for this is that if the field has a default when it is not
present in SimpleField, ListField, or MapField map.
Ex.
1. Instance A will overwrite Instance B
2. Instance B has InstanceOperation set to SWAP_IN
3. Instance A has InstanceOperation unset (which means ENABLE)
4. if we addAll on defined keys then Instance B will still have
InstanceOperation set to SWAP_IN which is not right (same issue for other
fields that have defaults if the key doesn't exist)
I have refactored method to be less complex.
It will remove all overwritable fields from this and then set them if the
are in the overwriting InstanceConfig.
--
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]