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 vi...@apache.org on 2015/09/02 23:05:03 UTC
hadoop git commit: HADOOP-11730. Regression: s3n read failure
recovery broken. (Takenori Sato via stevel)
Repository: hadoop
Updated Branches:
refs/heads/branch-2.6.1 736ebeca3 -> e0e93e9f8
HADOOP-11730. Regression: s3n read failure recovery broken. (Takenori Sato via stevel)
(cherry picked from commit a6a5d1d6b5ee76c829ba7b54a4ad619f7b986681)
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/e0e93e9f
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/e0e93e9f
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/e0e93e9f
Branch: refs/heads/branch-2.6.1
Commit: e0e93e9f8d5aaf2eb37d4e91f29f7395109109a2
Parents: 736ebec
Author: Steve Loughran <st...@apache.org>
Authored: Thu Apr 23 21:39:30 2015 +0100
Committer: Vinod Kumar Vavilapalli <vi...@apache.org>
Committed: Wed Sep 2 14:01:53 2015 -0700
----------------------------------------------------------------------
hadoop-common-project/hadoop-common/CHANGES.txt | 3 ++
.../hadoop/fs/s3native/NativeS3FileSystem.java | 32 +++++++++++---------
.../NativeS3FileSystemContractBaseTest.java | 24 +++++++++++----
3 files changed, 39 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e0e93e9f/hadoop-common-project/hadoop-common/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt
index 6564d24..fb6153f 100644
--- a/hadoop-common-project/hadoop-common/CHANGES.txt
+++ b/hadoop-common-project/hadoop-common/CHANGES.txt
@@ -54,6 +54,9 @@ Release 2.6.1 - UNRELEASED
HADOOP-11812. Implement listLocatedStatus for ViewFileSystem to speed up
split calculation (gera)
+ HADOOP-11730. Regression: s3n read failure recovery broken.
+ (Takenori Sato via stevel)
+
Release 2.6.0 - 2014-11-18
INCOMPATIBLE CHANGES
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e0e93e9f/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java
----------------------------------------------------------------------
diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java
index e490edf..663db23 100644
--- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java
+++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java
@@ -54,6 +54,7 @@ import org.apache.hadoop.fs.LocalDirAllocator;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.fs.s3.S3Exception;
+import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.retry.RetryPolicies;
import org.apache.hadoop.io.retry.RetryPolicy;
import org.apache.hadoop.io.retry.RetryProxy;
@@ -119,7 +120,7 @@ public class NativeS3FileSystem extends FileSystem {
key);
LOG.debug("{}", e, e);
try {
- seek(pos);
+ reopen(pos);
result = in.read();
} catch (EOFException eof) {
LOG.debug("EOF on input stream read: {}", eof, eof);
@@ -148,7 +149,7 @@ public class NativeS3FileSystem extends FileSystem {
} catch (IOException e) {
LOG.info( "Received IOException while reading '{}'," +
" attempting to reopen.", key);
- seek(pos);
+ reopen(pos);
result = in.read(b, off, len);
}
if (result > 0) {
@@ -168,16 +169,21 @@ public class NativeS3FileSystem extends FileSystem {
/**
* Close the inner stream if not null. Even if an exception
* is raised during the close, the field is set to null
- * @throws IOException if raised by the close() operation.
*/
- private void closeInnerStream() throws IOException {
- if (in != null) {
- try {
- in.close();
- } finally {
- in = null;
- }
- }
+ private void closeInnerStream() {
+ IOUtils.closeStream(in);
+ in = null;
+ }
+
+ /**
+ * Reopen a new input stream with the specified position
+ * @param pos the position to reopen a new stream
+ * @throws IOException
+ */
+ private synchronized void reopen(long pos) throws IOException {
+ LOG.debug("Reopening key '{}' for reading at position '{}", key, pos);
+ InputStream newStream = store.retrieve(key, pos);
+ updateInnerStream(newStream, pos);
}
/**
@@ -202,9 +208,7 @@ public class NativeS3FileSystem extends FileSystem {
}
if (pos != newpos) {
// the seek is attempting to move the current position
- LOG.debug("Opening key '{}' for reading at position '{}", key, newpos);
- InputStream newStream = store.retrieve(key, newpos);
- updateInnerStream(newStream, newpos);
+ reopen(newpos);
}
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e0e93e9f/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/NativeS3FileSystemContractBaseTest.java
----------------------------------------------------------------------
diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/NativeS3FileSystemContractBaseTest.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/NativeS3FileSystemContractBaseTest.java
index ac6b9ec..c6a6bc2 100644
--- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/NativeS3FileSystemContractBaseTest.java
+++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/NativeS3FileSystemContractBaseTest.java
@@ -158,14 +158,15 @@ public abstract class NativeS3FileSystemContractBaseTest
public void testRetryOnIoException() throws Exception {
class TestInputStream extends InputStream {
- boolean shouldThrow = false;
+ boolean shouldThrow = true;
int throwCount = 0;
int pos = 0;
byte[] bytes;
+ boolean threwException = false;
public TestInputStream() {
bytes = new byte[256];
- for (int i = 0; i < 256; i++) {
+ for (int i = pos; i < 256; i++) {
bytes[i] = (byte)i;
}
}
@@ -175,8 +176,10 @@ public abstract class NativeS3FileSystemContractBaseTest
shouldThrow = !shouldThrow;
if (shouldThrow) {
throwCount++;
+ threwException = true;
throw new IOException();
}
+ assertFalse("IOException was thrown. InputStream should be reopened", threwException);
return pos++;
}
@@ -185,9 +188,10 @@ public abstract class NativeS3FileSystemContractBaseTest
shouldThrow = !shouldThrow;
if (shouldThrow) {
throwCount++;
+ threwException = true;
throw new IOException();
}
-
+ assertFalse("IOException was thrown. InputStream should be reopened", threwException);
int sizeToRead = Math.min(len, 256 - pos);
for (int i = 0; i < sizeToRead; i++) {
b[i] = bytes[pos + i];
@@ -195,13 +199,20 @@ public abstract class NativeS3FileSystemContractBaseTest
pos += sizeToRead;
return sizeToRead;
}
+
+ public void reopenAt(long byteRangeStart) {
+ threwException = false;
+ pos = Long.valueOf(byteRangeStart).intValue();
+ }
+
}
- final InputStream is = new TestInputStream();
+ final TestInputStream is = new TestInputStream();
class MockNativeFileSystemStore extends Jets3tNativeFileSystemStore {
@Override
public InputStream retrieve(String key, long byteRangeStart) throws IOException {
+ is.reopenAt(byteRangeStart);
return is;
}
}
@@ -226,8 +237,9 @@ public abstract class NativeS3FileSystemContractBaseTest
}
// Test to make sure the throw path was exercised.
- // 144 = 128 + (128 / 8)
- assertEquals(144, ((TestInputStream)is).throwCount);
+ // every read should have thrown 1 IOException except for the first read
+ // 144 = 128 - 1 + (128 / 8)
+ assertEquals(143, ((TestInputStream)is).throwCount);
}
}