HDFS-3616. Fix a ConcurrentModificationException bug that BP actor threads may not be shutdown properly in DataNode. Contributed by Jing Zhao

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1402608 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2012-10-26 18:22:49 +00:00
parent 0e796b61e8
commit 3335e50244
3 changed files with 19 additions and 10 deletions

View File

@ -504,6 +504,9 @@ Release 2.0.3-alpha - Unreleased
out stream returned by WebHdfsFileSystem does not support it. (Jing Zhao
via szetszwo)
HDFS-3616. Fix a ConcurrentModificationException bug that BP actor threads
may not be shutdown properly in DataNode. (Jing Zhao via szetszwo)
Release 2.0.2-alpha - 2012-09-07
INCOMPATIBLE CHANGES

View File

@ -106,9 +106,8 @@ class BlockPoolManager {
}
}
void shutDownAll() throws InterruptedException {
BPOfferService[] bposArray = this.getAllNamenodeThreads();
void shutDownAll(BPOfferService[] bposArray) throws InterruptedException {
if (bposArray != null) {
for (BPOfferService bpos : bposArray) {
bpos.stop(); //interrupts the threads
}
@ -117,6 +116,7 @@ class BlockPoolManager {
bpos.join();
}
}
}
synchronized void startAll() throws IOException {
try {

View File

@ -1095,6 +1095,12 @@ public class DataNode extends Configured
}
}
// We need to make a copy of the original blockPoolManager#offerServices to
// make sure blockPoolManager#shutDownAll() can still access all the
// BPOfferServices, since after setting DataNode#shouldRun to false the
// offerServices may be modified.
BPOfferService[] bposArray = this.blockPoolManager == null ? null
: this.blockPoolManager.getAllNamenodeThreads();
this.shouldRun = false;
shutdownPeriodicScanners();
@ -1141,7 +1147,7 @@ public class DataNode extends Configured
if(blockPoolManager != null) {
try {
this.blockPoolManager.shutDownAll();
this.blockPoolManager.shutDownAll(bposArray);
} catch (InterruptedException ie) {
LOG.warn("Received exception in BlockPoolManager#shutDownAll: ", ie);
}