HDFS-10684. WebHDFS DataNode calls fail without parameter createparent. Contributed by John Zhuge.

(cherry picked from commit fbdbbd57cd)
This commit is contained in:
Andrew Wang 2016-12-13 18:01:31 -08:00
parent 0af67aa200
commit 6b795c34d0
3 changed files with 42 additions and 2 deletions

View File

@ -39,7 +39,7 @@ public class CreateParentParam extends BooleanParam {
* @param str a string representation of the parameter value. * @param str a string representation of the parameter value.
*/ */
public CreateParentParam(final String str) { public CreateParentParam(final String str) {
this(DOMAIN.parse(str)); this(DOMAIN.parse(str == null ? DEFAULT : str));
} }
@Override @Override

View File

@ -39,7 +39,7 @@ public class OverwriteParam extends BooleanParam {
* @param str a string representation of the parameter value. * @param str a string representation of the parameter value.
*/ */
public OverwriteParam(final String str) { public OverwriteParam(final String str) {
this(DOMAIN.parse(str)); super(DOMAIN, DOMAIN.parse(str == null ? DEFAULT : str));
} }
@Override @Override

View File

@ -25,6 +25,7 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.text.MessageFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
@ -49,6 +50,7 @@ import org.apache.hadoop.hdfs.web.resources.NamenodeAddressParam;
import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
@ -533,6 +535,44 @@ public class TestWebHdfsFileSystemContract extends FileSystemContractBaseTest {
} }
} }
public void testDatanodeCreateMissingParameter() throws IOException {
final WebHdfsFileSystem webhdfs = (WebHdfsFileSystem) fs;
final Path testDir = new Path(MessageFormat.format("/test/{0}/{1}",
TestWebHdfsFileSystemContract.class,
GenericTestUtils.getMethodName()));
assertTrue(webhdfs.mkdirs(testDir));
for (String dnCreateParam : new String[]{
CreateFlagParam.NAME,
CreateParentParam.NAME,
OverwriteParam.NAME
}) {
final HttpOpParam.Op op = PutOpParam.Op.CREATE;
final Path newfile = new Path(testDir, "newfile_" + dnCreateParam);
final URL url = webhdfs.toUrl(op, newfile);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(op.getType().toString());
conn.setDoOutput(false);
conn.setInstanceFollowRedirects(false);
conn.connect();
final String redirect = conn.getHeaderField("Location");
conn.disconnect();
//remove createparent
WebHdfsFileSystem.LOG.info("redirect = " + redirect);
String re = "&" + dnCreateParam + "=[^&]*";
String modified = redirect.replaceAll(re, "");
WebHdfsFileSystem.LOG.info("modified = " + modified);
//connect to datanode
conn = (HttpURLConnection)new URL(modified).openConnection();
conn.setRequestMethod(op.getType().toString());
conn.setDoOutput(op.getDoOutput());
conn.connect();
assertEquals(HttpServletResponse.SC_CREATED, conn.getResponseCode());
}
}
@Test @Test
public void testAccess() throws IOException, InterruptedException { public void testAccess() throws IOException, InterruptedException {
Path p1 = new Path("/pathX"); Path p1 = new Path("/pathX");