You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by rg...@apache.org on 2015/06/27 02:03:30 UTC
svn commit: r1687876 - in /zookeeper/trunk: CHANGES.txt
src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Author: rgs
Date: Sat Jun 27 00:03:30 2015
New Revision: 1687876
URL: http://svn.apache.org/r1687876
Log:
ZOOKEEPER-2193: reconfig command completes even if parameter is wrong obviously
(Yasuhito Fukuda via rgs)
Modified:
zookeeper/trunk/CHANGES.txt
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1687876&r1=1687875&r2=1687876&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Sat Jun 27 00:03:30 2015
@@ -137,6 +137,9 @@ BUGFIXES:
ZOOKEEPER-2210: clock_gettime is not available in OS X
(Michi Mutsuzaki via rgs)
+ ZOOKEEPER-2193: reconfig command completes even if parameter is wrong obviously
+ (Yasuhito Fukuda via rgs)
+
IMPROVEMENTS:
ZOOKEEPER-1660 Documentation for Dynamic Reconfiguration (Reed Wanderman-Milne via shralex)
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java?rev=1687876&r1=1687875&r2=1687876&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java Sat Jun 27 00:03:30 2015
@@ -551,6 +551,15 @@ public class PrepRequestProcessor extend
if (qs.clientAddr == null || qs.electionAddr == null || qs.addr == null) {
throw new KeeperException.BadArgumentsException("Wrong format of server string - each server should have 3 ports specified");
}
+
+ // check duplication of addresses and ports
+ for (QuorumServer nqs: nextServers.values()) {
+ if (qs.id == nqs.id) {
+ continue;
+ }
+ qs.checkAddressDuplicate(nqs);
+ }
+
nextServers.remove(qs.id);
nextServers.put(Long.valueOf(qs.id), qs);
}
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=1687876&r1=1687875&r2=1687876&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java Sat Jun 27 00:03:30 2015
@@ -43,6 +43,7 @@ import java.util.Properties;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.zookeeper.KeeperException.BadArgumentsException;
import org.apache.zookeeper.common.AtomicFileWritingIdiom;
import org.apache.zookeeper.common.AtomicFileWritingIdiom.WriterStatement;
import org.apache.zookeeper.common.Time;
@@ -119,29 +120,20 @@ public class QuorumPeer extends ZooKeepe
public LearnerType type = LearnerType.PARTICIPANT;
-
+ private List<InetSocketAddress> myAddrs;
+
public QuorumServer(long id, InetSocketAddress addr,
InetSocketAddress electionAddr, InetSocketAddress clientAddr) {
- this.id = id;
- this.addr = addr;
- this.electionAddr = electionAddr;
- this.clientAddr = clientAddr;
+ this(id, addr, electionAddr, clientAddr, LearnerType.PARTICIPANT);
}
-
public QuorumServer(long id, InetSocketAddress addr,
InetSocketAddress electionAddr) {
- this.id = id;
- this.addr = addr;
- this.electionAddr = electionAddr;
- this.clientAddr = null;
+ this(id, addr, electionAddr, (InetSocketAddress)null, LearnerType.PARTICIPANT);
}
public QuorumServer(long id, InetSocketAddress addr) {
- this.id = id;
- this.addr = addr;
- this.electionAddr = null;
- this.clientAddr = null;
+ this(id, addr, (InetSocketAddress)null, (InetSocketAddress)null, LearnerType.PARTICIPANT);
}
/**
@@ -228,26 +220,37 @@ public class QuorumPeer extends ZooKeepe
} catch (NumberFormatException e) {
throw new ConfigException("Address unresolved: " + serverParts[0] + ":" + serverParts[2]);
}
- if (serverParts.length == 4) setType(serverParts[3]);
+
+ if (serverParts.length == 4) {
+ setType(serverParts[3]);
+ }
+
+ setMyAddrs();
}
public QuorumServer(long id, InetSocketAddress addr,
InetSocketAddress electionAddr, LearnerType type) {
+ this(id, addr, electionAddr, (InetSocketAddress)null, type);
+ }
+
+ public QuorumServer(long id, InetSocketAddress addr,
+ InetSocketAddress electionAddr, InetSocketAddress clientAddr, LearnerType type) {
this.id = id;
this.addr = addr;
this.electionAddr = electionAddr;
this.type = type;
- this.clientAddr = null;
+ this.clientAddr = clientAddr;
+
+ setMyAddrs();
}
- public QuorumServer(long id, InetSocketAddress addr,
- InetSocketAddress electionAddr, InetSocketAddress clientAddr, LearnerType type) {
- this.id = id;
- this.addr = addr;
- this.electionAddr = electionAddr;
- this.type = type;
- this.clientAddr = clientAddr;
- }
+ private void setMyAddrs() {
+ this.myAddrs = new ArrayList<InetSocketAddress>();
+ this.myAddrs.add(this.addr);
+ this.myAddrs.add(this.clientAddr);
+ this.myAddrs.add(this.electionAddr);
+ this.myAddrs = excludedSpecialAddresses(this.myAddrs);
+ }
public String toString(){
StringWriter sw = new StringWriter();
@@ -293,6 +296,44 @@ public class QuorumPeer extends ZooKeepe
if (!checkAddressesEqual(clientAddr, qs.clientAddr)) return false;
return true;
}
+
+ public void checkAddressDuplicate(QuorumServer s) throws BadArgumentsException {
+ List<InetSocketAddress> otherAddrs = new ArrayList<InetSocketAddress>();
+ otherAddrs.add(s.addr);
+ otherAddrs.add(s.clientAddr);
+ otherAddrs.add(s.electionAddr);
+ otherAddrs = excludedSpecialAddresses(otherAddrs);
+
+ for (InetSocketAddress my: this.myAddrs) {
+
+ for (InetSocketAddress other: otherAddrs) {
+ if (my.equals(other)) {
+ String error = String.format("%s of server.%d conflicts %s of server.%d", my, this.id, other, s.id);
+ throw new BadArgumentsException(error);
+ }
+ }
+ }
+ }
+
+ private List<InetSocketAddress> excludedSpecialAddresses(List<InetSocketAddress> addrs) {
+ List<InetSocketAddress> included = new ArrayList<InetSocketAddress>();
+ InetAddress wcAddr = new InetSocketAddress(0).getAddress();
+
+ for (InetSocketAddress addr : addrs) {
+ if (addr == null) {
+ continue;
+ }
+ InetAddress inetaddr = addr.getAddress();
+
+ if (inetaddr == null ||
+ inetaddr.equals(wcAddr) || // wildCard address(0.0.0.0)
+ inetaddr.isLoopbackAddress()) { // loopback address(localhost/127.0.0.1)
+ continue;
+ }
+ included.add(addr);
+ }
+ return included;
+ }
}