This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new a1ed5c4a260 [improve][broker] Add tests for using absolute FQDN for
advertisedAddress and remove extra dot from brokerId (#24787)
a1ed5c4a260 is described below
commit a1ed5c4a26029a6c6d6cb455ee653f133d651ce7
Author: Lari Hotari <[email protected]>
AuthorDate: Tue Nov 4 20:33:27 2025 +0200
[improve][broker] Add tests for using absolute FQDN for advertisedAddress
and remove extra dot from brokerId (#24787)
---
.../org/apache/pulsar/broker/PulsarService.java | 14 ++++--
.../pulsar/broker/PulsarServiceBrokerIdTest.java | 57 ++++++++++++++++++++++
.../ClientTlsAbsoluteAdvertisedAddressTest.java | 33 +++++++++++++
3 files changed, 101 insertions(+), 3 deletions(-)
diff --git
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
index 15fe1dcd610..e61fbfac566 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java
@@ -966,9 +966,7 @@ public class PulsarService implements AutoCloseable,
ShutdownService {
// the broker id is used in the load manager to identify the broker
// it should not be used for making connections to the broker
- this.brokerId =
- String.format("%s:%s", advertisedAddress,
config.getWebServicePort()
- .or(config::getWebServicePortTls).orElseThrow());
+ this.brokerId = createBrokerId();
if (this.compactionServiceFactory == null) {
this.compactionServiceFactory = loadCompactionServiceFactory();
@@ -1098,6 +1096,16 @@ public class PulsarService implements AutoCloseable,
ShutdownService {
}
}
+ private String createBrokerId() {
+ // Remove any trailing dot from the absolute FQDN in the broker id to
prevent it from impacting
+ // broker entries in the metadata store when making the advertised
address absolute
+ String brokerIdHostPart = advertisedAddress.replaceFirst("\\.$", "");
+ // Although broker id contains a hostname and port, it is not meant to
be used for connecting to the broker,
+ // It is simply a unique identifier for the broker.
+ return String.format("%s:%s", brokerIdHostPart,
config.getWebServicePort()
+ .or(config::getWebServicePortTls).orElseThrow());
+ }
+
public void runWhenReadyForIncomingRequests(Runnable runnable) {
// Here we don't call the thenRun() methods because CompletableFuture
maintains a stack for pending callbacks,
// not a queue. Once the future is complete, the pending callbacks
will be executed in reverse order of
diff --git
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/PulsarServiceBrokerIdTest.java
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/PulsarServiceBrokerIdTest.java
new file mode 100644
index 00000000000..d3304671eac
--- /dev/null
+++
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/PulsarServiceBrokerIdTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.broker;
+
+import java.net.InetAddress;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+@Slf4j
+public class PulsarServiceBrokerIdTest extends MockedPulsarServiceBaseTest {
+ private String hostAddress;
+
+ @BeforeMethod
+ @Override
+ protected void setup() throws Exception {
+ super.internalSetup();
+ }
+
+ @AfterMethod(alwaysRun = true)
+ @Override
+ protected void cleanup() throws Exception {
+ super.internalCleanup();
+ }
+
+ @Override
+ protected void doInitConf() throws Exception {
+ super.doInitConf();
+ hostAddress = InetAddress.getLocalHost().getCanonicalHostName();
+ // make it an absolute FQDN by adding a trailing dot
+ conf.setAdvertisedAddress(hostAddress + ".");
+ }
+
+ @Test
+ public void testBrokerIdDoesntContainTrailingDot() throws Exception {
+ Assert.assertEquals(pulsar.getBrokerId(), hostAddress + ":" +
conf.getWebServicePort().get());
+ }
+}
diff --git
a/tests/integration/src/test/java/org/apache/pulsar/tests/integration/tls/ClientTlsAbsoluteAdvertisedAddressTest.java
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/tls/ClientTlsAbsoluteAdvertisedAddressTest.java
new file mode 100644
index 00000000000..9f87a1c9ce7
--- /dev/null
+++
b/tests/integration/src/test/java/org/apache/pulsar/tests/integration/tls/ClientTlsAbsoluteAdvertisedAddressTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.tests.integration.tls;
+
+/**
+ * Test that the client can connect to a broker using TLS with an absolute
advertised address.
+ */
+public class ClientTlsAbsoluteAdvertisedAddressTest extends ClientTlsTest {
+ @Override
+ protected void beforeStartCluster() throws Exception {
+ super.beforeStartCluster();
+ getPulsarCluster().getBrokers().forEach(brokerContainer -> {
+ // make the advertised address absolute by adding a dot at the end
+ brokerContainer.withEnv("advertisedAddress",
brokerContainer.getHostName() + ".");
+ });
+ }
+}
\ No newline at end of file