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

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


The following commit(s) were added to refs/heads/10.1.x by this push:
     new a843d1b1a8 Review "Fail clearly when static membership starts without 
..."
a843d1b1a8 is described below

commit a843d1b1a80c7e1e2aa08fb886db75973d96718e
Author: Mark Thomas <[email protected]>
AuthorDate: Thu Oct 22 18:52:17 2026 +0100

    Review "Fail clearly when static membership starts without ..."
    
    Fix similar issue in CloudMembershipService
    
    Co-authored by: Claude / Sonnet 5.5
---
 .../membership/cloud/CloudMembershipService.java    |  7 +++++++
 .../tribes/membership/cloud/LocalStrings.properties |  1 +
 .../cloud/TestKubernetesMembershipProvider.java     | 21 +++++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
index 15d0fd45b0..3037e9feb5 100644
--- 
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
+++ 
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
@@ -224,6 +224,13 @@ public class CloudMembershipService extends 
MembershipServiceBase implements Clo
     }
 
     private void createOrUpdateLocalMember() throws IOException {
+        // The listen properties are provided by setLocalMemberProperties(), 
which is called when the channel receiver
+        // starts. Starting the membership without them leaves the local 
member unknown.
+        for (String name : new String[] { "tcpListenHost", "tcpListenPort", 
"tcpSecurePort", "udpListenPort" }) {
+            if (properties.getProperty(name) == null) {
+                throw new 
IllegalStateException(sm.getString("cloudMembershipService.localMemberNotSet", 
name));
+            }
+        }
         String host = properties.getProperty("tcpListenHost");
         int port = Integer.parseInt(properties.getProperty("tcpListenPort"));
         int securePort = 
Integer.parseInt(properties.getProperty("tcpSecurePort"));
diff --git 
a/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties 
b/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties
index 1b18dd9f7a..ee641fcaeb 100644
--- a/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties
@@ -29,6 +29,7 @@ cloudMembershipProvider.noDigest=Unable to create an MD5 
MessageDigest instance
 cloudMembershipProvider.remove=Member [{0}] disappeared
 cloudMembershipProvider.start=Namespace [{0}] set; clustering enabled
 
+cloudMembershipService.localMemberNotSet=The local member has not been 
resolved as the property [{0}] is not set. Either start the channel with a 
level that includes the receiver or configure the local member properties 
explicitly.
 cloudMembershipService.stopFail=Unable to stop the cloud membership service, 
level: [{0}]
 
 dnsMembershipProvider.dnsError=Error getting hosts address list for namespace 
[{0}]
diff --git 
a/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
 
b/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
index b54cae7de6..9fc962c54e 100644
--- 
a/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
+++ 
b/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
@@ -61,4 +61,25 @@ public class TestKubernetesMembershipProvider {
             Assert.assertTrue(expected.getCause() instanceof IOException);
         }
     }
+
+    /*
+     * The local member is resolved when the channel receiver starts, or is 
configured explicitly. Starting the
+     * membership alone, without either, must fail with a clear error rather 
than a NumberFormatException from a
+     * missing property, and must not leave a provider behind.
+     */
+    @Test
+    public void testStartWithoutLocalMemberPropertiesFails() throws Exception {
+        GroupChannel channel = new GroupChannel();
+        channel.setName("TestKubernetesMembershipProvider-" + 
System.nanoTime());
+
+        CloudMembershipService service = new CloudMembershipService();
+        service.setChannel(channel);
+        try {
+            service.start(CloudMembershipService.MBR_RX);
+            Assert.fail("start() must fail when the local member properties 
are not set");
+        } catch (IllegalStateException expected) {
+            // A clear configuration error rather than a NumberFormatException
+        }
+        Assert.assertNull(service.getMembershipProvider());
+    }
 }


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

Reply via email to