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

remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new ae050b7  Refactor to reduce code duplication
ae050b7 is described below

commit ae050b72d6d3929084aece5dc15009e2583e87ce
Author: remm <r...@apache.org>
AuthorDate: Tue Jan 26 11:27:20 2021 +0100

    Refactor to reduce code duplication
    
    This is a workaround for DNS caching which would make the updates fail.
    The Kubernetes provider which uses the API seems more dependable
    overall, although it requires enabling the necessary access permission.
---
 .../membership/cloud/CloudMembershipProvider.java  | 60 ++++++++++++----------
 .../membership/cloud/DNSMembershipProvider.java    | 31 ++++-------
 webapps/docs/changelog.xml                         |  8 +++
 3 files changed, 49 insertions(+), 50 deletions(-)

diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java
index 3c6315d..319d130 100644
--- 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java
+++ 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java
@@ -127,38 +127,12 @@ public abstract class CloudMembershipProvider extends 
MembershipProviderBase imp
         Member[] announcedMembers = fetchMembers();
         // Add new members or refresh the members in the membership
         for (Member member : announcedMembers) {
-            if (membership.memberAlive(member)) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Member added: " + member);
-                }
-                Runnable r = () -> {
-                    String name = Thread.currentThread().getName();
-                    try {
-                        
Thread.currentThread().setName("CloudMembership-memberAdded");
-                        membershipListener.memberAdded(member);
-                    } finally {
-                        Thread.currentThread().setName(name);
-                    }
-                };
-                executor.execute(r);
-            }
+            updateMember(member, true);
         }
         // Remove non refreshed members from the membership
         Member[] expired = membership.expire(expirationTime);
         for (Member member : expired) {
-            if (log.isDebugEnabled()) {
-                log.debug("Member disappeared: " + member);
-            }
-            Runnable r = () -> {
-                String name = Thread.currentThread().getName();
-                try {
-                    
Thread.currentThread().setName("CloudMembership-memberDisappeared");
-                    membershipListener.memberDisappeared(member);
-                } finally {
-                    Thread.currentThread().setName(name);
-                }
-            };
-            executor.execute(r);
+            updateMember(member, false);
         }
     }
 
@@ -168,6 +142,36 @@ public abstract class CloudMembershipProvider extends 
MembershipProviderBase imp
      */
     protected abstract Member[] fetchMembers();
 
+    /**
+     * Add or remove specified member.
+     * @param member the member to add
+     * @param add true if the member is added, false otherwise
+     */
+    protected void updateMember(Member member, boolean add) {
+        if (add && !membership.memberAlive(member)) {
+            return;
+        }
+        if (log.isDebugEnabled()) {
+            String message = add ? "Member added: " + member : "Member 
disappeared: " + member;
+            log.debug(message);
+        }
+        Runnable r = () -> {
+            String name = Thread.currentThread().getName();
+            try {
+                String threadName = add ? "CloudMembership-memberAdded" : 
"CloudMembership-memberDisappeared";
+                Thread.currentThread().setName(threadName);
+                if (add) {
+                    membershipListener.memberAdded(member);
+                } else {
+                    membershipListener.memberDisappeared(member);
+                }
+            } finally {
+                Thread.currentThread().setName(name);
+            }
+        };
+        executor.execute(r);
+    }
+
     @Override
     public void messageReceived(Serializable msg, Member sender) {
     }
diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java 
b/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
index 5095b35..543820b 100644
--- 
a/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
+++ 
b/java/org/apache/catalina/tribes/membership/cloud/DNSMembershipProvider.java
@@ -22,8 +22,8 @@ import java.io.Serializable;
 import java.net.InetAddress;
 import java.net.URLEncoder;
 import java.net.UnknownHostException;
-import java.util.Arrays;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.catalina.tribes.Member;
@@ -162,19 +162,19 @@ public class DNSMembershipProvider extends 
CloudMembershipProvider {
 
     @Override
     public boolean accept(Serializable msg, Member sender) {
-        // check is the sender is in the member list.
+        // Check if the sender is in the member list.
         boolean found = false;
         Member[] members = membership.getMembers();
         if (members != null) {
             for (Member member : members) {
-               if (Arrays.equals(sender.getHost(), sender.getHost()) && 
sender.getPort() == member.getPort()) {
+                if (Arrays.equals(sender.getHost(), sender.getHost())
+                        && sender.getPort() == member.getPort()) {
                     found = true;
                     break;
                 }
             }
-        } 
+        }
         if (!found) {
-            // add it and it's thread
             MemberImpl member = new MemberImpl();
             member.setHost(sender.getHost());
             member.setPort(sender.getPort());
@@ -182,27 +182,14 @@ public class DNSMembershipProvider extends 
CloudMembershipProvider {
             int i = 0;
             StringBuilder buf = new StringBuilder();
             buf.append(host[i++] & 0xff);
-           for (; i<host.length; i++) {
-                 buf.append(".").append(host[i] & 0xff);
-           }
+            for (; i < host.length; i++) {
+                buf.append(".").append(host[i] & 0xff);
+            }
 
             byte[] id = md5.digest(buf.toString().getBytes());
             member.setUniqueId(id);
             member.setMemberAliveTime(-1);
-            membership.memberAlive(member);
-            Runnable r = new Runnable() {
-                @Override
-                public void run(){
-                    String name = Thread.currentThread().getName();
-                    try {
-                        
Thread.currentThread().setName("CloudMembership-memberAdded");
-                        membershipListener.memberAdded(member);
-                    } finally {
-                        Thread.currentThread().setName(name);
-                    }
-                }
-            };
-            executor.execute(r);
+            updateMember(member, true);
         }
         return false;
     }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 22f4853..b0cf1e4 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -209,6 +209,14 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Tribes">
+    <changelog>
+      <fix>
+        Work around DNS caching for the DNS provider of the cloud membership.
+        (jfclere)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Other">
     <changelog>
       <add>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to