HDFS-3059. ssl-server.xml causes NullPointer. Contributed by Xiao Chen.
This commit is contained in:
parent
01b103f4ff
commit
6c8b6f3646
|
@ -2090,6 +2090,8 @@ Release 2.8.0 - UNRELEASED
|
||||||
HDFS-9270. TestShortCircuitLocalRead should not leave socket after unit
|
HDFS-9270. TestShortCircuitLocalRead should not leave socket after unit
|
||||||
test (Masatake Iwasaki via Colin P. McCabe)
|
test (Masatake Iwasaki via Colin P. McCabe)
|
||||||
|
|
||||||
|
HDFS-3059. ssl-server.xml causes NullPointer. (Xiao Chen via wang)
|
||||||
|
|
||||||
Release 2.7.2 - UNRELEASED
|
Release 2.7.2 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -213,6 +213,8 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
|
||||||
public static final String DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT = "ssl-server.xml";
|
public static final String DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT = "ssl-server.xml";
|
||||||
public static final String DFS_SERVER_HTTPS_KEYPASSWORD_KEY = "ssl.server.keystore.keypassword";
|
public static final String DFS_SERVER_HTTPS_KEYPASSWORD_KEY = "ssl.server.keystore.keypassword";
|
||||||
public static final String DFS_SERVER_HTTPS_KEYSTORE_PASSWORD_KEY = "ssl.server.keystore.password";
|
public static final String DFS_SERVER_HTTPS_KEYSTORE_PASSWORD_KEY = "ssl.server.keystore.password";
|
||||||
|
public static final String DFS_SERVER_HTTPS_KEYSTORE_LOCATION_KEY = "ssl.server.keystore.location";
|
||||||
|
public static final String DFS_SERVER_HTTPS_TRUSTSTORE_LOCATION_KEY = "ssl.server.truststore.location";
|
||||||
public static final String DFS_SERVER_HTTPS_TRUSTSTORE_PASSWORD_KEY = "ssl.server.truststore.password";
|
public static final String DFS_SERVER_HTTPS_TRUSTSTORE_PASSWORD_KEY = "ssl.server.truststore.password";
|
||||||
public static final String DFS_NAMENODE_NAME_DIR_RESTORE_KEY = "dfs.namenode.name.dir.restore";
|
public static final String DFS_NAMENODE_NAME_DIR_RESTORE_KEY = "dfs.namenode.name.dir.restore";
|
||||||
public static final boolean DFS_NAMENODE_NAME_DIR_RESTORE_DEFAULT = false;
|
public static final boolean DFS_NAMENODE_NAME_DIR_RESTORE_DEFAULT = false;
|
||||||
|
|
|
@ -1292,6 +1292,9 @@ public class DFSUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (IOException ioe) {
|
catch (IOException ioe) {
|
||||||
|
LOG.warn("Setting password to null since IOException is caught"
|
||||||
|
+ " when getting password", ioe);
|
||||||
|
|
||||||
password = null;
|
password = null;
|
||||||
}
|
}
|
||||||
return password;
|
return password;
|
||||||
|
@ -1352,6 +1355,22 @@ public class DFSUtil {
|
||||||
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY,
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY,
|
||||||
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT));
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT));
|
||||||
|
|
||||||
|
final String[] reqSslProps = {
|
||||||
|
DFSConfigKeys.DFS_SERVER_HTTPS_TRUSTSTORE_LOCATION_KEY,
|
||||||
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_LOCATION_KEY,
|
||||||
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_PASSWORD_KEY,
|
||||||
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYPASSWORD_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if the required properties are included
|
||||||
|
for (String sslProp : reqSslProps) {
|
||||||
|
if (sslConf.get(sslProp) == null) {
|
||||||
|
LOG.warn("SSL config " + sslProp + " is missing. If " +
|
||||||
|
DFSConfigKeys.DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY +
|
||||||
|
" is specified, make sure it is a relative path");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean requireClientAuth = conf.getBoolean(DFS_CLIENT_HTTPS_NEED_AUTH_KEY,
|
boolean requireClientAuth = conf.getBoolean(DFS_CLIENT_HTTPS_NEED_AUTH_KEY,
|
||||||
DFS_CLIENT_HTTPS_NEED_AUTH_DEFAULT);
|
DFS_CLIENT_HTTPS_NEED_AUTH_DEFAULT);
|
||||||
sslConf.setBoolean(DFS_CLIENT_HTTPS_NEED_AUTH_KEY, requireClientAuth);
|
sslConf.setBoolean(DFS_CLIENT_HTTPS_NEED_AUTH_KEY, requireClientAuth);
|
||||||
|
|
|
@ -252,47 +252,9 @@ public class SecondaryNameNode implements Runnable,
|
||||||
|
|
||||||
// Initialize other scheduling parameters from the configuration
|
// Initialize other scheduling parameters from the configuration
|
||||||
checkpointConf = new CheckpointConf(conf);
|
checkpointConf = new CheckpointConf(conf);
|
||||||
|
|
||||||
final InetSocketAddress httpAddr = infoSocAddr;
|
|
||||||
|
|
||||||
final String httpsAddrString = conf.getTrimmed(
|
|
||||||
DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_KEY,
|
|
||||||
DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_DEFAULT);
|
|
||||||
InetSocketAddress httpsAddr = NetUtils.createSocketAddr(httpsAddrString);
|
|
||||||
|
|
||||||
HttpServer2.Builder builder = DFSUtil.httpServerTemplateForNNAndJN(conf,
|
|
||||||
httpAddr, httpsAddr, "secondary",
|
|
||||||
DFSConfigKeys.DFS_SECONDARY_NAMENODE_KERBEROS_INTERNAL_SPNEGO_PRINCIPAL_KEY,
|
|
||||||
DFSConfigKeys.DFS_SECONDARY_NAMENODE_KEYTAB_FILE_KEY);
|
|
||||||
|
|
||||||
nameNodeStatusBeanName = MBeans.register("SecondaryNameNode",
|
nameNodeStatusBeanName = MBeans.register("SecondaryNameNode",
|
||||||
"SecondaryNameNodeInfo", this);
|
"SecondaryNameNodeInfo", this);
|
||||||
|
|
||||||
infoServer = builder.build();
|
|
||||||
|
|
||||||
infoServer.setAttribute("secondary.name.node", this);
|
|
||||||
infoServer.setAttribute("name.system.image", checkpointImage);
|
|
||||||
infoServer.setAttribute(JspHelper.CURRENT_CONF, conf);
|
|
||||||
infoServer.addInternalServlet("imagetransfer", ImageServlet.PATH_SPEC,
|
|
||||||
ImageServlet.class, true);
|
|
||||||
infoServer.start();
|
|
||||||
|
|
||||||
LOG.info("Web server init done");
|
|
||||||
|
|
||||||
HttpConfig.Policy policy = DFSUtil.getHttpPolicy(conf);
|
|
||||||
int connIdx = 0;
|
|
||||||
if (policy.isHttpEnabled()) {
|
|
||||||
InetSocketAddress httpAddress = infoServer.getConnectorAddress(connIdx++);
|
|
||||||
conf.set(DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY,
|
|
||||||
NetUtils.getHostPortString(httpAddress));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (policy.isHttpsEnabled()) {
|
|
||||||
InetSocketAddress httpsAddress = infoServer.getConnectorAddress(connIdx);
|
|
||||||
conf.set(DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_KEY,
|
|
||||||
NetUtils.getHostPortString(httpsAddress));
|
|
||||||
}
|
|
||||||
|
|
||||||
legacyOivImageDir = conf.get(
|
legacyOivImageDir = conf.get(
|
||||||
DFSConfigKeys.DFS_NAMENODE_LEGACY_OIV_IMAGE_DIR_KEY);
|
DFSConfigKeys.DFS_NAMENODE_LEGACY_OIV_IMAGE_DIR_KEY);
|
||||||
|
|
||||||
|
@ -501,6 +463,49 @@ public class SecondaryNameNode implements Runnable,
|
||||||
return address.toURL();
|
return address.toURL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the web server.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public void startInfoServer() throws IOException {
|
||||||
|
final InetSocketAddress httpAddr = getHttpAddress(conf);
|
||||||
|
final String httpsAddrString = conf.getTrimmed(
|
||||||
|
DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_KEY,
|
||||||
|
DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_DEFAULT);
|
||||||
|
InetSocketAddress httpsAddr = NetUtils.createSocketAddr(httpsAddrString);
|
||||||
|
|
||||||
|
HttpServer2.Builder builder = DFSUtil.httpServerTemplateForNNAndJN(conf,
|
||||||
|
httpAddr, httpsAddr, "secondary", DFSConfigKeys.
|
||||||
|
DFS_SECONDARY_NAMENODE_KERBEROS_INTERNAL_SPNEGO_PRINCIPAL_KEY,
|
||||||
|
DFSConfigKeys.DFS_SECONDARY_NAMENODE_KEYTAB_FILE_KEY);
|
||||||
|
|
||||||
|
infoServer = builder.build();
|
||||||
|
infoServer.setAttribute("secondary.name.node", this);
|
||||||
|
infoServer.setAttribute("name.system.image", checkpointImage);
|
||||||
|
infoServer.setAttribute(JspHelper.CURRENT_CONF, conf);
|
||||||
|
infoServer.addInternalServlet("imagetransfer", ImageServlet.PATH_SPEC,
|
||||||
|
ImageServlet.class, true);
|
||||||
|
infoServer.start();
|
||||||
|
|
||||||
|
LOG.info("Web server init done");
|
||||||
|
|
||||||
|
HttpConfig.Policy policy = DFSUtil.getHttpPolicy(conf);
|
||||||
|
int connIdx = 0;
|
||||||
|
if (policy.isHttpEnabled()) {
|
||||||
|
InetSocketAddress httpAddress =
|
||||||
|
infoServer.getConnectorAddress(connIdx++);
|
||||||
|
conf.set(DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY,
|
||||||
|
NetUtils.getHostPortString(httpAddress));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (policy.isHttpsEnabled()) {
|
||||||
|
InetSocketAddress httpsAddress =
|
||||||
|
infoServer.getConnectorAddress(connIdx);
|
||||||
|
conf.set(DFSConfigKeys.DFS_NAMENODE_SECONDARY_HTTPS_ADDRESS_KEY,
|
||||||
|
NetUtils.getHostPortString(httpsAddress));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new checkpoint
|
* Create a new checkpoint
|
||||||
* @return if the image is fetched from primary or not
|
* @return if the image is fetched from primary or not
|
||||||
|
@ -680,6 +685,12 @@ public class SecondaryNameNode implements Runnable,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (secondary != null) {
|
if (secondary != null) {
|
||||||
|
// The web server is only needed when starting SNN as a daemon,
|
||||||
|
// and not needed if called from shell command. Starting the web server
|
||||||
|
// from shell may fail when getting credentials, if the environment
|
||||||
|
// is not set up for it, which is most of the case.
|
||||||
|
secondary.startInfoServer();
|
||||||
|
|
||||||
secondary.startCheckpointThread();
|
secondary.startCheckpointThread();
|
||||||
secondary.join();
|
secondary.join();
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,6 +216,7 @@ public class TestHDFSServerPorts {
|
||||||
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode sn = null;
|
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode sn = null;
|
||||||
try {
|
try {
|
||||||
sn = new org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode(conf);
|
sn = new org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode(conf);
|
||||||
|
sn.startInfoServer();
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
if (e instanceof java.net.BindException)
|
if (e instanceof java.net.BindException)
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue