Prechádzať zdrojové kódy

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

Jian He 8 rokov pred
rodič
commit
36eda5af75

+ 3 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java

@@ -1770,7 +1770,9 @@ public class Client implements AutoCloseable {
     }
 
     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));
     }
 

+ 24 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java

@@ -159,6 +159,11 @@ public class TestAMRMClient {
     // 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();
@@ -867,6 +872,25 @@ public class TestAMRMClient {
     initAMRMClientAndTest(false);
   }
 
+  @Test (timeout=60000)
+  public void testAMRMClientWithSaslEncryption() throws Exception {
+    conf.set("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();
+    initAMRMClientAndTest(false);
+
+    // recreate the original MiniYARNCluster and YarnClient for other tests
+    conf.unset("hadoop.rpc.protection");
+    tearDown();
+    createClientAndCluster(conf);
+    // unless we start an application the cancelApp() method will fail when
+    // it runs after this test
+    startApp();
+  }
+
   @Test (timeout=60000)
   public void testAMRMClientAllocReqId() throws YarnException, IOException {
     initAMRMClientAndTest(true);