Repository: hadoop Updated Branches: refs/heads/branch-2.6 cbc3288b5 -> b05bb4984
HDFS-9294. DFSClient deadlock when close file and failed to renew lease. Contributed by Brahma Reddy Battula Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b05bb498 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b05bb498 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b05bb498 Branch: refs/heads/branch-2.6 Commit: b05bb4984dcbb8bc09ce294b586d866049bb2d2a Parents: cbc3288 Author: Tsz-Wo Nicholas Sze <[email protected]> Authored: Sat Jan 16 23:39:08 2016 +0800 Committer: Tsz-Wo Nicholas Sze <[email protected]> Committed: Sat Jan 16 23:39:08 2016 +0800 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 + .../org/apache/hadoop/hdfs/DFSOutputStream.java | 73 +++++++++++--------- 2 files changed, 42 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/b05bb498/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index f1a18e2..a5e04c4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -38,6 +38,9 @@ Release 2.6.4 - UNRELEASED HDFS-8767. RawLocalFileSystem.listStatus() returns null for UNIX pipefile. (Kanaka Kumar Avvaru via wheat9) + HDFS-9294. DFSClient deadlock when close file and failed to renew lease. + (Brahma Reddy Battula via szetszwo) + Release 2.6.3 - 2015-12-17 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/b05bb498/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java index 21e4d4e..942653c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java @@ -2171,13 +2171,15 @@ public class DFSOutputStream extends FSOutputSummer * Aborts this output stream and releases any system * resources associated with this stream. */ - synchronized void abort() throws IOException { - if (closed) { - return; + void abort() throws IOException { + synchronized (this) { + if (closed) { + return; + } + streamer.setLastException(new IOException("Lease timeout of " + + (dfsClient.getHdfsTimeout() / 1000) + " seconds expired.")); + closeThreads(true); } - streamer.setLastException(new IOException("Lease timeout of " - + (dfsClient.getHdfsTimeout()/1000) + " seconds expired.")); - closeThreads(true); dfsClient.endFileLease(fileId); } @@ -2204,39 +2206,42 @@ public class DFSOutputStream extends FSOutputSummer * resources associated with this stream. */ @Override - public synchronized void close() throws IOException { - if (closed) { - IOException e = lastException.getAndSet(null); - if (e == null) - return; - else - throw e; - } + public void close() throws IOException { + synchronized (this) { + if (closed) { + IOException e = lastException.getAndSet(null); + if (e == null) + return; + else + throw e; + } - try { - flushBuffer(); // flush from all upper layers + try { + flushBuffer(); // flush from all upper layers - if (currentPacket != null) { - waitAndQueueCurrentPacket(); - } + if (currentPacket != null) { + waitAndQueueCurrentPacket(); + } - if (bytesCurBlock != 0) { - // send an empty packet to mark the end of the block - currentPacket = createPacket(0, 0, bytesCurBlock, currentSeqno++); - currentPacket.lastPacketInBlock = true; - currentPacket.syncBlock = shouldSyncBlock; - } + if (bytesCurBlock != 0) { + // send an empty packet to mark the end of the block + currentPacket = createPacket(0, 0, bytesCurBlock, currentSeqno++); + currentPacket.lastPacketInBlock = true; + currentPacket.syncBlock = shouldSyncBlock; + } - flushInternal(); // flush all data to Datanodes - // get last block before destroying the streamer - ExtendedBlock lastBlock = streamer.getBlock(); - closeThreads(false); - completeFile(lastBlock); - dfsClient.endFileLease(fileId); - } catch (ClosedChannelException e) { - } finally { - closed = true; + flushInternal(); // flush all data to Datanodes + // get last block before destroying the streamer + ExtendedBlock lastBlock = streamer.getBlock(); + closeThreads(false); + completeFile(lastBlock); + + } catch (ClosedChannelException e) { + } finally { + closed = true; + } } + dfsClient.endFileLease(fileId); } // should be called holding (this) lock since setTestFilename() may
