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

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


The following commit(s) were added to refs/heads/main by this push:
     new 79d3d976cd Fixes for MembershipServiceBase with TLS-PSK
79d3d976cd is described below

commit 79d3d976cdbae62bad97b7f750638ea4fe5dee6a
Author: Mark Thomas <[email protected]>
AuthorDate: Fri Sep 25 15:25:27 2026 +0100

    Fixes for MembershipServiceBase with TLS-PSK
---
 .../tribes/membership/LocalStrings.properties        |  1 +
 .../tribes/membership/StaticMembershipProvider.java  | 20 ++++++++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/java/org/apache/catalina/tribes/membership/LocalStrings.properties 
b/java/org/apache/catalina/tribes/membership/LocalStrings.properties
index 6ab3bf6ff5..b009a2aef4 100644
--- a/java/org/apache/catalina/tribes/membership/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/membership/LocalStrings.properties
@@ -66,6 +66,7 @@ staticMembershipProvider.heartbeat.failed=Unable to send 
StaticMembershipProvide
 staticMembershipProvider.leftOver.ignored=Message[{0}] is ignored.
 staticMembershipProvider.pingThread.failed=Unable to send ping.
 staticMembershipProvider.replyRequest.ignored=Message[{0}] is ignored.
+staticMembershipProvider.startMembership.failed=Unable to notify one or more 
static members that this member has started. This is expected if a peer has not 
started yet and will be retried on the next ping.
 staticMembershipProvider.startMembership.noReplies=Received 0 replies, 
probably a timeout.
 staticMembershipProvider.stopMembership.sendFailed=Unable to send stop 
membership message.
 
diff --git 
a/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java 
b/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java
index 3e94478057..fdfc54bc41 100644
--- a/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java
+++ b/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java
@@ -32,6 +32,7 @@ import 
org.apache.catalina.tribes.ChannelException.FaultyMember;
 import org.apache.catalina.tribes.ChannelListener;
 import org.apache.catalina.tribes.Heartbeat;
 import org.apache.catalina.tribes.Member;
+import org.apache.catalina.tribes.group.GroupChannel;
 import org.apache.catalina.tribes.group.Response;
 import org.apache.catalina.tribes.group.RpcCallback;
 import org.apache.catalina.tribes.group.RpcChannel;
@@ -147,7 +148,15 @@ public class StaticMembershipProvider extends 
MembershipProviderBase
         }
         startLevel = (startLevel | level);
         if (startLevel == (Channel.MBR_RX_SEQ | Channel.MBR_TX_SEQ)) {
-            startMembership(getAliveMembers(staticMembers.toArray(new 
Member[0])));
+            try {
+                startMembership(getAliveMembers(staticMembers.toArray(new 
Member[0])));
+            } catch (ChannelException ce) {
+                // A member that was reachable at the liveness check above may 
still fail the actual
+                // RPC (e.g. it has not finished its own startup yet). That is 
expected during cluster
+                // start-up and must not prevent this member from starting; 
the next ping will pick up
+                // any member that is not yet up.
+                
log.warn(sm.getString("staticMembershipProvider.startMembership.failed"), ce);
+            }
             running = true;
             if (thread == null && useThread) {
                 thread = new PingThread();
@@ -418,11 +427,18 @@ public class StaticMembershipProvider extends 
MembershipProviderBase
     }
 
     private Member[] getAliveMembers(Member[] members) {
+        boolean channelSecure = channel instanceof GroupChannel groupChannel 
&& groupChannel.getSecure();
         List<Member> aliveMembers = new ArrayList<>();
         for (Member member : members) {
+            boolean useSecurePort = channelSecure || member.getSecurePort() >= 
0 && member.getPort() < 0;
+            int port = useSecurePort ? member.getSecurePort() : 
member.getPort();
+            if (port < 0) {
+                // no usable port to connect to, so the member can't be checked
+                continue;
+            }
             try (Socket socket = new Socket()) {
                 InetAddress ia = InetAddress.getByAddress(member.getHost());
-                InetSocketAddress addr = new InetSocketAddress(ia, 
member.getPort());
+                InetSocketAddress addr = new InetSocketAddress(ia, port);
                 socket.connect(addr, connectTimeout);
                 aliveMembers.add(member);
             } catch (Throwable t) {


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

Reply via email to