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 at...@apache.org on 2013/06/18 23:05:16 UTC
svn commit: r1494303 - in
/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs:
ChecksumFileSystem.java ChecksumFs.java FSOutputSummer.java
Author: atm
Date: Tue Jun 18 21:05:16 2013
New Revision: 1494303
URL: http://svn.apache.org/r1494303
Log:
HDFS-4906. HDFS Output streams should not accept writes after being closed. Contributed by Aaron T. Myers.
Modified:
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFs.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java?rev=1494303&r1=1494302&r2=1494303&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java Tue Jun 18 21:05:16 2013
@@ -19,6 +19,7 @@
package org.apache.hadoop.fs;
import java.io.*;
+import java.nio.channels.ClosedChannelException;
import java.util.Arrays;
import org.apache.hadoop.classification.InterfaceAudience;
@@ -368,6 +369,7 @@ public abstract class ChecksumFileSystem
private FSDataOutputStream datas;
private FSDataOutputStream sums;
private static final float CHKSUM_AS_FRACTION = 0.01f;
+ private boolean isClosed = false;
public ChecksumFSOutputSummer(ChecksumFileSystem fs,
Path file,
@@ -391,9 +393,13 @@ public abstract class ChecksumFileSystem
@Override
public void close() throws IOException {
- flushBuffer();
- sums.close();
- datas.close();
+ try {
+ flushBuffer();
+ sums.close();
+ datas.close();
+ } finally {
+ isClosed = true;
+ }
}
@Override
@@ -402,6 +408,13 @@ public abstract class ChecksumFileSystem
datas.write(b, offset, len);
sums.write(checksum);
}
+
+ @Override
+ protected void checkClosed() throws IOException {
+ if (isClosed) {
+ throw new ClosedChannelException();
+ }
+ }
}
@Override
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFs.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFs.java?rev=1494303&r1=1494302&r2=1494303&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFs.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFs.java Tue Jun 18 21:05:16 2013
@@ -20,6 +20,7 @@ package org.apache.hadoop.fs;
import java.io.*;
import java.net.URISyntaxException;
+import java.nio.channels.ClosedChannelException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
@@ -325,6 +326,7 @@ public abstract class ChecksumFs extends
private FSDataOutputStream datas;
private FSDataOutputStream sums;
private static final float CHKSUM_AS_FRACTION = 0.01f;
+ private boolean isClosed = false;
public ChecksumFSOutputSummer(final ChecksumFs fs, final Path file,
@@ -356,9 +358,13 @@ public abstract class ChecksumFs extends
@Override
public void close() throws IOException {
- flushBuffer();
- sums.close();
- datas.close();
+ try {
+ flushBuffer();
+ sums.close();
+ datas.close();
+ } finally {
+ isClosed = true;
+ }
}
@Override
@@ -367,6 +373,13 @@ public abstract class ChecksumFs extends
datas.write(b, offset, len);
sums.write(checksum);
}
+
+ @Override
+ protected void checkClosed() throws IOException {
+ if (isClosed) {
+ throw new ClosedChannelException();
+ }
+ }
}
@Override
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java?rev=1494303&r1=1494302&r2=1494303&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java Tue Jun 18 21:05:16 2013
@@ -53,6 +53,15 @@ abstract public class FSOutputSummer ext
*/
protected abstract void writeChunk(byte[] b, int offset, int len, byte[] checksum)
throws IOException;
+
+ /**
+ * Check if the implementing OutputStream is closed and should no longer
+ * accept writes. Implementations should do nothing if this stream is not
+ * closed, and should throw an {@link IOException} if it is closed.
+ *
+ * @throws IOException if this stream is already closed.
+ */
+ protected abstract void checkClosed() throws IOException;
/** Write one byte */
@Override
@@ -84,7 +93,10 @@ abstract public class FSOutputSummer ext
*/
@Override
public synchronized void write(byte b[], int off, int len)
- throws IOException {
+ throws IOException {
+
+ checkClosed();
+
if (off < 0 || len < 0 || off > b.length - len) {
throw new ArrayIndexOutOfBoundsException();
}