Author: szetszwo
Date: Thu Sep 16 20:40:22 2010
New Revision: 997921
URL: http://svn.apache.org/viewvc?rev=997921&view=rev
Log:
HDFS-1320. Improve the error messages when using hftp://.
Modified:
hadoop/hdfs/trunk/CHANGES.txt
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/ByteRangeInputStream.java
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/HftpFileSystem.java
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FileDataServlet.java
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/ListPathsServlet.java
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/MiniDFSCluster.java
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestFileStatus.java
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestListPathServlet.java
Modified: hadoop/hdfs/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/CHANGES.txt?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
--- hadoop/hdfs/trunk/CHANGES.txt (original)
+++ hadoop/hdfs/trunk/CHANGES.txt Thu Sep 16 20:40:22 2010
@@ -129,6 +129,8 @@ Trunk (unreleased changes)
HDFS-1395. Add @Override to FSDataset methods that implement
FSDatasetInterface methods. (suresh)
+ HDFS-1320. Improve the error messages when using hftp://. (szetszwo)
+
OPTIMIZATIONS
HDFS-1140. Speedup INode.getPathComponents. (Dmytro Molkov via shv)
Modified:
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/ByteRangeInputStream.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/ByteRangeInputStream.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/ByteRangeInputStream.java
(original)
+++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/ByteRangeInputStream.java
Thu Sep 16 20:40:22 2010
@@ -89,29 +89,26 @@ class ByteRangeInputStream extends FSInp
in = null;
}
- final URLOpener o;
-
// use the original url if no resolved url exists (e.g., if it's
// the first time a request is made)
- System.out.println("url: "+resolvedURL.getURL());
- if (resolvedURL.getURL() == null) {
- o = originalURL;
- } else {
- o = resolvedURL;
- }
-
+ final URLOpener o = resolvedURL.getURL() == null? originalURL:
resolvedURL;
+
final HttpURLConnection connection = o.openConnection();
- connection.setRequestMethod("GET");
- if (startPos != 0) {
- connection.setRequestProperty("Range", "bytes="+startPos+"-");
- }
- connection.connect();
- final String cl = connection.getHeaderField(StreamFile.CONTENT_LENGTH);
- filelength = cl == null? -1: Long.parseLong(cl);
- if (HftpFileSystem.LOG.isDebugEnabled()) {
- HftpFileSystem.LOG.debug("filelength = " + filelength);
+ try {
+ connection.setRequestMethod("GET");
+ if (startPos != 0) {
+ connection.setRequestProperty("Range", "bytes="+startPos+"-");
+ }
+ connection.connect();
+ final String cl = connection.getHeaderField(StreamFile.CONTENT_LENGTH);
+ filelength = cl == null? -1: Long.parseLong(cl);
+ if (HftpFileSystem.LOG.isDebugEnabled()) {
+ HftpFileSystem.LOG.debug("filelength = " + filelength);
+ }
+ in = connection.getInputStream();
+ } catch(IOException ioe) {
+ HftpFileSystem.throwIOExceptionFromConnection(connection, ioe);
}
- in = connection.getInputStream();
if (startPos != 0 && connection.getResponseCode() != 206) {
// we asked for a byte range but did not receive a partial content
Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/HftpFileSystem.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/HftpFileSystem.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/HftpFileSystem.java
(original)
+++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/HftpFileSystem.java Thu
Sep 16 20:40:22 2010
@@ -269,6 +269,15 @@ public class HftpFileSystem extends File
return ugiParamenter.toString();
}
+ static Void throwIOExceptionFromConnection(
+ final HttpURLConnection connection, final IOException ioe
+ ) throws IOException {
+ final int code = connection.getResponseCode();
+ final String s = connection.getResponseMessage();
+ throw s == null? ioe:
+ new IOException(s + " (error code=" + code + ")", ioe);
+ }
+
/**
* Open an HTTP connection to the namenode to read file data and metadata.
* @param path The path component of the URL
@@ -278,9 +287,13 @@ public class HftpFileSystem extends File
throws IOException {
query = updateQuery(query);
final URL url = getNamenodeURL(path, query);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setRequestMethod("GET");
- connection.connect();
+ final HttpURLConnection connection =
(HttpURLConnection)url.openConnection();
+ try {
+ connection.setRequestMethod("GET");
+ connection.connect();
+ } catch(IOException ioe) {
+ throwIOExceptionFromConnection(connection, ioe);
+ }
return connection;
}
Modified:
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FileDataServlet.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FileDataServlet.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
---
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FileDataServlet.java
(original)
+++
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FileDataServlet.java
Thu Sep 16 20:40:22 2010
@@ -120,9 +120,9 @@ public class FileDataServlet extends Dfs
response.getWriter().println(e.toString());
}
} else if (info == null) {
- response.sendError(400, "cat: File not found " + path);
+ response.sendError(400, "File not found " + path);
} else {
- response.sendError(400, "cat: " + path + ": is a directory");
+ response.sendError(400, path + ": is a directory");
}
return null;
}
Modified:
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/ListPathsServlet.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/ListPathsServlet.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
---
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/ListPathsServlet.java
(original)
+++
hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/ListPathsServlet.java
Thu Sep 16 20:40:22 2010
@@ -131,9 +131,11 @@ public class ListPathsServlet extends Df
throws ServletException, IOException {
final PrintWriter out = response.getWriter();
final XMLOutputter doc = new XMLOutputter(out, "UTF-8");
+
+ final Map<String, String> root = buildRoot(request, doc);
+ final String path = root.get("path");
+
try {
- final Map<String, String> root = buildRoot(request, doc);
- final String path = root.get("path");
final boolean recur = "yes".equals(root.get("recursive"));
final Pattern filter = Pattern.compile(root.get("filter"));
final Pattern exclude = Pattern.compile(root.get("exclude"));
@@ -191,14 +193,18 @@ public class ListPathsServlet extends Df
writeXml(re, p, doc);
}
}
- doc.endDocument();
return null;
}
});
+ } catch(IOException ioe) {
+ writeXml(ioe, path, doc);
} catch (InterruptedException e) {
LOG.warn("ListPathServlet encountered InterruptedException", e);
response.sendError(400, e.getMessage());
} finally {
+ if (doc != null) {
+ doc.endDocument();
+ }
if (out != null) {
out.close();
}
Modified:
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/MiniDFSCluster.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/MiniDFSCluster.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/MiniDFSCluster.java
(original)
+++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/MiniDFSCluster.java
Thu Sep 16 20:40:22 2010
@@ -26,6 +26,7 @@ import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.channels.FileChannel;
+import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
@@ -56,6 +57,7 @@ import org.apache.hadoop.net.DNSToSwitch
import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.net.StaticMapping;
import org.apache.hadoop.security.RefreshUserMappingsProtocol;
+import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.authorize.ProxyUsers;
import org.apache.hadoop.security.authorize.RefreshAuthorizationPolicyProtocol;
import org.apache.hadoop.util.StringUtils;
@@ -879,6 +881,22 @@ public class MiniDFSCluster {
}
/**
+ * @return a {...@link HftpFileSystem} object as specified user.
+ */
+ public HftpFileSystem getHftpFileSystemAs(final String username,
+ final Configuration conf, final String... groups
+ ) throws IOException, InterruptedException {
+ final UserGroupInformation ugi = UserGroupInformation.createUserForTesting(
+ username, groups);
+ return ugi.doAs(new PrivilegedExceptionAction<HftpFileSystem>() {
+ @Override
+ public HftpFileSystem run() throws Exception {
+ return getHftpFileSystem();
+ }
+ });
+ }
+
+ /**
* Get the directories where the namenode stores its image.
*/
public Collection<URI> getNameDirs() {
Modified:
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDistributedFileSystem.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
---
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
(original)
+++
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
Thu Sep 16 20:40:22 2010
@@ -18,7 +18,10 @@
package org.apache.hadoop.hdfs;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -179,90 +182,6 @@ public class TestDistributedFileSystem {
}
@Test
- public void testFileChecksum() throws IOException {
- ((Log4JLogger)HftpFileSystem.LOG).getLogger().setLevel(Level.ALL);
-
- final long seed = RAN.nextLong();
- System.out.println("seed=" + seed);
- RAN.setSeed(seed);
-
- final Configuration conf = getTestConfiguration();
- conf.set(DFSConfigKeys.DFS_DATANODE_HOST_NAME_KEY, "localhost");
-
- final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
- final FileSystem hdfs = cluster.getFileSystem();
- final String hftpuri = "hftp://" +
conf.get(DFSConfigKeys.DFS_NAMENODE_HTTP_ADDRESS_KEY);
- System.out.println("hftpuri=" + hftpuri);
- final FileSystem hftp = new Path(hftpuri).getFileSystem(conf);
-
- final String dir = "/filechecksum";
- final int block_size = 1024;
- final int buffer_size = conf.getInt("io.file.buffer.size", 4096);
- conf.setInt(DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_KEY, 512);
-
- //try different number of blocks
- for(int n = 0; n < 5; n++) {
- //generate random data
- final byte[] data = new byte[RAN.nextInt(block_size/2-1)+n*block_size+1];
- RAN.nextBytes(data);
- System.out.println("data.length=" + data.length);
-
- //write data to a file
- final Path foo = new Path(dir, "foo" + n);
- {
- final FSDataOutputStream out = hdfs.create(foo, false, buffer_size,
- (short)2, block_size);
- out.write(data);
- out.close();
- }
-
- //compute checksum
- final FileChecksum hdfsfoocs = hdfs.getFileChecksum(foo);
- System.out.println("hdfsfoocs=" + hdfsfoocs);
-
- final FileChecksum hftpfoocs = hftp.getFileChecksum(foo);
- System.out.println("hftpfoocs=" + hftpfoocs);
-
- final Path qualified = new Path(hftpuri + dir, "foo" + n);
- final FileChecksum qfoocs = hftp.getFileChecksum(qualified);
- System.out.println("qfoocs=" + qfoocs);
-
- //write another file
- final Path bar = new Path(dir, "bar" + n);
- {
- final FSDataOutputStream out = hdfs.create(bar, false, buffer_size,
- (short)2, block_size);
- out.write(data);
- out.close();
- }
-
- { //verify checksum
- final FileChecksum barcs = hdfs.getFileChecksum(bar);
- final int barhashcode = barcs.hashCode();
- assertEquals(hdfsfoocs.hashCode(), barhashcode);
- assertEquals(hdfsfoocs, barcs);
-
- assertEquals(hftpfoocs.hashCode(), barhashcode);
- assertEquals(hftpfoocs, barcs);
-
- assertEquals(qfoocs.hashCode(), barhashcode);
- assertEquals(qfoocs, barcs);
- }
- }
- cluster.shutdown();
- }
-
- @Test
- public void testAllWithDualPort() throws Exception {
- dualPortTesting = true;
-
- testFileSystemCloseAll();
- testDFSClose();
- testDFSClient();
- testFileChecksum();
- }
-
- @Test
public void testStatistics() throws Exception {
int lsLimit = 2;
final Configuration conf = getTestConfiguration();
@@ -359,4 +278,100 @@ public class TestDistributedFileSystem {
assertEquals(writeOps, DFSTestUtil.getStatistics(fs).getWriteOps());
assertEquals(largeReadOps,
DFSTestUtil.getStatistics(fs).getLargeReadOps());
}
+
+ @Test
+ public void testFileChecksum() throws Exception {
+ ((Log4JLogger)HftpFileSystem.LOG).getLogger().setLevel(Level.ALL);
+
+ final long seed = RAN.nextLong();
+ System.out.println("seed=" + seed);
+ RAN.setSeed(seed);
+
+ final Configuration conf = getTestConfiguration();
+ conf.set(DFSConfigKeys.DFS_DATANODE_HOST_NAME_KEY, "localhost");
+
+ final MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
+ final FileSystem hdfs = cluster.getFileSystem();
+ final String hftpuri = "hftp://" +
conf.get(DFSConfigKeys.DFS_NAMENODE_HTTP_ADDRESS_KEY);
+ System.out.println("hftpuri=" + hftpuri);
+ final FileSystem hftp = new Path(hftpuri).getFileSystem(conf);
+
+ final String dir = "/filechecksum";
+ final int block_size = 1024;
+ final int buffer_size = conf.getInt("io.file.buffer.size", 4096);
+ conf.setInt(DFSConfigKeys.DFS_BYTES_PER_CHECKSUM_KEY, 512);
+
+ //try different number of blocks
+ for(int n = 0; n < 5; n++) {
+ //generate random data
+ final byte[] data = new byte[RAN.nextInt(block_size/2-1)+n*block_size+1];
+ RAN.nextBytes(data);
+ System.out.println("data.length=" + data.length);
+
+ //write data to a file
+ final Path foo = new Path(dir, "foo" + n);
+ {
+ final FSDataOutputStream out = hdfs.create(foo, false, buffer_size,
+ (short)2, block_size);
+ out.write(data);
+ out.close();
+ }
+
+ //compute checksum
+ final FileChecksum hdfsfoocs = hdfs.getFileChecksum(foo);
+ System.out.println("hdfsfoocs=" + hdfsfoocs);
+
+ final FileChecksum hftpfoocs = hftp.getFileChecksum(foo);
+ System.out.println("hftpfoocs=" + hftpfoocs);
+
+ final Path qualified = new Path(hftpuri + dir, "foo" + n);
+ final FileChecksum qfoocs = hftp.getFileChecksum(qualified);
+ System.out.println("qfoocs=" + qfoocs);
+
+ //write another file
+ final Path bar = new Path(dir, "bar" + n);
+ {
+ final FSDataOutputStream out = hdfs.create(bar, false, buffer_size,
+ (short)2, block_size);
+ out.write(data);
+ out.close();
+ }
+
+ { //verify checksum
+ final FileChecksum barcs = hdfs.getFileChecksum(bar);
+ final int barhashcode = barcs.hashCode();
+ assertEquals(hdfsfoocs.hashCode(), barhashcode);
+ assertEquals(hdfsfoocs, barcs);
+
+ assertEquals(hftpfoocs.hashCode(), barhashcode);
+ assertEquals(hftpfoocs, barcs);
+
+ assertEquals(qfoocs.hashCode(), barhashcode);
+ assertEquals(qfoocs, barcs);
+ }
+
+ { //test permission error on hftp
+ hdfs.setPermission(new Path(dir), new FsPermission((short)0));
+ try {
+ final String username =
UserGroupInformation.getCurrentUser().getShortUserName() + "1";
+ final HftpFileSystem hftp2 = cluster.getHftpFileSystemAs(username,
conf, "somegroup");
+ hftp2.getFileChecksum(qualified);
+ fail();
+ } catch(IOException ioe) {
+ FileSystem.LOG.info("GOOD: getting an exception", ioe);
+ }
+ }
+ }
+ cluster.shutdown();
+ }
+
+ @Test
+ public void testAllWithDualPort() throws Exception {
+ dualPortTesting = true;
+
+ testFileSystemCloseAll();
+ testDFSClose();
+ testDFSClient();
+ testFileChecksum();
+ }
}
Modified:
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestFileStatus.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestFileStatus.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
--- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestFileStatus.java
(original)
+++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestFileStatus.java
Thu Sep 16 20:40:22 2010
@@ -17,6 +17,11 @@
*/
package org.apache.hadoop.hdfs;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Random;
@@ -29,17 +34,17 @@ import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
+import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdfs.protocol.FSConstants;
import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.ipc.RemoteException;
+import org.apache.hadoop.security.UserGroupInformation;
import org.apache.log4j.Level;
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import org.junit.BeforeClass;
import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
/**
* This class tests the FileStatus API.
@@ -184,7 +189,7 @@ public class TestFileStatus {
/** Test FileStatus objects obtained from a directory */
@Test
- public void testGetFileStatusOnDir() throws IOException {
+ public void testGetFileStatusOnDir() throws Exception {
// Create the directory
Path dir = new Path("/test/mkdirs");
assertTrue("mkdir failed", fs.mkdirs(dir));
@@ -284,5 +289,17 @@ public class TestFileStatus {
assertEquals(file2.toString(), itor.next().getPath().toString());
assertEquals(file3.toString(), itor.next().getPath().toString());
assertFalse(itor.hasNext());
+
+ { //test permission error on hftp
+ fs.setPermission(dir, new FsPermission((short)0));
+ try {
+ final String username =
UserGroupInformation.getCurrentUser().getShortUserName() + "1";
+ final HftpFileSystem hftp2 = cluster.getHftpFileSystemAs(username,
conf, "somegroup");
+ hftp2.getContentSummary(dir);
+ fail();
+ } catch(IOException ioe) {
+ FileSystem.LOG.info("GOOD: getting an exception", ioe);
+ }
+ }
}
}
Modified:
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestListPathServlet.java
URL:
http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestListPathServlet.java?rev=997921&r1=997920&r2=997921&view=diff
==============================================================================
---
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestListPathServlet.java
(original)
+++
hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestListPathServlet.java
Thu Sep 16 20:40:22 2010
@@ -27,7 +27,9 @@ import org.apache.hadoop.conf.Configurat
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdfs.server.namenode.ListPathsServlet;
+import org.apache.hadoop.security.UserGroupInformation;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -100,6 +102,29 @@ public class TestListPathServlet {
// Non existent path
checkStatus("/nonexistent");
checkStatus("/nonexistent/a");
+
+ final String username =
UserGroupInformation.getCurrentUser().getShortUserName() + "1";
+ final HftpFileSystem hftp2 = cluster.getHftpFileSystemAs(username, CONF,
"somegroup");
+ { //test file not found on hftp
+ final Path nonexistent = new Path("/nonexistent");
+ try {
+ hftp2.getFileStatus(nonexistent);
+ Assert.fail();
+ } catch(IOException ioe) {
+ FileSystem.LOG.info("GOOD: getting an exception", ioe);
+ }
+ }
+
+ { //test permission error on hftp
+ final Path dir = new Path("/dir");
+ fs.setPermission(dir, new FsPermission((short)0));
+ try {
+ hftp2.getFileStatus(new Path(dir, "a"));
+ Assert.fail();
+ } catch(IOException ioe) {
+ FileSystem.LOG.info("GOOD: getting an exception", ioe);
+ }
+ }
}
private void checkStatus(String listdir) throws IOException {