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 b7c422110d Review "Fail clearly when static membership starts without
..."
b7c422110d is described below
commit b7c422110d489714d7ff78780fc14d959a9a38c5
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 61db668616..07b1e38686 100644
---
a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
+++
b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipService.java
@@ -227,6 +227,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 a55ca89c11..0ee6046397 100644
--- a/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/membership/cloud/LocalStrings.properties
@@ -27,6 +27,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 9c38a4b857..d85877bf16 100644
---
a/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
+++
b/test/org/apache/catalina/tribes/membership/cloud/TestKubernetesMembershipProvider.java
@@ -85,4 +85,25 @@ public class TestKubernetesMembershipProvider {
Assert.assertNull(service.getMembershipProvider());
}
}
+
+ /*
+ * 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]