MAPREDUCE-2995. Fixed race condition in ContainerLauncher. Contributed by Vinod K V.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1170281 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Arun Murthy 2011-09-13 18:15:14 +00:00
parent 53f921418d
commit 88ff272cfd
2 changed files with 19 additions and 19 deletions

View File

@ -1309,6 +1309,9 @@ Release 0.23.0 - Unreleased
MAPREDUCE-2995. Better handling of expired containers in MapReduce MAPREDUCE-2995. Better handling of expired containers in MapReduce
ApplicationMaster. (vinodkv via acmurthy) ApplicationMaster. (vinodkv via acmurthy)
MAPREDUCE-2995. Fixed race condition in ContainerLauncher. (vinodkv via
acmurthy)
Release 0.22.0 - Unreleased Release 0.22.0 - Unreleased
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -21,9 +21,9 @@
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -79,8 +79,8 @@ public class ContainerLauncherImpl extends AbstractService implements
private RecordFactory recordFactory; private RecordFactory recordFactory;
//have a cache/map of UGIs so as to avoid creating too many RPC //have a cache/map of UGIs so as to avoid creating too many RPC
//client connection objects to the same NodeManager //client connection objects to the same NodeManager
private Map<String, UserGroupInformation> ugiMap = private ConcurrentMap<String, UserGroupInformation> ugiMap =
new HashMap<String, UserGroupInformation>(); new ConcurrentHashMap<String, UserGroupInformation>();
public ContainerLauncherImpl(AppContext context) { public ContainerLauncherImpl(AppContext context) {
super(ContainerLauncherImpl.class.getName()); super(ContainerLauncherImpl.class.getName());
@ -142,23 +142,20 @@ protected ContainerManager getCMProxy(ContainerId containerID,
UserGroupInformation user = UserGroupInformation.getCurrentUser(); UserGroupInformation user = UserGroupInformation.getCurrentUser();
// TODO: Synchronization problems!!
if (UserGroupInformation.isSecurityEnabled()) { if (UserGroupInformation.isSecurityEnabled()) {
if(!ugiMap.containsKey(containerManagerBindAddr)) {
Token<ContainerTokenIdentifier> token = Token<ContainerTokenIdentifier> token = new Token<ContainerTokenIdentifier>(
new Token<ContainerTokenIdentifier>( containerToken.getIdentifier().array(), containerToken
containerToken.getIdentifier().array(), .getPassword().array(), new Text(containerToken.getKind()),
containerToken.getPassword().array(), new Text( new Text(containerToken.getService()));
containerToken.getKind()), new Text(
containerToken.getService()));
// the user in createRemoteUser in this context is not important // the user in createRemoteUser in this context is not important
user = UserGroupInformation.createRemoteUser(containerManagerBindAddr); UserGroupInformation ugi = UserGroupInformation
user.addToken(token); .createRemoteUser(containerManagerBindAddr);
ugiMap.put(containerManagerBindAddr, user); ugi.addToken(token);
} else { ugiMap.putIfAbsent(containerManagerBindAddr, ugi);
user = ugiMap.get(containerManagerBindAddr); user = ugiMap.get(containerManagerBindAddr);
} }
}
ContainerManager proxy = ContainerManager proxy =
user.doAs(new PrivilegedAction<ContainerManager>() { user.doAs(new PrivilegedAction<ContainerManager>() {
@Override @Override