HDFS-3972. Trash emptier fails in secure HA cluster. Contributed by Todd Lipcon
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1390730 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bde1ba70c1
commit
31bd01c15d
|
@ -72,8 +72,9 @@ public class TrashPolicyDefault extends TrashPolicy {
|
||||||
|
|
||||||
public TrashPolicyDefault() { }
|
public TrashPolicyDefault() { }
|
||||||
|
|
||||||
private TrashPolicyDefault(Path home, Configuration conf) throws IOException {
|
private TrashPolicyDefault(FileSystem fs, Path home, Configuration conf)
|
||||||
initialize(conf, home.getFileSystem(conf), home);
|
throws IOException {
|
||||||
|
initialize(conf, fs, home);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -279,7 +280,8 @@ public class TrashPolicyDefault extends TrashPolicy {
|
||||||
if (!home.isDirectory())
|
if (!home.isDirectory())
|
||||||
continue;
|
continue;
|
||||||
try {
|
try {
|
||||||
TrashPolicyDefault trash = new TrashPolicyDefault(home.getPath(), conf);
|
TrashPolicyDefault trash = new TrashPolicyDefault(
|
||||||
|
fs, home.getPath(), conf);
|
||||||
trash.deleteCheckpoint();
|
trash.deleteCheckpoint();
|
||||||
trash.createCheckpoint();
|
trash.createCheckpoint();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.net.URLConnection;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.AccessController;
|
import java.security.AccessController;
|
||||||
import java.security.PrivilegedAction;
|
import java.security.PrivilegedAction;
|
||||||
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
|
@ -451,6 +452,41 @@ public class SecurityUtil {
|
||||||
return action.run();
|
return action.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform the given action as the daemon's login user. If an
|
||||||
|
* InterruptedException is thrown, it is converted to an IOException.
|
||||||
|
*
|
||||||
|
* @param action the action to perform
|
||||||
|
* @return the result of the action
|
||||||
|
* @throws IOException in the event of error
|
||||||
|
*/
|
||||||
|
public static <T> T doAsLoginUser(PrivilegedExceptionAction<T> action)
|
||||||
|
throws IOException {
|
||||||
|
return doAsUser(UserGroupInformation.getLoginUser(), action);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform the given action as the daemon's current user. If an
|
||||||
|
* InterruptedException is thrown, it is converted to an IOException.
|
||||||
|
*
|
||||||
|
* @param action the action to perform
|
||||||
|
* @return the result of the action
|
||||||
|
* @throws IOException in the event of error
|
||||||
|
*/
|
||||||
|
public static <T> T doAsCurrentUser(PrivilegedExceptionAction<T> action)
|
||||||
|
throws IOException {
|
||||||
|
return doAsUser(UserGroupInformation.getCurrentUser(), action);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> T doAsUser(UserGroupInformation ugi,
|
||||||
|
PrivilegedExceptionAction<T> action) throws IOException {
|
||||||
|
try {
|
||||||
|
return ugi.doAs(action);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
throw new IOException(ie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a (if need be) secure connection to a URL in a secure environment
|
* Open a (if need be) secure connection to a URL in a secure environment
|
||||||
|
|
|
@ -631,6 +631,8 @@ Release 2.0.2-alpha - 2012-09-07
|
||||||
HDFS-3938. remove current limitations from HttpFS docs. (tucu)
|
HDFS-3938. remove current limitations from HttpFS docs. (tucu)
|
||||||
|
|
||||||
HDFS-3944. Httpfs resolveAuthority() is not resolving host correctly. (tucu)
|
HDFS-3944. Httpfs resolveAuthority() is not resolving host correctly. (tucu)
|
||||||
|
|
||||||
|
HDFS-3972. Trash emptier fails in secure HA cluster. (todd via eli)
|
||||||
|
|
||||||
BREAKDOWN OF HDFS-3042 SUBTASKS
|
BREAKDOWN OF HDFS-3042 SUBTASKS
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -512,7 +513,7 @@ public class NameNode {
|
||||||
stopHttpServer();
|
stopHttpServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startTrashEmptier(Configuration conf) throws IOException {
|
private void startTrashEmptier(final Configuration conf) throws IOException {
|
||||||
long trashInterval =
|
long trashInterval =
|
||||||
conf.getLong(FS_TRASH_INTERVAL_KEY, FS_TRASH_INTERVAL_DEFAULT);
|
conf.getLong(FS_TRASH_INTERVAL_KEY, FS_TRASH_INTERVAL_DEFAULT);
|
||||||
if (trashInterval == 0) {
|
if (trashInterval == 0) {
|
||||||
|
@ -521,7 +522,18 @@ public class NameNode {
|
||||||
throw new IOException("Cannot start tresh emptier with negative interval."
|
throw new IOException("Cannot start tresh emptier with negative interval."
|
||||||
+ " Set " + FS_TRASH_INTERVAL_KEY + " to a positive value.");
|
+ " Set " + FS_TRASH_INTERVAL_KEY + " to a positive value.");
|
||||||
}
|
}
|
||||||
this.emptier = new Thread(new Trash(conf).getEmptier(), "Trash Emptier");
|
|
||||||
|
// This may be called from the transitionToActive code path, in which
|
||||||
|
// case the current user is the administrator, not the NN. The trash
|
||||||
|
// emptier needs to run as the NN. See HDFS-3972.
|
||||||
|
FileSystem fs = SecurityUtil.doAsLoginUser(
|
||||||
|
new PrivilegedExceptionAction<FileSystem>() {
|
||||||
|
@Override
|
||||||
|
public FileSystem run() throws IOException {
|
||||||
|
return FileSystem.get(conf);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.emptier = new Thread(new Trash(fs, conf).getEmptier(), "Trash Emptier");
|
||||||
this.emptier.setDaemon(true);
|
this.emptier.setDaemon(true);
|
||||||
this.emptier.start();
|
this.emptier.start();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue