diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index a5181009703..21410784e55 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -48,6 +48,9 @@ Release 2.6.1 - UNRELEASED HADOOP-11674. oneByteBuf in CryptoInputStream and CryptoOutputStream should be non static. (Sean Busbey via yliu) + HADOOP-11710. Make CryptoOutputStream behave like DFSOutputStream wrt + synchronization. (Sean Busbey via yliu) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/CryptoOutputStream.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/CryptoOutputStream.java index f1b27376a0e..9e79fbf6b6a 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/CryptoOutputStream.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/CryptoOutputStream.java @@ -40,6 +40,9 @@ import com.google.common.base.Preconditions; * padding = pos%(algorithm blocksize); *
* The underlying stream offset is maintained as state. + * + * Note that while some of this class' methods are synchronized, this is just to + * match the threadsafety behavior of DFSOutputStream. See HADOOP-11710. */ @InterfaceAudience.Private @InterfaceStability.Evolving @@ -125,7 +128,7 @@ public class CryptoOutputStream extends FilterOutputStream implements * @throws IOException */ @Override - public void write(byte[] b, int off, int len) throws IOException { + public synchronized void write(byte[] b, int off, int len) throws IOException { checkStream(); if (b == null) { throw new NullPointerException(); @@ -212,14 +215,16 @@ public class CryptoOutputStream extends FilterOutputStream implements } @Override - public void close() throws IOException { + public synchronized void close() throws IOException { if (closed) { return; } - - super.close(); - freeBuffers(); - closed = true; + try { + super.close(); + freeBuffers(); + } finally { + closed = true; + } } /** @@ -227,7 +232,7 @@ public class CryptoOutputStream extends FilterOutputStream implements * underlying stream, then do the flush. */ @Override - public void flush() throws IOException { + public synchronized void flush() throws IOException { checkStream(); encrypt(); super.flush();