This is an automated email from the ASF dual-hosted git repository.

markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 963711cb64 Expand the Javadoc for DNSMembershipProvider
963711cb64 is described below

commit 963711cb64e720bd38f55e64566cb940f3516fa0
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Jul 8 11:46:27 2026 +0100

    Expand the Javadoc for DNSMembershipProvider
---
 .../membership/cloud/CloudMembershipService.java       |  5 +++--
 .../tribes/membership/cloud/DNSMembershipProvider.java | 18 ++++++++++++++++--
 webapps/docs/changelog.xml                             |  5 +++++
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
index 1b1d96be92..737503dd50 100644
--- 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
+++ 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
@@ -33,8 +33,9 @@ import org.apache.juli.logging.LogFactory;
  * A {@link org.apache.catalina.tribes.MembershipService} that uses Kubernetes 
API(default) or DNS to retrieve the
  * members of a cluster.<br>
  * <p>
- * The default implementation of the MembershipProvider component is the 
{@link KubernetesMembershipProvider}. The
- * MembershipProvider can be configured by the 
<code>membershipProviderClassName</code> property. Possible shortcuts are
+ * The default (and recommended) implementation of the MembershipProvider 
component is the
+ * {@link KubernetesMembershipProvider}. The MembershipProvider can be 
configured by the
+ * <code>membershipProviderClassName</code> property. Possible shortcuts are
  * {@code kubernetes} and {@code dns}. For dns look at the {@link 
DNSMembershipProvider}.
  * </p>
  * <p>
diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java 
b/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
index c3731aceb0..d9be130e9f 100644
--- 
a/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
+++ 
b/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
@@ -32,7 +32,21 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 
 /**
- * A {@link org.apache.catalina.tribes.MembershipProvider} that uses DNS to 
retrieve the members of a cluster.<br>
+ * A {@link org.apache.catalina.tribes.MembershipProvider} that uses DNS to 
retrieve the members of a cluster.
+ * <p>
+ * Relying solely on DNS to determine cluster membership requires that all DNS 
caching between the cluster nodes and the
+ * authoritative name server must honour the TTL set by the authoritative name 
server. Experience has shown that that is
+ * often not the case. Therefore, to ensure that new cluster members are not 
excluded from the cluster due to a stale
+ * DNS cache, this membership service accepts messages from any node 
regardless of whether it or not is listed as a
+ * cluster member in DNS and adds that node to the cluster. The DNS entry is, 
effectively, used by new nodes to identify
+ * the other nodes in the cluster to which cluster messages should be sent.
+ * <p>
+ * If more control is required over cluster membership, users are strongly 
encouraged to use
+ * {@link KubernetesMembershipProvider} instead. Alternatively, the
+ * {@link org.apache.catalina.tribes.group.interceptors.EncryptInterceptor} 
may be used to ensure that only nodes with
+ * knowledge of the shared key are able to participate in the cluster.
+ * <p>
+ * TODO: Make the "accept messages from any node and add that node to the 
cluster" behaviour optional.
  * <p>
  * <strong>Configuration example for Kubernetes</strong>
  * </p>
@@ -202,7 +216,7 @@ public class DNSMembershipProvider extends 
CloudMembershipProvider {
             byte[] host = sender.getHost();
             int i = 0;
             StringBuilder buf = new StringBuilder();
-            if (host.length > 0 ) {
+            if (host.length > 0) {
                 buf.append(host[i++] & 0xff);
                 for (; i < host.length; i++) {
                     buf.append('.').append(host[i] & 0xff);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index fe9a8b548a..1a684483b6 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -137,6 +137,11 @@
         algorithms. Also explicitly state that the replay protection is only
         effective for non-malleable algorithms. (markt)
       </add>
+      <add>
+        Expand the Javadoc for the <code>DNSMembershipProvider</code> in
+        particular explaining its behaviour and providing configuration advice
+        if control more over cluster membership is required. (markt)
+      </add>
     </changelog>
   </subsection>
 </section>


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

Reply via email to