| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager; |
| |
| import java.util.concurrent.atomic.AtomicInteger; |
| |
| import junit.framework.Assert; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.yarn.api.records.ApplicationId; |
| import org.apache.hadoop.yarn.api.records.YarnApplicationState; |
| import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext; |
| import org.apache.hadoop.yarn.conf.YarnConfiguration; |
| import org.apache.hadoop.yarn.event.EventHandler; |
| import org.apache.hadoop.yarn.factories.RecordFactory; |
| import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; |
| import org.apache.hadoop.yarn.server.resourcemanager.RMContext; |
| import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl; |
| import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; |
| import org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncherEventType; |
| import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore; |
| import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore; |
| import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| /** |
| * A test case that tests the expiry of the application master. |
| * More tests can be added to this. |
| */ |
| public class TestApplicationMasterExpiry { |
| // private static final Log LOG = LogFactory.getLog(TestApplicationMasterExpiry.class); |
| // private static RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); |
| // |
| // private final RMContext context = new RMContextImpl(new MemStore()); |
| // private AMLivelinessMonitor amLivelinessMonitor; |
| // |
| // @Before |
| // public void setUp() { |
| // new DummyApplicationTracker(); |
| // new DummySN(); |
| // new DummyLauncher(); |
| // new ApplicationEventTypeListener(); |
| // Configuration conf = new Configuration(); |
| // context.getDispatcher().register(ApplicationEventType.class, |
| // new ResourceManager.ApplicationEventDispatcher(context)); |
| // context.getDispatcher().init(conf); |
| // context.getDispatcher().start(); |
| // conf.setLong(YarnConfiguration.AM_EXPIRY_INTERVAL, 1000L); |
| // amLivelinessMonitor = new AMLivelinessMonitor(this.context |
| // .getDispatcher().getEventHandler()); |
| // amLivelinessMonitor.init(conf); |
| // amLivelinessMonitor.start(); |
| // } |
| // |
| // private class DummyApplicationTracker implements EventHandler<ASMEvent<ApplicationTrackerEventType>> { |
| // DummyApplicationTracker() { |
| // context.getDispatcher().register(ApplicationTrackerEventType.class, this); |
| // } |
| // @Override |
| // public void handle(ASMEvent<ApplicationTrackerEventType> event) { |
| // } |
| // } |
| // |
| // private AtomicInteger expiry = new AtomicInteger(); |
| // private boolean expired = false; |
| // |
| // private class ApplicationEventTypeListener implements |
| // EventHandler<ApplicationEvent> { |
| // ApplicationEventTypeListener() { |
| // context.getDispatcher().register(ApplicationEventType.class, this); |
| // } |
| // @Override |
| // public void handle(ApplicationEvent event) { |
| // switch(event.getType()) { |
| // case EXPIRE: |
| // expired = true; |
| // LOG.info("Received expiry from application " + event.getApplicationId()); |
| // synchronized(expiry) { |
| // expiry.addAndGet(1); |
| // } |
| // } |
| // } |
| // } |
| // |
| // private class DummySN implements EventHandler<ASMEvent<SNEventType>> { |
| // DummySN() { |
| // context.getDispatcher().register(SNEventType.class, this); |
| // } |
| // @Override |
| // public void handle(ASMEvent<SNEventType> event) { |
| // } |
| // } |
| // |
| // private class DummyLauncher implements EventHandler<ASMEvent<AMLauncherEventType>> { |
| // DummyLauncher() { |
| // context.getDispatcher().register(AMLauncherEventType.class, this); |
| // } |
| // @Override |
| // public void handle(ASMEvent<AMLauncherEventType> event) { |
| // } |
| // } |
| // |
| // private void waitForState(AppAttempt application, ApplicationState |
| // finalState) throws Exception { |
| // int count = 0; |
| // while(application.getState() != finalState && count < 10) { |
| // Thread.sleep(500); |
| // count++; |
| // } |
| // Assert.assertEquals(finalState, application.getState()); |
| // } |
| // |
| // @Test |
| // public void testAMExpiry() throws Exception { |
| // ApplicationSubmissionContext submissionContext = recordFactory |
| // .newRecordInstance(ApplicationSubmissionContext.class); |
| // submissionContext.setApplicationId(recordFactory |
| // .newRecordInstance(ApplicationId.class)); |
| // submissionContext.getApplicationId().setClusterTimestamp( |
| // System.currentTimeMillis()); |
| // submissionContext.getApplicationId().setId(1); |
| // |
| // ApplicationStore appStore = context.getApplicationsStore() |
| // .createApplicationStore(submissionContext.getApplicationId(), |
| // submissionContext); |
| // AppAttempt application = new AppAttemptImpl(context, |
| // new Configuration(), "dummy", submissionContext, "dummytoken", appStore, |
| // amLivelinessMonitor); |
| // context.getApplications() |
| // .put(application.getApplicationID(), application); |
| // |
| // this.context.getDispatcher().getSyncHandler().handle( |
| // new ApplicationEvent(ApplicationEventType.ALLOCATE, submissionContext |
| // .getApplicationId())); |
| // |
| // waitForState(application, ApplicationState.ALLOCATING); |
| // |
| // this.context.getDispatcher().getEventHandler().handle( |
| // new AMAllocatedEvent(application.getApplicationID(), |
| // application.getMasterContainer())); |
| // |
| // waitForState(application, ApplicationState.LAUNCHING); |
| // |
| // this.context.getDispatcher().getEventHandler().handle( |
| // new ApplicationEvent(ApplicationEventType.LAUNCHED, |
| // application.getApplicationID())); |
| // synchronized(expiry) { |
| // while (expiry.get() == 0) { |
| // expiry.wait(1000); |
| // } |
| // } |
| // Assert.assertTrue(expired); |
| // } |
| } |