This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push:
new 30677a7e7a Review "Send broadcasts and pings to the checked member
snapshot"
30677a7e7a is described below
commit 30677a7e7a8a672305a21143f07cf39c79da2298
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]