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 685e4bfd80 Review "Fail clearly when static membership starts without
..."
685e4bfd80 is described below
commit 685e4bfd806d655226f0b414987ead31c2126de9
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]