HADOOP-14062. ApplicationMasterProtocolPBClientImpl.allocate fails with EOFException when RPC privacy is enabled. Contributed by Steven Rand

This commit is contained in:
Jian He 2017-03-08 10:49:42 -08:00
parent 20fa7664d1
commit 2e8e51ad40
2 changed files with 32 additions and 3 deletions

View File

@ -71,7 +71,6 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import static org.apache.hadoop.ipc.RpcConstants.CONNECTION_CONTEXT_CALL_ID;
import static org.apache.hadoop.ipc.RpcConstants.PING_CALL_ID;
/** A client for an IPC service. IPC calls take a single {@link Writable} as a
@ -1767,7 +1766,9 @@ public static class IpcStreams implements Closeable, Flushable {
}
void setSaslClient(SaslRpcClient client) throws IOException {
setInputStream(client.getInputStream(in));
// Wrap the input stream in a BufferedInputStream to fill the buffer
// before reading its length (HADOOP-14062).
setInputStream(new BufferedInputStream(client.getInputStream(in)));
setOutputStream(client.getOutputStream(out));
}

View File

@ -39,7 +39,7 @@
import java.util.TreeSet;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeys;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.security.Credentials;
@ -133,6 +133,11 @@ public static void setup() throws Exception {
// set the minimum allocation so that resource decrease can go under 1024
conf.setInt(YarnConfiguration.RM_SCHEDULER_MINIMUM_ALLOCATION_MB, 512);
conf.setLong(YarnConfiguration.NM_LOG_RETAIN_SECONDS, 1);
createClientAndCluster(conf);
}
private static void createClientAndCluster(Configuration conf)
throws Exception {
yarnCluster = new MiniYARNCluster(TestAMRMClient.class.getName(), nodeCount, 1, 1);
yarnCluster.init(conf);
yarnCluster.start();
@ -656,6 +661,29 @@ private int getAllocatedContainersNumber(
@Test (timeout=60000)
public void testAMRMClient() throws YarnException, IOException {
registerAndAllocate();
}
@Test (timeout=60000)
public void testAMRMClientWithSaslEncryption() throws Exception {
conf.set(CommonConfigurationKeysPublic.HADOOP_RPC_PROTECTION, "privacy");
// we have to create a new instance of MiniYARNCluster to avoid SASL qop
// mismatches between client and server
tearDown();
createClientAndCluster(conf);
startApp();
registerAndAllocate();
// recreate the original MiniYARNCluster and YarnClient for other tests
conf.unset(CommonConfigurationKeysPublic.HADOOP_RPC_PROTECTION);
tearDown();
createClientAndCluster(conf);
// unless we start an application the cancelApp() method will fail when
// it runs after this test
startApp();
}
private void registerAndAllocate() throws YarnException, IOException {
AMRMClient<ContainerRequest> amClient = null;
try {
// start am rm client