diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java index b0fbfe30b93f..190c542809ff 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java @@ -19,6 +19,7 @@ import static org.apache.hadoop.hdds.protocol.DatanodeDetails.Port.Name.HTTP; import static org.apache.hadoop.hdds.protocol.DatanodeDetails.Port.Name.HTTPS; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_ADDRESS_KEY; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_NODES_KEY; import static org.apache.hadoop.hdds.utils.HddsServerUtil.getRemoteUser; import static org.apache.hadoop.hdds.utils.HddsServerUtil.getScmSecurityClientWithMaxRetry; @@ -93,6 +94,7 @@ import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet; import org.apache.hadoop.ozone.container.common.volume.StorageVolume; import org.apache.hadoop.ozone.container.diskbalancer.DiskBalancerProtocolServer; +import org.apache.hadoop.ozone.ha.ConfUtils; import org.apache.hadoop.ozone.util.OzoneNetUtils; import org.apache.hadoop.ozone.util.ShutdownHookManager; import org.apache.hadoop.security.SecurityUtil; @@ -313,9 +315,11 @@ public String getNamespace() { this::reconfigReplicationStreamsLimit); scmServiceId = HddsUtils.getScmServiceId(conf); + if (scmServiceId != null) { - reconfigurationHandler.register(OZONE_SCM_NODES_KEY + "." + scmServiceId, - this::reconfigScmNodes); + reconfigurationHandler + .registerPrefix(ConfUtils.addKeySuffixes(OZONE_SCM_ADDRESS_KEY, scmServiceId)) + .register(OZONE_SCM_NODES_KEY + "." + scmServiceId, this::reconfigScmNodes); } reconfigurationHandler.setReconfigurationCompleteCallback(reconfigurationHandler.defaultLoggingCallback()); diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/conf/ReconfigurationHandler.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/conf/ReconfigurationHandler.java index 979525f7a1a7..32eb67c0797f 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/conf/ReconfigurationHandler.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/conf/ReconfigurationHandler.java @@ -23,11 +23,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.function.BiConsumer; import java.util.function.UnaryOperator; import org.apache.hadoop.conf.Configuration; @@ -51,6 +53,7 @@ public class ReconfigurationHandler extends ReconfigurableBase private final CheckedConsumer requireAdminPrivilege; private final Map> properties = new ConcurrentHashMap<>(); + private final Set prefixProperties = new ConcurrentSkipListSet<>(); private final List completeCallbacks = new ArrayList<>(); private BiConsumer reconfigurationStatusListener; @@ -122,6 +125,13 @@ public ReconfigurationHandler register(ReconfigurableConfig config) { return this; } + public ReconfigurationHandler registerPrefix(String prefixProperty) { + prefixProperties.add( + prefixProperty.endsWith(".") ? prefixProperty : prefixProperty.concat(".") + ); + return this; + } + @Override protected Configuration getNewConf() { return new OzoneConfiguration(); @@ -129,7 +139,19 @@ protected Configuration getNewConf() { @Override public Set getReconfigurableProperties() { - return unmodifiableSet(properties.keySet()); + Set reconfigureProperties = new HashSet<>(properties.keySet()); + reconfigureProperties.addAll(prefixProperties); + return unmodifiableSet(reconfigureProperties); + } + + @Override + public boolean isPropertyReconfigurable(String property) { + for (String prefixProperty : prefixProperties) { + if (property.startsWith(prefixProperty)) { + return true; + } + } + return properties.containsKey(property); } @Override @@ -164,7 +186,9 @@ public ReconfigurationTaskStatus getReconfigureStatus() throws IOException { @Override public List listReconfigureProperties() throws IOException { requireAdminPrivilege.accept("listReconfigurableProperties"); - return new ArrayList<>(new TreeSet<>(getReconfigurableProperties())); + Set reconfigureProperties = new TreeSet<>(getReconfigurableProperties()); + reconfigureProperties.addAll(prefixProperties); + return new ArrayList<>(reconfigureProperties); } @Override diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestDatanodeSCMNodesReconfiguration.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestDatanodeSCMNodesReconfiguration.java index d2c90c21d658..6f38d89fb2b6 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestDatanodeSCMNodesReconfiguration.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestDatanodeSCMNodesReconfiguration.java @@ -128,7 +128,9 @@ void testSCMMigration() throws Exception { for (StorageContainerManager scm : cluster.getStorageContainerManagers()) { String scmAddrKey = ConfUtils.addKeySuffixes( ScmConfigKeys.OZONE_SCM_ADDRESS_KEY, scmServiceId, scm.getSCMNodeId()); - datanode.getConf().set(scmAddrKey, cluster.getConf().get(scmAddrKey)); + assertTrue(datanode.getReconfigurationHandler().isPropertyReconfigurable(scmAddrKey)); + datanode.getReconfigurationHandler().reconfigureProperty(scmAddrKey, + cluster.getConf().get(scmAddrKey)); String dnPortKey = ConfUtils.addKeySuffixes( ScmConfigKeys.OZONE_SCM_DATANODE_ADDRESS_KEY, scmServiceId, scm.getSCMNodeId()); datanode.getConf().set(dnPortKey, cluster.getConf().get(dnPortKey)); @@ -273,7 +275,9 @@ void testAddAndRemoveOneSCM() throws Exception { for (StorageContainerManager scm : cluster.getStorageContainerManagers()) { String scmAddrKey = ConfUtils.addKeySuffixes( ScmConfigKeys.OZONE_SCM_ADDRESS_KEY, scmServiceId, scm.getSCMNodeId()); - datanode.getConf().set(scmAddrKey, cluster.getConf().get(scmAddrKey)); + assertTrue(datanode.getReconfigurationHandler().isPropertyReconfigurable(scmAddrKey)); + datanode.getReconfigurationHandler().reconfigureProperty(scmAddrKey, + cluster.getConf().get(scmAddrKey)); String dnPortKey = ConfUtils.addKeySuffixes( ScmConfigKeys.OZONE_SCM_DATANODE_ADDRESS_KEY, scmServiceId, scm.getSCMNodeId()); datanode.getConf().set(dnPortKey, cluster.getConf().get(dnPortKey));