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