Github user lvfangmin commented on a diff in the pull request:
https://github.com/apache/zookeeper/pull/628#discussion_r219583415
--- Diff: src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
---
@@ -1920,7 +1937,75 @@ private void updateRemotePeerMXBeans(Map<Long,
QuorumServer> newMembers) {
}
}
- private boolean updateLearnerType(QuorumVerifier newQV) {
+ private ArrayList<QuorumServer> observerMasters = new ArrayList<>();
+ private void updateObserverMasterList() {
+ if (observerMasterPort <= 0) {
+ return; // observer masters not enabled
+ }
+ observerMasters.clear();
+ StringBuilder sb = new StringBuilder();
+ for (QuorumServer server :
quorumVerifier.getVotingMembers().values()) {
+ InetSocketAddress addr = new
InetSocketAddress(server.addr.getAddress(), observerMasterPort);
+ observerMasters.add(new QuorumServer(server.id, addr));
+ sb.append(addr).append(",");
+ }
+ LOG.info("Updated learner master list to be {}", sb.toString());
+ Collections.shuffle(observerMasters);
+ }
+
+ private boolean useObserverMasters() {
+ return getLearnerType() == LearnerType.OBSERVER &&
observerMasters.size() > 0;
+ }
+
+ private int nextObserverMaster = 0;
+ private QuorumServer nextObserverMaster() {
+ if (nextObserverMaster >= observerMasters.size()) {
+ nextObserverMaster = 0;
+ }
+ return observerMasters.get(nextObserverMaster++);
+ }
+
+ QuorumServer findLearnerMaster(QuorumServer leader) {
+ return useObserverMasters() ? nextObserverMaster() : leader;
+ }
+
+
--- End diff --
Remove extra empty line here.
---