diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index 57c8fce..b52202a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -23,9 +23,7 @@ import java.net.InetSocketAddress; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -190,12 +188,8 @@ public static long getClusterTimeStamp() { protected static void setClusterTimeStamp(long timestamp) { clusterTimeStamp = timestamp; } - - @Override - protected void serviceInit(Configuration conf) throws Exception { - this.conf = conf; - this.rmContext = new RMContextImpl(); - + + protected void internalServiceInit(Configuration conf) throws Exception { this.configurationProvider = ConfigurationProviderFactory.getConfigurationProvider(conf); this.configurationProvider.init(this.conf); @@ -242,16 +236,40 @@ protected void serviceInit(Configuration conf) throws Exception { if (this.rmContext.isHAEnabled()) { HAUtil.verifyAndSetConfiguration(this.conf); } + createAndInitActiveServices(); webAppAddress = WebAppUtils.getWebAppBindURL(this.conf, YarnConfiguration.RM_BIND_HOST, WebAppUtils.getRMWebAppURLWithoutScheme(this.conf)); - this.rmLoginUGI = UserGroupInformation.getCurrentUser(); - super.serviceInit(this.conf); } + + @Override + protected void serviceInit(final Configuration conf) throws Exception { + this.conf = conf; + this.rmContext = new RMContextImpl(); + + // Set UGI and do login + // If security is enabled, use login user + // If security is not enabled, use current user + this.rmLoginUGI = UserGroupInformation.getCurrentUser(); + try { + doSecureLogin(); + } catch(IOException ie) { + throw new YarnRuntimeException("Failed to login", ie); + } + + // Do serviceInit + this.rmLoginUGI.doAs(new PrivilegedExceptionAction() { + @Override + public Void run() throws Exception { + internalServiceInit(conf); + return null; + } + }); + } protected QueueACLsManager createQueueACLsManager(ResourceScheduler scheduler, Configuration conf) { @@ -1019,17 +1037,13 @@ protected boolean areActiveServicesRunning() { } synchronized void transitionToActive() throws Exception { - if (rmContext.getHAServiceState() == - HAServiceProtocol.HAServiceState.ACTIVE) { + if (rmContext.getHAServiceState() == HAServiceProtocol.HAServiceState.ACTIVE) { LOG.info("Already in active state"); return; } LOG.info("Transitioning to active state"); - // use rmLoginUGI to startActiveServices. - // in non-secure model, rmLoginUGI will be current UGI - // in secure model, rmLoginUGI will be LoginUser UGI this.rmLoginUGI.doAs(new PrivilegedExceptionAction() { @Override public Void run() throws Exception { @@ -1068,15 +1082,8 @@ synchronized void transitionToStandby(boolean initialize) rmContext.setHAServiceState(HAServiceProtocol.HAServiceState.STANDBY); LOG.info("Transitioned to standby state"); } - - @Override - protected void serviceStart() throws Exception { - try { - doSecureLogin(); - } catch(IOException ie) { - throw new YarnRuntimeException("Failed to login", ie); - } - + + private void internalServiceStart() throws Exception { if (this.rmContext.isHAEnabled()) { transitionToStandby(true); } else { @@ -1084,12 +1091,29 @@ protected void serviceStart() throws Exception { } startWepApp(); - if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, false)) { + if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, + false)) { int port = webApp.port(); WebAppUtils.setRMWebAppPort(conf, port); } super.serviceStart(); } + + @Override + protected void serviceStart() throws Exception { + LOG.info("Transitioning to active state"); + + // use rmLoginUGI to startActiveServices. + // in non-secure model, rmLoginUGI will be current UGI + // in secure model, rmLoginUGI will be LoginUser UGI + this.rmLoginUGI.doAs(new PrivilegedExceptionAction() { + @Override + public Void run() throws Exception { + internalServiceStart(); + return null; + } + }); + } protected void doSecureLogin() throws IOException { InetSocketAddress socAddr = getBindAddress(conf); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java index e30ca29..8cef4c9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java @@ -28,8 +28,6 @@ import javax.ws.rs.core.MediaType; -import org.junit.Assert; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -37,10 +35,10 @@ import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState; import org.apache.hadoop.ha.HAServiceProtocol.StateChangeRequestInfo; import org.apache.hadoop.ha.HealthCheckFailedException; -import org.apache.hadoop.metrics2.MetricsSystem; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.security.AccessControlException; +import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.service.AbstractService; import org.apache.hadoop.yarn.conf.HAUtil; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -54,6 +52,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -64,7 +63,7 @@ public class TestRMHA { private Log LOG = LogFactory.getLog(TestRMHA.class); - private final Configuration configuration = new YarnConfiguration(); + private Configuration configuration; private MockRM rm = null; private RMApp app = null; private RMAppAttempt attempt = null; @@ -82,6 +81,8 @@ @Before public void setUp() throws Exception { + configuration = new Configuration(); + UserGroupInformation.setConfiguration(configuration); configuration.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); configuration.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," + RM2_NODE_ID); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceManager.java index 1117fbe..6735575 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceManager.java @@ -57,6 +57,7 @@ @Before public void setUp() throws Exception { Configuration conf = new YarnConfiguration(); + UserGroupInformation.setConfiguration(conf); resourceManager = new ResourceManager(); resourceManager.init(conf); resourceManager.getRMContext().getContainerTokenSecretManager().rollMasterKey(); @@ -254,7 +255,12 @@ public void testFilterOverrides() throws Exception { AuthenticationFilterInitializer.class.getName() + ", " + this.getClass().getName() }; for (String filterInitializer : filterInitializers) { - resourceManager = new ResourceManager(); + resourceManager = new ResourceManager() { + @Override + protected void doSecureLogin() throws IOException { + // Skip the login. + } + }; Configuration conf = new YarnConfiguration(); conf.set(filterInitializerConfKey, filterInitializer); conf.set("hadoop.security.authentication", "kerberos");