Skip to content

Commit 2eedf26

Browse files
author
Mate Szalay-Beko
committed
ZOOKEEPER-3188: fix PR commits; handle case when Leader can not bind to port on startup
1 parent 483d2fc commit 2eedf26

3 files changed

Lines changed: 222 additions & 178 deletions

File tree

zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Leader.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.io.DataInputStream;
2525
import java.io.DataOutputStream;
2626
import java.io.IOException;
27-
import java.net.BindException;
2827
import java.net.InetSocketAddress;
2928
import java.net.ServerSocket;
3029
import java.net.Socket;
@@ -40,6 +39,7 @@
4039
import java.util.List;
4140
import java.util.Map;
4241
import java.util.Objects;
42+
import java.util.Optional;
4343
import java.util.Set;
4444
import java.util.concurrent.ConcurrentHashMap;
4545
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -290,15 +290,20 @@ public boolean isQuorumSynced(QuorumVerifier qv) {
290290
addresses = self.getQuorumAddress().getAllAddresses();
291291
}
292292

293-
for (InetSocketAddress address : addresses) {
294-
serverSockets.add(createServerSocket(address, self.shouldUsePortUnification(), self.isSslQuorum()));
293+
addresses.stream()
294+
.map(address -> createServerSocket(address, self.shouldUsePortUnification(), self.isSslQuorum()))
295+
.filter(Optional::isPresent)
296+
.map(Optional::get)
297+
.forEach(serverSockets::add);
298+
299+
if (serverSockets.isEmpty()) {
300+
throw new IOException("Leader failed to initialize any of the following sockets: " + addresses);
295301
}
296302

297303
this.zk = zk;
298304
}
299305

300-
ServerSocket createServerSocket(InetSocketAddress address, boolean portUnification, boolean sslQuorum)
301-
throws IOException {
306+
Optional<ServerSocket> createServerSocket(InetSocketAddress address, boolean portUnification, boolean sslQuorum) {
302307
ServerSocket serverSocket;
303308
try {
304309
if (portUnification || sslQuorum) {
@@ -308,11 +313,11 @@ ServerSocket createServerSocket(InetSocketAddress address, boolean portUnificati
308313
}
309314
serverSocket.setReuseAddress(true);
310315
serverSocket.bind(address);
311-
return serverSocket;
312-
} catch (BindException e) {
316+
return Optional.of(serverSocket);
317+
} catch (IOException e) {
313318
LOG.error("Couldn't bind to " + address.toString(), e);
314-
throw e;
315319
}
320+
return Optional.empty();
316321
}
317322

318323
/**

0 commit comments

Comments
 (0)