diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index 3c3dadedf71..b2f71cc1f98 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -679,6 +679,9 @@ Release 0.23.1 - Unreleased MAPREDUCE-3354. Changed scripts so that jobhistory server is started by bin/mapred instead of bin/yarn. (Jonathan Eagles via acmurthy) + MAPREDUCE-3809. Ensure that there is no needless sleep in Task at the end + of the task. (sseth via acmurthy) + Release 0.23.0 - 2011-11-01 INCOMPATIBLE CHANGES diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/Task.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/Task.java index c74c9b9d8d6..31245a979f3 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/Task.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/Task.java @@ -656,14 +656,13 @@ public void run() { try { boolean taskFound = true; // whether TT knows about this task // sleep for a bit - try { - Thread.sleep(PROGRESS_INTERVAL); - } - catch (InterruptedException e) { - if (LOG.isDebugEnabled()) { - LOG.debug(getTaskID() + " Progress/ping thread exiting " + - "since it got interrupted"); + synchronized(lock) { + if (taskDone.get()) { + break; } + lock.wait(PROGRESS_INTERVAL); + } + if (taskDone.get()) { break; } @@ -721,7 +720,14 @@ public void startCommunicationThread() { } public void stopCommunicationThread() throws InterruptedException { if (pingThread != null) { - synchronized (lock) { + // Intent of the lock is to not send an interupt in the middle of an + // umbilical.ping or umbilical.statusUpdate + synchronized(lock) { + //Interrupt if sleeping. Otherwise wait for the RPC call to return. + lock.notify(); + } + + synchronized (lock) { while (!done) { lock.wait(); }