You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by dd...@apache.org on 2009/08/24 13:15:14 UTC
svn commit: r807147 - in /hadoop/mapreduce/trunk: ./
src/java/org/apache/hadoop/mapred/ src/test/mapred/org/apache/hadoop/mapred/
Author: ddas
Date: Mon Aug 24 11:15:13 2009
New Revision: 807147
URL: http://svn.apache.org/viewvc?rev=807147&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/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMapredSystemDir.java
Modified:
hadoop/mapreduce/trunk/CHANGES.txt
hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapred/JobTracker.java
hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/FakeObjectUtilities.java
hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/MiniMRCluster.java
hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMRServerPorts.java
hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTaskTrackerBlacklisting.java
hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTrackerReservation.java
Modified: hadoop/mapreduce/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/CHANGES.txt?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/CHANGES.txt (original)
+++ hadoop/mapreduce/trunk/CHANGES.txt Mon Aug 24 11:15:13 2009
@@ -456,3 +456,7 @@
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)
+
Modified: hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapred/JobTracker.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapred/JobTracker.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapred/JobTracker.java (original)
+++ hadoop/mapreduce/trunk/src/java/org/apache/hadoop/mapred/JobTracker.java Mon Aug 24 11:15:13 2009
@@ -188,19 +188,18 @@
* @param conf configuration for the JobTracker.
* @throws IOException
*/
- public static JobTracker startTracker(JobConf conf
- ) throws IOException,
- InterruptedException {
+ public static JobTracker startTracker(JobConf conf)
+ throws IOException, InterruptedException, LoginException {
return startTracker(conf, DEFAULT_CLOCK);
}
static JobTracker startTracker(JobConf conf, Clock clock)
- throws IOException, InterruptedException {
+ throws IOException, InterruptedException, LoginException {
return startTracker(conf, clock, generateNewIdentifier());
}
static JobTracker startTracker(JobConf conf, Clock clock, String identifier)
- throws IOException, InterruptedException {
+ throws IOException, InterruptedException, LoginException {
JobTracker result = null;
while (true) {
try {
@@ -213,6 +212,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));
@@ -1784,25 +1787,23 @@
private QueueManager queueManager;
- JobTracker(JobConf conf) throws IOException,InterruptedException{
+ JobTracker(JobConf conf)
+ throws IOException,InterruptedException, LoginException {
this(conf, new Clock());
}
/**
* Start the JobTracker process, listen on the indicated port
*/
- JobTracker(JobConf conf, Clock clock) throws IOException, InterruptedException {
+ JobTracker(JobConf conf, Clock clock)
+ throws IOException, InterruptedException, LoginException {
this(conf, clock, generateNewIdentifier());
}
JobTracker(JobConf conf, Clock newClock, String jobtrackerIndentifier)
- throws IOException, InterruptedException {
+ throws IOException, InterruptedException, LoginException {
// find the owner of the process
clock = newClock;
- try {
- mrOwner = UnixUserGroupInformation.login(conf);
- } catch (LoginException e) {
- throw new IOException(StringUtils.stringifyException(e));
- }
+ mrOwner = UnixUserGroupInformation.login(conf);
supergroup = conf.get("mapred.permissions.supergroup", "supergroup");
LOG.info("Starting jobtracker with owner as " + mrOwner.getUserName()
+ " and supergroup as " + supergroup);
@@ -1918,7 +1919,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) {
@@ -1964,17 +1965,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/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/FakeObjectUtilities.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/FakeObjectUtilities.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/FakeObjectUtilities.java (original)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/FakeObjectUtilities.java Mon Aug 24 11:15:13 2009
@@ -22,6 +22,8 @@
import java.util.Collection;
import java.util.Iterator;
+import javax.security.auth.login.LoginException;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.Path;
@@ -48,7 +50,7 @@
private String[] trackers;
FakeJobTracker(JobConf conf, Clock clock, String[] tts) throws IOException,
- InterruptedException {
+ InterruptedException, LoginException {
super(conf, clock);
this.trackers = tts;
//initialize max{Map/Reduce} task capacities to twice the clustersize
Modified: hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/MiniMRCluster.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/MiniMRCluster.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/MiniMRCluster.java (original)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/MiniMRCluster.java Mon Aug 24 11:15:13 2009
@@ -580,11 +580,20 @@
* Start the jobtracker.
*/
public void startJobTracker() {
+ startJobTracker(true);
+ }
+
+ public void startJobTracker(boolean wait) {
// Create the JobTracker
jobTracker = new JobTrackerRunner(conf, clock);
jobTrackerThread = new Thread(jobTracker);
jobTrackerThread.start();
+
+ if (!wait) {
+ return;
+ }
+
while (jobTracker.isActive() && !jobTracker.isUp()) {
try { // let daemons get started
Thread.sleep(1000);
Modified: hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMRServerPorts.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMRServerPorts.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMRServerPorts.java (original)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMRServerPorts.java Mon Aug 24 11:15:13 2009
@@ -18,6 +18,9 @@
package org.apache.hadoop.mapred;
import java.io.IOException;
+
+import javax.security.auth.login.LoginException;
+
import junit.framework.TestCase;
import org.apache.hadoop.hdfs.TestHDFSServerPorts;
import org.apache.hadoop.hdfs.server.datanode.DataNode;
@@ -57,7 +60,7 @@
* Check whether the JobTracker can be started.
*/
private JobTracker startJobTracker(JobConf conf, JTRunner runner)
- throws IOException {
+ throws IOException, LoginException {
conf.set("mapred.job.tracker", "localhost:0");
conf.set("mapred.job.tracker.http.address", "0.0.0.0:0");
JobTracker jt = null;
@@ -87,7 +90,7 @@
* Check whether the JobTracker can be started.
*/
private boolean canStartJobTracker(JobConf conf)
- throws IOException, InterruptedException {
+ throws IOException, InterruptedException, LoginException {
JobTracker jt = null;
try {
jt = JobTracker.startTracker(conf);
Added: hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMapredSystemDir.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMapredSystemDir.java?rev=807147&view=auto
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMapredSystemDir.java (added)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestMapredSystemDir.java Mon Aug 24 11:15:13 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
Modified: hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTaskTrackerBlacklisting.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTaskTrackerBlacklisting.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTaskTrackerBlacklisting.java (original)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTaskTrackerBlacklisting.java Mon Aug 24 11:15:13 2009
@@ -26,6 +26,8 @@
import java.util.Set;
import java.util.Map.Entry;
+import javax.security.auth.login.LoginException;
+
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
@@ -85,7 +87,7 @@
org.apache.hadoop.mapred.FakeObjectUtilities.FakeJobTracker {
FakeJobTracker(JobConf conf, Clock clock, String[] tts) throws IOException,
- InterruptedException {
+ InterruptedException, LoginException {
super(conf, clock, tts);
}
Modified: hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTrackerReservation.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTrackerReservation.java?rev=807147&r1=807146&r2=807147&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTrackerReservation.java (original)
+++ hadoop/mapreduce/trunk/src/test/mapred/org/apache/hadoop/mapred/TestTrackerReservation.java Mon Aug 24 11:15:13 2009
@@ -20,6 +20,8 @@
import java.io.IOException;
import java.util.ArrayList;
+import javax.security.auth.login.LoginException;
+
import org.apache.hadoop.mapred.FakeObjectUtilities.FakeJobInProgress;
import org.apache.hadoop.mapreduce.TaskType;
import org.apache.hadoop.mapreduce.server.jobtracker.TaskTracker;
@@ -39,7 +41,7 @@
org.apache.hadoop.mapred.FakeObjectUtilities.FakeJobTracker {
FakeJobTracker(JobConf conf, Clock clock, String[] tts) throws IOException,
- InterruptedException {
+ InterruptedException, LoginException {
super(conf, clock, tts);
}