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

rmaucher pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit f5974a9de7529480d7bd5f851caa41c23f8bbb62
Author: opencode <[email protected]>
AuthorDate: Sun Oct 11 14:18:31 2026 +0200

    Send broadcasts and pings to the checked member snapshot
    
    The broadcast snapshots the channel members and returns early when the
    snapshot is empty, but the non RPC branch then sent with a fresh read
    of the channel members. A membership change between the check and the
    send moved the message to another member set than the checked one, or
    lost it entirely when the fresh read came back empty, which silently
    dropped the stop notification of the breakdown when the last members
    had just left. The ping had the same double read for its RPC send.
    
    The send now uses the members that were checked to be non empty.
---
 java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java 
b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
index 3e1cb1c351..a75198c0a9 100644
--- a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
+++ b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
@@ -320,10 +320,11 @@ public abstract class AbstractReplicatedMap<K, V>
     protected void ping(long timeout) throws ChannelException {
         MapMessage msg = new MapMessage(this.mapContextName, 
MapMessage.MSG_PING, false, null, null, null,
                 channel.getLocalMember(false), null);
-        if (channel.getMembers().length > 0) {
+        Member[] channelMembers = channel.getMembers();
+        if (channelMembers.length > 0) {
             try {
                 // send a ping, wait for all nodes to reply
-                Response[] resp = rpcChannel.send(channel.getMembers(), msg, 
RpcChannel.ALL_REPLY, (channelSendOptions),
+                Response[] resp = rpcChannel.send(channelMembers, msg, 
RpcChannel.ALL_REPLY, (channelSendOptions),
                         (int) accessTimeout);
                 for (Response response : resp) {
                     MapMessage mapMsg = (MapMessage) response.getMessage();
@@ -427,7 +428,7 @@ public abstract class AbstractReplicatedMap<K, V>
                 
log.warn(sm.getString("abstractReplicatedMap.broadcast.noReplies"));
             }
         } else {
-            channel.send(channel.getMembers(), msg, channelSendOptions);
+            channel.send(members, msg, channelSendOptions);
         }
     }
 


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

Reply via email to