HDFS-16127. Improper pipeline close recovery causes a permanent write failure or data loss. Contributed by Kihwal Lee.
This commit is contained in:
parent
997d749f8a
commit
47002719f2
@ -783,7 +783,19 @@ class DataStreamer extends Daemon {
|
|||||||
// Is this block full?
|
// Is this block full?
|
||||||
if (one.isLastPacketInBlock()) {
|
if (one.isLastPacketInBlock()) {
|
||||||
// wait for the close packet has been acked
|
// wait for the close packet has been acked
|
||||||
waitForAllAcks();
|
try {
|
||||||
|
waitForAllAcks();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
// No need to do a close recovery if the last packet was acked.
|
||||||
|
// i.e. ackQueue is empty. waitForAllAcks() can get an exception
|
||||||
|
// (e.g. connection reset) while sending a heartbeat packet,
|
||||||
|
// if the DN sends the final ack and closes the connection.
|
||||||
|
synchronized (dataQueue) {
|
||||||
|
if (!ackQueue.isEmpty()) {
|
||||||
|
throw ioe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (shouldStop()) {
|
if (shouldStop()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user