Browse Source

HADOOP-1369. Fix inconsistent synchronization in TaskTracker.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@539132 13f79535-47bb-0310-9956-ffa450edef68
Doug Cutting 18 năm trước cách đây
mục cha
commit
f19607ae61
2 tập tin đã thay đổi với 18 bổ sung17 xóa
  1. 3 0
      CHANGES.txt
  2. 15 17
      src/java/org/apache/hadoop/mapred/TaskTracker.java

+ 3 - 0
CHANGES.txt

@@ -425,6 +425,9 @@ Branch 0.13 (unreleased changes)
 119. HADOOP-1368.  Fix inconsistent synchronization in JobInProgress.
      (omalley via cutting)
 
+120. HADOOP-1369.  Fix inconsistent synchronization in TaskTracker.
+     (omalley via cutting)
+
 
 Release 0.12.3 - 2007-04-06
 

+ 15 - 17
src/java/org/apache/hadoop/mapred/TaskTracker.java

@@ -24,7 +24,6 @@ import java.io.OutputStream;
 import java.io.PrintStream;
 import java.net.BindException;
 import java.net.InetSocketAddress;
-import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -37,8 +36,6 @@ import java.util.TreeMap;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.regex.Pattern;
-import java.util.Collections;
-import java.util.Collection;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -803,17 +800,17 @@ public class TaskTracker
     // else resend the previous status information.
     //
     if (status == null) {
-      List<TaskStatus> taskReports = 
-        new ArrayList<TaskStatus>(runningTasks.size());
       synchronized (this) {
+        List<TaskStatus> taskReports = 
+          new ArrayList<TaskStatus>(runningTasks.size());
         for (TaskInProgress tip: runningTasks.values()) {
           taskReports.add(tip.createStatus());
         }
+        status = 
+          new TaskTrackerStatus(taskTrackerName, localHostname, 
+                                httpPort, taskReports, 
+                                failures); 
       }
-      status = 
-        new TaskTrackerStatus(taskTrackerName, localHostname, 
-                              httpPort, taskReports, 
-                              failures); 
     } else {
       LOG.info("Resending 'status' to '" + jobTrackAddr.getHostName() +
                "' with reponseId '" + heartbeatResponseId);
@@ -822,14 +819,15 @@ public class TaskTracker
     //
     // Check if we should ask for a new Task
     //
-    boolean askForNewTask = false; 
-    if ((mapTotal < maxCurrentTasks || reduceTotal < maxCurrentTasks) &&
-        acceptNewTasks) {
+    boolean askForNewTask;
+    synchronized (this) {
+      askForNewTask = (mapTotal < maxCurrentTasks || 
+                       reduceTotal < maxCurrentTasks) &&
+                      acceptNewTasks; 
+    }
+    if (askForNewTask) {
       checkLocalDirs(fConf.getLocalDirs());
-        
-      if (enoughFreeSpace(minSpaceStart)) {
-        askForNewTask = true;
-      }
+      askForNewTask = enoughFreeSpace(minSpaceStart);
     }
       
     //
@@ -1453,7 +1451,7 @@ public class TaskTracker
     /**
      * The map output has been lost.
      */
-    public synchronized void mapOutputLost(String failure
+    private synchronized void mapOutputLost(String failure
                                            ) throws IOException {
       if (runstate == TaskStatus.State.SUCCEEDED) {
         LOG.info("Reporting output lost:"+task.getTaskId());