HDFS-9812. Streamer threads leak if failure happens when closing DFSOutputStream. Contributed by Lin Yiqun.
(cherry picked from commit 352d299cf8ebe330d24117df98d1e6a64ae38c26) (cherry picked from commit fe0009a2bd17e26f9e9364ec3f772e9a3f138de8)
This commit is contained in:
parent
352d5a7e88
commit
d84d54e26c
@ -774,14 +774,19 @@ protected synchronized void closeImpl() throws IOException {
|
||||
flushInternal(); // flush all data to Datanodes
|
||||
// get last block before destroying the streamer
|
||||
ExtendedBlock lastBlock = getStreamer().getBlock();
|
||||
closeThreads(false);
|
||||
|
||||
try (TraceScope ignored =
|
||||
dfsClient.getTracer().newScope("completeFile")) {
|
||||
completeFile(lastBlock);
|
||||
}
|
||||
} catch (ClosedChannelException ignored) {
|
||||
} finally {
|
||||
setClosed();
|
||||
// Failures may happen when flushing data.
|
||||
// Streamers may keep waiting for the new block information.
|
||||
// Thus need to force closing these threads.
|
||||
// Don't need to call setClosed() because closeThreads(true)
|
||||
// calls setClosed() in the finally block.
|
||||
closeThreads(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user