Github user anmolnar commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/184#discussion_r195724314 --- Diff: src/java/main/org/apache/zookeeper/server/quorum/Leader.java --- @@ -227,19 +229,36 @@ public boolean isQuorumSynced(QuorumVerifier qv) { private final ServerSocket ss; - Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws IOException { + Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws IOException, X509Exception { this.self = self; this.proposalStats = new ProposalStats(); try { - if (self.getQuorumListenOnAllIPs()) { - ss = new ServerSocket(self.getQuorumAddress().getPort()); + if (self.shouldUsePortUnification()) { + if (self.getQuorumListenOnAllIPs()) { + ss = new UnifiedServerSocket(new QuorumX509Util(), self.getQuorumAddress().getPort()); + } else { + ss = new UnifiedServerSocket(new QuorumX509Util()); + } + } else if (self.isSslQuorum()) { --- End diff -- I just tried to change it in the way you suggested and it got broken. The idea is the following: - when you turn on `sslQuorum`, it means that the peer initiates SSL connection when trying to connect other quorum members and at the same time accepts SSL connections *only*, - when you turn on `portUnification` it means that peer *accepts* both SSL and non-SSL connections, but still tries to initiate non-SSL connections, - if both of them false, peer initiates and accepts non-SSL connection only. Upgrade path is the following: 1. Quorum runs with non-SSL connections, 2. Rolling upgrade nodes by adding `portUnification=true`: peers still communicate without SSL, but able to accept SSL connections as well, 3. Rolling upgrade nodes by adding `sslQuorum=true`: peers accept both connections, but initiates with SSL, 4. Rolling upgrade nodes by removing `portUnification`: peers accept and initiate SSL connections only. `QuorumSSLTest.testRollingUpgrade` covers the scenario.
---