in zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java [329:444]
private void initializeWithAddressString(String addressStr, Function<InetSocketAddress, InetAddress> getInetAddress) throws ConfigException {
LearnerType newType = null;
String[] serverClientParts = addressStr.split(";");
String[] serverAddresses = serverClientParts[0].split("\\|");
if (serverClientParts.length >= 2 && !serverClientParts[1].isEmpty()) {
String[] clientParts = ConfigUtils.getHostAndPort(serverClientParts[1]);
if (clientParts.length > 2) {
throw new ConfigException(addressStr + wrongFormat);
}
// is client_config a host:port or just a port
String clientHostName = (clientParts.length == 2) ? clientParts[0] : "0.0.0.0";
try {
clientAddr = new InetSocketAddress(clientHostName, Integer.parseInt(clientParts[clientParts.length - 1]));
} catch (NumberFormatException e) {
throw new ConfigException("Address unresolved: " + clientHostName + ":" + clientParts[clientParts.length - 1]);
}
}
if (serverClientParts.length == 3 && !serverClientParts[2].isEmpty()) {
String[] secureClientParts = ConfigUtils.getHostAndPort(serverClientParts[2]);
if (secureClientParts.length > 2) {
throw new ConfigException(addressStr + wrongFormat);
}
// is secure client config a host:port or just a port
String secureClientHostName = (secureClientParts.length == 2) ? secureClientParts[0] : "0.0.0.0";
try {
secureClientAddr = new InetSocketAddress(secureClientHostName, Integer.parseInt(secureClientParts[secureClientParts.length - 1]));
} catch (NumberFormatException e) {
throw new ConfigException("Address unresolved: " + secureClientHostName + ":" + secureClientParts[secureClientParts.length - 1]);
}
// set x509 auth provider if not already set
configureSSLAuth();
}
boolean multiAddressEnabled = Boolean.parseBoolean(
System.getProperty(QuorumPeer.CONFIG_KEY_MULTI_ADDRESS_ENABLED, QuorumPeer.CONFIG_DEFAULT_MULTI_ADDRESS_ENABLED));
if (!multiAddressEnabled && serverAddresses.length > 1) {
throw new ConfigException("Multiple address feature is disabled, but multiple addresses were specified for sid " + this.id);
}
boolean canonicalize = Boolean.parseBoolean(
System.getProperty(
CONFIG_KEY_KERBEROS_CANONICALIZE_HOST_NAMES,
CONFIG_DEFAULT_KERBEROS_CANONICALIZE_HOST_NAMES));
for (String serverAddress : serverAddresses) {
String[] serverParts = ConfigUtils.getHostAndPort(serverAddress);
if ((serverParts.length < 3) || (serverParts.length > 4)) {
throw new ConfigException(addressStr + wrongFormat);
}
String serverHostName = serverParts[0];
// server_config should be either host:port:port or host:port:port:type
InetSocketAddress tempAddress;
InetSocketAddress tempElectionAddress;
try {
tempAddress = new InetSocketAddress(serverHostName, Integer.parseInt(serverParts[1]));
addr.addAddress(tempAddress);
} catch (NumberFormatException e) {
throw new ConfigException("Address unresolved: " + serverHostName + ":" + serverParts[1]);
}
try {
tempElectionAddress = new InetSocketAddress(serverHostName, Integer.parseInt(serverParts[2]));
electionAddr.addAddress(tempElectionAddress);
} catch (NumberFormatException e) {
throw new ConfigException("Address unresolved: " + serverHostName + ":" + serverParts[2]);
}
if (tempAddress.getPort() == tempElectionAddress.getPort()) {
throw new ConfigException("Client and election port must be different! Please update the "
+ "configuration file on server." + this.id);
}
if (canonicalize) {
InetAddress ia = getInetAddress.apply(tempAddress);
if (ia == null) {
throw new ConfigException("Unable to canonicalize address " + serverHostName + " because it's not resolvable");
}
String canonicalHostName = ia.getCanonicalHostName();
if (!canonicalHostName.equals(serverHostName)
// Avoid using literal IP address when
// security check fails
&& !canonicalHostName.equals(ia.getHostAddress())) {
LOG.info("Host name for quorum server {} "
+ "canonicalized from {} to {}",
this.id, serverHostName, canonicalHostName);
serverHostName = canonicalHostName;
}
}
if (serverParts.length == 4) {
LearnerType tempType = getType(serverParts[3]);
if (newType == null) {
newType = tempType;
}
if (newType != tempType) {
throw new ConfigException("Multiple addresses should have similar roles: " + type + " vs " + tempType);
}
}
this.hostname = serverHostName;
}
if (newType != null) {
type = newType;
}
setMyAddrs();
}