/** * Licensed 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.mapred; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.examples.SleepJob; import org.apache.hadoop.mapreduce.test.system.FinishTaskControlAction; import org.apache.hadoop.mapreduce.test.system.JTProtocol; import org.apache.hadoop.mapreduce.test.system.JobInfo; import org.apache.hadoop.mapreduce.test.system.MRCluster; import org.apache.hadoop.mapreduce.test.system.MRCluster.Role; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.AfterClass; import org.junit.Test; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; import java.util.Hashtable; import java.lang.Integer; public class TestCMExceptionDuringRunJob { private static MRCluster cluster = null; static final Log LOG = LogFactory.getLog(TestCMExceptionDuringRunJob.class); private JTProtocol remoteJTClient=null; private Configuration conf =null; @BeforeClass public static void setUp() throws java.lang.Exception { String [] expExcludeList = new String[2]; expExcludeList[0] = "java.net.ConnectException"; expExcludeList[1] = "java.io.IOException"; cluster = MRCluster.createCluster(new Configuration()); cluster.setExcludeExpList(expExcludeList); cluster.setUp(); } /** * The objective of the test is, when the user accesses the retired job data * or the running job data simultaneously in different threads there * is no concurrent modification exceptions gets thrown */ @Test public void testNoCMExcepRunningJob() throws Exception { remoteJTClient = cluster.getJTClient().getProxy(); conf = remoteJTClient.getDaemonConf(); conf.setBoolean("mapreduce.job.complete.cancel.delegation.tokens", false); //set interval to 30 secs, check to 10 secs, check determines the frequency //of the jobtracker thread that will check for retired jobs, and interval //will determine how long it will take before a job retires. //conf.setInt("mapred.jobtracker.retirejob.interval",30*1000); //conf.setInt("mapred.jobtracker.retirejob.check",10*1000); //cluster.restartDaemonWithNewConfig(cluster.getJTClient(), "mapred-site.xml", // conf, Role.JT); Hashtable<String,Long> props = new Hashtable<String,Long>(); props.put("mapred.jobtracker.retirejob.interval",30000L); props.put("mapred.jobtracker.retirejob.check",10000L); cluster.restartClusterWithNewConfig(props,"mapred-site.xml"); JobID jobid1 = runSleepJob(true); JobID jobid2 = runSleepJob(true); JobID jobid3 = runSleepJob(false); //Waiting for a minute for the job to retire UtilsForTests.waitFor(60*1000); RunAccessHistoryData access1 = new RunAccessHistoryData(jobid1); RunAccessHistoryData access2 = new RunAccessHistoryData(jobid2); new Thread(access1).start(); new Thread(access2).start(); remoteJTClient.getJobSummaryInfo(jobid3); cluster.signalAllTasks(jobid3); cluster.getJTClient().isJobStopped(jobid3); //cluster.restart(cluster.getJTClient(), Role.JT); cluster.restart(); } public class RunAccessHistoryData implements Runnable { private JobID jobId = null; public RunAccessHistoryData (JobID jobId) { this.jobId =jobId; } public void run () { try { remoteJTClient.accessHistoryData(jobId); } catch (Exception ex) { ex.printStackTrace(); } } } public JobID runSleepJob(boolean signalJob) throws Exception{ SleepJob job = new SleepJob(); job.setConf(conf); conf = job.setupJobConf(5, 1, 100, 5, 100, 5); JobConf jconf = new JobConf(conf); //Controls the job till all verification is done FinishTaskControlAction.configureControlActionForJob(conf); //Submitting the job RunningJob rJob = cluster.getJTClient().getClient().submitJob(jconf); JobID jobId = rJob.getID(); JobInfo jInfo = remoteJTClient.getJobInfo(jobId); LOG.info("jInfo is :" + jInfo); boolean jobStarted = cluster.getJTClient().isJobStarted(jobId); Assert.assertTrue("Job has not started even after a minute", jobStarted ); if(signalJob) { cluster.signalAllTasks(jobId); Assert.assertTrue("Job has not stopped yet", cluster.getJTClient().isJobStopped(jobId)); } return jobId; } @AfterClass public static void tearDown() throws Exception { cluster.tearDown(); } }