HBASE-6318 SplitLogWorker exited due to ConcurrentModificationException

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1358330 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
jxiang 2012-07-06 18:18:38 +00:00
parent edfbb77dc5
commit 2c48f28239
1 changed files with 29 additions and 16 deletions

View File

@ -1293,7 +1293,7 @@ public class HLogSplitter {
boolean progress_failed = false; boolean progress_failed = false;
try { try {
for (int i = 0; i < logWriters.size(); i++) { for (int i = 0, n = logWriters.size(); i < n; i++) {
Future<Void> future = completionService.take(); Future<Void> future = completionService.take();
future.get(); future.get();
if (!progress_failed && !reportProgressIfIsDistributedLogSplitting()) { if (!progress_failed && !reportProgressIfIsDistributedLogSplitting()) {
@ -1327,6 +1327,22 @@ public class HLogSplitter {
if (thrown == null) { if (thrown == null) {
thrown = Lists.newArrayList(); thrown = Lists.newArrayList();
} }
try {
for (WriterThread t : writerThreads) {
while (t.isAlive()) {
t.shouldStop = true;
t.interrupt();
try {
t.join(10);
} catch (InterruptedException e) {
IOException iie = new InterruptedIOException();
iie.initCause(e);
throw iie;
}
}
}
} finally {
synchronized (logWriters) {
for (WriterAndPath wap : logWriters.values()) { for (WriterAndPath wap : logWriters.values()) {
try { try {
wap.w.close(); wap.w.close();
@ -1338,8 +1354,10 @@ public class HLogSplitter {
LOG.info("Closed path " + wap.p + " (wrote " + wap.editsWritten LOG.info("Closed path " + wap.p + " (wrote " + wap.editsWritten
+ " edits in " + (wap.nanosSpent / 1000 / 1000) + "ms)"); + " edits in " + (wap.nanosSpent / 1000 / 1000) + "ms)");
} }
}
logWritersClosed = true; logWritersClosed = true;
} }
}
return thrown; return thrown;
} }
@ -1424,11 +1442,6 @@ public class HLogSplitter {
/* Number of nanos spent writing to this log */ /* Number of nanos spent writing to this log */
long nanosSpent = 0; long nanosSpent = 0;
/* To check whether a close has already been tried on the
* writer
*/
boolean writerClosed = false;
WriterAndPath(final Path p, final Writer w) { WriterAndPath(final Path p, final Writer w) {
this.p = p; this.p = p;
this.w = w; this.w = w;