hani-fouladgar commented on code in PR #11218:
URL: https://github.com/apache/ozone/pull/11218#discussion_r4039733952


##########
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/proxy/SCMFailoverProxyProviderBase.java:
##########
@@ -188,16 +188,82 @@ protected synchronized void loadConfigs() {
 
         String scmServiceId = scmNodeInfo.getServiceId();
         String scmNodeId = scmNodeInfo.getNodeId();
-        scmNodeIds.add(scmNodeId);
+        newScmNodeIds.add(scmNodeId);
         // Preserve the original config string so DNS can be re-resolved
         // on connection failure when the SCM peer is rescheduled to a
         // new IP (Kubernetes pod-IP-change recovery). See
         // refreshProxyAddressIfChanged(String).
         SCMProxyInfo scmProxyInfo = new SCMProxyInfo(scmServiceId, scmNodeId,
             protocolAddr, protocolAddress);
-        scmProxyInfoMap.put(scmNodeId, scmProxyInfo);
+        newScmProxyInfoMap.put(scmNodeId, scmProxyInfo);
+      }
+    }
+
+    // Commit only after the whole configuration parsed successfully. A dynamic
+    // reconfiguration that adds an SCM needs two properties updated (the node
+    // list and the new node's address) and they can be applied in either 
order;
+    // if the node list is updated first, buildNodeInfo above throws and the
+    // previous state is left intact so the operator can retry.
+    scmNodeIds = newScmNodeIds;
+    scmProxyInfoMap.clear();
+    scmProxyInfoMap.putAll(newScmProxyInfoMap);
+  }
+
+  /**
+   * Reload the SCM node list and their addresses from the (already updated)
+   * configuration. Used for dynamic reconfiguration of
+   * {@code ozone.scm.nodes.<serviceId>} and
+   * {@code ozone.scm.address.<serviceId>.<nodeId>} so that a newly added SCM
+   * can be reached without restarting the service. Cached proxies for removed
+   * nodes, or nodes whose address changed, are stopped so that the next call
+   * dials the fresh address. If the new configuration is incomplete this 
throws
+   * and leaves the current state intact.
+   */
+  public synchronized void changeConfig() {

Review Comment:
   Done. Split out a pure buildConfigs() that does the DNS resolution and 
touches no shared state; changeConfig() now calls it before taking the monitor, 
and defers RPC.stopProxy until after the monitor is released. A slow resolver 
for a new SCM host no longer blocks concurrent SCM calls. Mirrors 
refreshProxyAddressIfChanged. 



-- 
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