This is an automated email from the ASF dual-hosted git repository. andor pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push: new 40aed4179 ZOOKEEPER-4728: force to re-resolve hostname into IP when binding. (#2040) 40aed4179 is described below commit 40aed41793e9bc4493d89e7c831d9da3258212fc Author: Luke Chen <show...@gmail.com> AuthorDate: Tue Aug 29 18:45:37 2023 +0800 ZOOKEEPER-4728: force to re-resolve hostname into IP when binding. (#2040) * ZOOKEEPER-4728: force to re-resolve hostname into IP when binding * ZOOKEEPER-4708: add test --- .../main/java/org/apache/zookeeper/server/quorum/Leader.java | 6 +++++- .../org/apache/zookeeper/server/quorum/LeaderBeanTest.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Leader.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Leader.java index 0cb4d50de..3b9c827c3 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Leader.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Leader.java @@ -309,6 +309,10 @@ public class Leader extends LearnerMaster { this.zk = zk; } + InetSocketAddress recreateInetSocketAddr(String hostString, int port) { + return new InetSocketAddress(hostString, port); + } + Optional<ServerSocket> createServerSocket(InetSocketAddress address, boolean portUnification, boolean sslQuorum) { ServerSocket serverSocket; try { @@ -318,7 +322,7 @@ public class Leader extends LearnerMaster { serverSocket = new ServerSocket(); } serverSocket.setReuseAddress(true); - serverSocket.bind(address); + serverSocket.bind(recreateInetSocketAddr(address.getHostString(), address.getPort())); return Optional.of(serverSocket); } catch (IOException e) { LOG.error("Couldn't bind to {}", address.toString(), e); diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LeaderBeanTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LeaderBeanTest.java index 6a914fbc6..4d3c6fba7 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LeaderBeanTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/LeaderBeanTest.java @@ -25,6 +25,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; @@ -47,6 +48,7 @@ import org.apache.zookeeper.txn.TxnHeader; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -92,6 +94,15 @@ public class LeaderBeanTest { fileTxnSnapLog.close(); } + @Test + public void testCreateServerSocketWillRecreateInetSocketAddr() { + Leader spyLeader = Mockito.spy(leader); + InetSocketAddress addr = new InetSocketAddress("localhost", PortAssignment.unique()); + spyLeader.createServerSocket(addr, false, false); + // make sure the address to be bound will be recreated with expected hostString and port + Mockito.verify(spyLeader, times(1)).recreateInetSocketAddr(addr.getHostString(), addr.getPort()); + } + @Test public void testGetName() { assertEquals("Leader", leaderBean.getName());