Author: ddas Date: Mon Aug 24 11:20:21 2009 New Revision: 807148 URL: http://svn.apache.org/viewvc?rev=807148&view=rev Log: MAPREDUCE-807. Handles the AccessControlException during the deletion of mapred.system.dir in the JobTracker. The JobTracker will bail out if it encounters such an exception. Contributed by Amar Kamat.
Added: hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/TestMapredSystemDir.java Modified: hadoop/common/branches/branch-0.20/CHANGES.txt hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/MiniMRCluster.java Modified: hadoop/common/branches/branch-0.20/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/CHANGES.txt?rev=807148&r1=807147&r2=807148&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.20/CHANGES.txt Mon Aug 24 11:20:21 2009 @@ -231,6 +231,10 @@ MAPREDUCE-818. Fixes Counters#getGroup API. (Amareshwari Sriramadasu via sharad) + MAPREDUCE-807. Handles the AccessControlException during the deletion of + mapred.system.dir in the JobTracker. The JobTracker will bail out if it + encounters such an exception. (Amar Kamat via ddas) + Release 0.20.0 - 2009-04-15 INCOMPATIBLE CHANGES Modified: hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java?rev=807148&r1=807147&r2=807148&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java (original) +++ hadoop/common/branches/branch-0.20/src/mapred/org/apache/hadoop/mapred/JobTracker.java Mon Aug 24 11:20:21 2009 @@ -186,6 +186,10 @@ throw e; } catch (UnknownHostException e) { throw e; + } catch (AccessControlException ace) { + // in case of jobtracker not having right access + // bail out + throw ace; } catch (IOException e) { LOG.warn("Error starting tracker: " + StringUtils.stringifyException(e)); @@ -1651,7 +1655,7 @@ // start the recovery manager recoveryManager = new RecoveryManager(); - while (true) { + while (!Thread.currentThread().isInterrupted()) { try { // if we haven't contacted the namenode go ahead and do it if (fs == null) { @@ -1691,17 +1695,23 @@ break; } LOG.error("Mkdirs failed to create " + systemDir); + } catch (AccessControlException ace) { + LOG.warn("Failed to operate on mapred.system.dir (" + systemDir + + ") because of permissions."); + LOG.warn("Manually delete the mapred.system.dir (" + systemDir + + ") and then start the JobTracker."); + LOG.warn("Bailing out ... "); + throw ace; } catch (IOException ie) { - if (ie instanceof RemoteException && - AccessControlException.class.getName().equals( - ((RemoteException)ie).getClassName())) { - throw ie; - } LOG.info("problem cleaning system directory: " + systemDir, ie); } Thread.sleep(FS_ACCESS_RETRY_PERIOD); } + if (Thread.currentThread().isInterrupted()) { + throw new InterruptedException(); + } + // Same with 'localDir' except it's always on the local disk. jobConf.deleteLocalFiles(SUBDIR); Modified: hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/MiniMRCluster.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/MiniMRCluster.java?rev=807148&r1=807147&r2=807148&view=diff ============================================================================== --- hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/MiniMRCluster.java (original) +++ hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/MiniMRCluster.java Mon Aug 24 11:20:21 2009 @@ -550,11 +550,20 @@ * Start the jobtracker. */ public void startJobTracker() { + startJobTracker(true); + } + + void startJobTracker(boolean wait) { // Create the JobTracker jobTracker = new JobTrackerRunner(conf); jobTrackerThread = new Thread(jobTracker); jobTrackerThread.start(); + + if (!wait) { + return; + } + while (jobTracker.isActive() && !jobTracker.isUp()) { try { // let daemons get started Thread.sleep(1000); Added: hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/TestMapredSystemDir.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/TestMapredSystemDir.java?rev=807148&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/TestMapredSystemDir.java (added) +++ hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/mapred/TestMapredSystemDir.java Mon Aug 24 11:20:21 2009 @@ -0,0 +1,102 @@ +/** + * 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.mapred; + +import junit.framework.TestCase; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.security.*; + +/** + * Test if JobTracker is resilient to garbage in mapred.system.dir. + */ +public class TestMapredSystemDir extends TestCase { + private static final Log LOG = LogFactory.getLog(TestMapredSystemDir.class); + + // dfs ugi + private static final UnixUserGroupInformation DFS_UGI = + TestMiniMRWithDFSWithDistinctUsers.createUGI("dfs", true); + // mapred ugi + private static final UnixUserGroupInformation MR_UGI = + TestMiniMRWithDFSWithDistinctUsers.createUGI("mr", false); + private static final FsPermission SYSTEM_DIR_PERMISSION = + FsPermission.createImmutable((short) 0733); // rwx-wx-wx + + public void testGarbledMapredSystemDir() throws Exception { + MiniDFSCluster dfs = null; + MiniMRCluster mr = null; + try { + // start dfs + Configuration conf = new Configuration(); + conf.set("dfs.permissions.supergroup", "supergroup"); + UnixUserGroupInformation.saveToConf(conf, + UnixUserGroupInformation.UGI_PROPERTY_NAME, DFS_UGI); + dfs = new MiniDFSCluster(conf, 1, true, null); + FileSystem fs = dfs.getFileSystem(); + + // create mapred.system.dir + Path mapredSysDir = new Path("/mapred"); + fs.mkdirs(mapredSysDir); + fs.setPermission(mapredSysDir, new FsPermission(SYSTEM_DIR_PERMISSION)); + fs.setOwner(mapredSysDir, "mr", "mrgroup"); + + // start mr (i.e jobtracker) + Configuration mrConf = new Configuration(); + UnixUserGroupInformation.saveToConf(mrConf, + UnixUserGroupInformation.UGI_PROPERTY_NAME, MR_UGI); + mr = new MiniMRCluster(0, 0, 0, dfs.getFileSystem().getUri().toString(), + 1, null, null, MR_UGI, new JobConf(mrConf)); + JobTracker jobtracker = mr.getJobTrackerRunner().getJobTracker(); + + // add garbage to mapred.system.dir + Path garbage = new Path(jobtracker.getSystemDir(), "garbage"); + fs.mkdirs(garbage); + fs.setPermission(garbage, new FsPermission(SYSTEM_DIR_PERMISSION)); + fs.setOwner(garbage, "test", "test-group"); + + // stop the jobtracker + mr.stopJobTracker(); + mr.getJobTrackerConf().setBoolean("mapred.jobtracker.restart.recover", + false); + // start jobtracker but dont wait for it to be up + mr.startJobTracker(false); + + // check 5 times .. each time wait for 2 secs to check if the jobtracker + // has crashed or not. + for (int i = 0; i < 5; ++i) { + LOG.info("Check #" + i); + if (!mr.getJobTrackerRunner().isActive()) { + return; + } + UtilsForTests.waitFor(2000); + } + + assertFalse("JobTracker did not bail out (waited for 10 secs)", + mr.getJobTrackerRunner().isActive()); + } finally { + if (dfs != null) { dfs.shutdown(); } + if (mr != null) { mr.shutdown();} + } + } +} \ No newline at end of file