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 8e2d081fa8 Review "Send broadcasts and pings to the checked member 
snapshot"
8e2d081fa8 is described below

commit 8e2d081fa8a2df4216201a166a72f2cb09653e23
Author: Mark Thomas <[email protected]>
AuthorDate: Fri Oct 23 11:48:15 2026 +0100

    Review "Send broadcasts and pings to the checked member snapshot"
    
    Use a membership snapshot in a few other places
---
 .../group/interceptors/NonBlockingCoordinator.java | 15 +++-
 .../TestNonBlockingCoordinatorPriority.java        | 88 ++++++++++++++++++++++
 2 files changed, 99 insertions(+), 4 deletions(-)

diff --git 
a/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
 
b/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
index 3f77101858..f7a9d235a5 100644
--- 
a/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
+++ 
b/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java
@@ -658,7 +658,12 @@ public class NonBlockingCoordinator extends 
ChannelInterceptorBase {
      * @return Member
      */
     public Member getCoordinator() {
-        return (view != null && view.hasMembers()) ? view.getMembers()[0] : 
null;
+        Membership currentView = view;
+        if (currentView == null) {
+            return null;
+        }
+        Member[] members = currentView.getMembers();
+        return members.length > 0 ? members[0] : null;
     }
 
     /**
@@ -667,7 +672,8 @@ public class NonBlockingCoordinator extends 
ChannelInterceptorBase {
      * @return The array of members in the current view
      */
     public Member[] getView() {
-        return (view != null && view.hasMembers()) ? view.getMembers() : new 
Member[0];
+        Membership currentView = view;
+        return currentView == null ? new Member[0] : currentView.getMembers();
     }
 
     /**
@@ -828,10 +834,11 @@ public class NonBlockingCoordinator extends 
ChannelInterceptorBase {
      */
     public boolean isHighest() {
         Member local = getLocalMember(false);
-        if (membership.getMembers().length == 0) {
+        Member[] members = membership.getMembers();
+        if (members.length == 0) {
             return true;
         } else {
-            return AbsoluteOrder.comp.compare(local, 
membership.getMembers()[0]) <= 0;
+            return AbsoluteOrder.comp.compare(local, members[0]) <= 0;
         }
     }
 
diff --git 
a/test/org/apache/catalina/tribes/group/interceptors/TestNonBlockingCoordinatorPriority.java
 
b/test/org/apache/catalina/tribes/group/interceptors/TestNonBlockingCoordinatorPriority.java
index 5716e87971..060b73b92e 100644
--- 
a/test/org/apache/catalina/tribes/group/interceptors/TestNonBlockingCoordinatorPriority.java
+++ 
b/test/org/apache/catalina/tribes/group/interceptors/TestNonBlockingCoordinatorPriority.java
@@ -16,11 +16,15 @@
  */
 package org.apache.catalina.tribes.group.interceptors;
 
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.membership.MemberImpl;
+import org.apache.catalina.tribes.membership.Membership;
 
 public class TestNonBlockingCoordinatorPriority {
 
@@ -45,4 +49,88 @@ public class TestNonBlockingCoordinatorPriority {
         Assert.assertFalse("A null local membership must never be outranked",
                 coordinator.hasHigherPriority(new Member[] { high }, null));
     }
+
+    @Test
+    public void testIsHighestUsesSingleMembershipSnapshot() throws Exception {
+        Member local = new MemberImpl("10.0.0.1", 4000, -1);
+        Member other = new MemberImpl("10.0.0.2", 4000, -1);
+        AtomicInteger snapshots = new AtomicInteger();
+        Membership changingMembership = new Membership(local) {
+
+            @Override
+            public Member[] getMembers() {
+                if (snapshots.incrementAndGet() == 1) {
+                    return new Member[] { other };
+                }
+                return new Member[0];
+            }
+        };
+        NonBlockingCoordinator coordinator = new NonBlockingCoordinator() {
+
+            {
+                membership = changingMembership;
+            }
+
+            @Override
+            public Member getLocalMember(boolean incAlive) {
+                return local;
+            }
+        };
+
+        Assert.assertTrue(coordinator.isHighest());
+        Assert.assertEquals(1, snapshots.get());
+    }
+
+    @Test
+    public void testGetCoordinatorUsesSingleViewSnapshot() throws Exception {
+        Member local = new MemberImpl("10.0.0.1", 4000, -1);
+        Member other = new MemberImpl("10.0.0.2", 4000, -1);
+        AtomicInteger snapshots = new AtomicInteger();
+        Membership changingView = new Membership(local) {
+
+            @Override
+            public Member[] getMembers() {
+                if (snapshots.incrementAndGet() == 1) {
+                    return new Member[] { other };
+                }
+                return new Member[0];
+            }
+        };
+        NonBlockingCoordinator coordinator = new NonBlockingCoordinator();
+
+        Assert.assertNull(coordinator.getCoordinator());
+
+        coordinator.view = changingView;
+        Assert.assertSame(other, coordinator.getCoordinator());
+        Assert.assertEquals(1, snapshots.get());
+
+        coordinator.view = new Membership(local);
+        Assert.assertNull(coordinator.getCoordinator());
+    }
+
+    @Test
+    public void testGetViewUsesSingleViewSnapshot() throws Exception {
+        Member local = new MemberImpl("10.0.0.1", 4000, -1);
+        Member other = new MemberImpl("10.0.0.2", 4000, -1);
+        AtomicReference<NonBlockingCoordinator> coordinatorReference = new 
AtomicReference<>();
+        Membership changingView = new Membership(local) {
+
+            @Override
+            public boolean hasMembers() {
+                coordinatorReference.get().view = null;
+                return true;
+            }
+
+            @Override
+            public Member[] getMembers() {
+                return new Member[] { other };
+            }
+        };
+        NonBlockingCoordinator coordinator = new NonBlockingCoordinator();
+        coordinator.view = changingView;
+        coordinatorReference.set(coordinator);
+
+        Assert.assertArrayEquals(new Member[] { other }, 
coordinator.getView());
+        Assert.assertSame(changingView, coordinator.view);
+    }
 }


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

Reply via email to