You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by el...@apache.org on 2012/08/20 23:10:45 UTC
svn commit: r1375216 - in
/hadoop/common/trunk/hadoop-common-project/hadoop-common: CHANGES.txt
src/main/java/org/apache/hadoop/io/IOUtils.java
src/test/java/org/apache/hadoop/io/TestIOUtils.java
Author: eli
Date: Mon Aug 20 21:10:44 2012
New Revision: 1375216
URL: http://svn.apache.org/viewvc?rev=1375216&view=rev
Log:
HADOOP-8614. IOUtils#skipFully hangs forever on EOF. Contributed by Colin Patrick McCabe
Modified:
hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/IOUtils.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestIOUtils.java
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1375216&r1=1375215&r2=1375216&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt Mon Aug 20 21:10:44 2012
@@ -405,6 +405,9 @@ Branch-2 ( Unreleased changes )
HADOOP-8654. TextInputFormat delimiter bug (Gelesh and Jason Lowe via
bobby)
+ HADOOP-8614. IOUtils#skipFully hangs forever on EOF.
+ (Colin Patrick McCabe via eli)
+
BREAKDOWN OF HDFS-3042 SUBTASKS
HADOOP-8220. ZKFailoverController doesn't handle failure to become active
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/IOUtils.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/IOUtils.java?rev=1375216&r1=1375215&r2=1375216&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/IOUtils.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/IOUtils.java Mon Aug 20 21:10:44 2012
@@ -206,12 +206,20 @@ public class IOUtils {
* for any reason (including EOF)
*/
public static void skipFully(InputStream in, long len) throws IOException {
- while (len > 0) {
- long ret = in.skip(len);
- if (ret < 0) {
- throw new IOException( "Premature EOF from inputStream");
+ long amt = len;
+ while (amt > 0) {
+ long ret = in.skip(amt);
+ if (ret == 0) {
+ // skip may return 0 even if we're not at EOF. Luckily, we can
+ // use the read() method to figure out if we're at the end.
+ int b = in.read();
+ if (b == -1) {
+ throw new EOFException( "Premature EOF from inputStream after " +
+ "skipping " + (len - amt) + " byte(s).");
+ }
+ ret = 1;
}
- len -= ret;
+ amt -= ret;
}
}
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestIOUtils.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestIOUtils.java?rev=1375216&r1=1375215&r2=1375216&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestIOUtils.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestIOUtils.java Mon Aug 20 21:10:44 2012
@@ -21,6 +21,8 @@ package org.apache.hadoop.io;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -175,4 +177,41 @@ public class TestIOUtils {
"Error while reading compressed data", ioe);
}
}
+
+ @Test
+ public void testSkipFully() throws IOException {
+ byte inArray[] = new byte[] {0, 1, 2, 3, 4};
+ ByteArrayInputStream in = new ByteArrayInputStream(inArray);
+ try {
+ in.mark(inArray.length);
+ IOUtils.skipFully(in, 2);
+ IOUtils.skipFully(in, 2);
+ try {
+ IOUtils.skipFully(in, 2);
+ fail("expected to get a PrematureEOFException");
+ } catch (EOFException e) {
+ assertEquals(e.getMessage(), "Premature EOF from inputStream " +
+ "after skipping 1 byte(s).");
+ }
+ in.reset();
+ try {
+ IOUtils.skipFully(in, 20);
+ fail("expected to get a PrematureEOFException");
+ } catch (EOFException e) {
+ assertEquals(e.getMessage(), "Premature EOF from inputStream " +
+ "after skipping 5 byte(s).");
+ }
+ in.reset();
+ IOUtils.skipFully(in, 5);
+ try {
+ IOUtils.skipFully(in, 10);
+ fail("expected to get a PrematureEOFException");
+ } catch (EOFException e) {
+ assertEquals(e.getMessage(), "Premature EOF from inputStream " +
+ "after skipping 0 byte(s).");
+ }
+ } finally {
+ in.close();
+ }
+ }
}