You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by ac...@apache.org on 2011/09/08 20:40:27 UTC

svn commit: r1166849 - in /hadoop/common/trunk/hadoop-mapreduce-project: ./ hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/ap...

Author: acmurthy
Date: Thu Sep  8 18:40:27 2011
New Revision: 1166849

URL: http://svn.apache.org/viewvc?rev=1166849&view=rev
Log:
MAPREDUCE-2947. Fixed race condition in AuxiliaryServices. Contributed by Vinod K V.

Modified:
    hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt
    hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainerResponsePBImpl.java
    hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java

Modified: hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt?rev=1166849&r1=1166848&r2=1166849&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt Thu Sep  8 18:40:27 2011
@@ -1230,6 +1230,9 @@ Release 0.23.0 - Unreleased
    MAPREDUCE-2942. TestNMAuditLogger.testNMAuditLoggerWithIP failing (Thomas Graves 
    via mahadev)
 
+   MAPREDUCE-2947. Fixed race condition in AuxiliaryServices. (vinodkv via
+   acmurthy) 
+
 Release 0.22.0 - Unreleased
 
   INCOMPATIBLE CHANGES

Modified: hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainerResponsePBImpl.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainerResponsePBImpl.java?rev=1166849&r1=1166848&r2=1166849&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainerResponsePBImpl.java (original)
+++ hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/StartContainerResponsePBImpl.java Thu Sep  8 18:40:27 2011
@@ -48,20 +48,20 @@ public class StartContainerResponsePBImp
     viaProto = true;
   }
   
-  public StartContainerResponseProto getProto() {
+  public synchronized StartContainerResponseProto getProto() {
     mergeLocalToProto();
     proto = viaProto ? proto : builder.build();
     viaProto = true;
     return proto;
   }
 
-  private void mergeLocalToBuilder() {
+  private synchronized void mergeLocalToBuilder() {
     if (this.serviceResponse != null) {
       addServiceResponseToProto();
     }
   }
   
-  private void mergeLocalToProto() {
+  private synchronized void mergeLocalToProto() {
     if (viaProto) {
       maybeInitBuilder();
     }
@@ -70,7 +70,7 @@ public class StartContainerResponsePBImp
     viaProto = true;
   }
 
-  private void maybeInitBuilder() {
+  private synchronized void maybeInitBuilder() {
     if (viaProto || builder == null) {
       builder = StartContainerResponseProto.newBuilder(proto);
     }
@@ -79,17 +79,17 @@ public class StartContainerResponsePBImp
    
 
   @Override
-  public Map<String, ByteBuffer> getAllServiceResponse() {
+  public synchronized Map<String, ByteBuffer> getAllServiceResponse() {
     initServiceResponse();
     return this.serviceResponse;
   }
   @Override
-  public ByteBuffer getServiceResponse(String key) {
+  public synchronized ByteBuffer getServiceResponse(String key) {
     initServiceResponse();
     return this.serviceResponse.get(key);
   }
   
-  private void initServiceResponse() {
+  private synchronized void initServiceResponse() {
     if (this.serviceResponse != null) {
       return;
     }
@@ -103,14 +103,14 @@ public class StartContainerResponsePBImp
   }
   
   @Override
-  public void addAllServiceResponse(final Map<String, ByteBuffer> serviceResponse) {
+  public synchronized void addAllServiceResponse(final Map<String, ByteBuffer> serviceResponse) {
     if (serviceResponse == null)
       return;
     initServiceResponse();
     this.serviceResponse.putAll(serviceResponse);
   }
   
-  private void addServiceResponseToProto() {
+  private synchronized void addServiceResponseToProto() {
     maybeInitBuilder();
     builder.clearServiceResponse();
     if (serviceResponse == null)
@@ -118,24 +118,24 @@ public class StartContainerResponsePBImp
     Iterable<StringBytesMapProto> iterable = new Iterable<StringBytesMapProto>() {
       
       @Override
-      public Iterator<StringBytesMapProto> iterator() {
+      public synchronized Iterator<StringBytesMapProto> iterator() {
         return new Iterator<StringBytesMapProto>() {
           
           Iterator<String> keyIter = serviceResponse.keySet().iterator();
           
           @Override
-          public void remove() {
+          public synchronized void remove() {
             throw new UnsupportedOperationException();
           }
           
           @Override
-          public StringBytesMapProto next() {
+          public synchronized StringBytesMapProto next() {
             String key = keyIter.next();
             return StringBytesMapProto.newBuilder().setKey(key).setValue(convertToProtoFormat(serviceResponse.get(key))).build();
           }
           
           @Override
-          public boolean hasNext() {
+          public synchronized boolean hasNext() {
             return keyIter.hasNext();
           }
         };
@@ -144,17 +144,17 @@ public class StartContainerResponsePBImp
     builder.addAllServiceResponse(iterable);
   }
   @Override
-  public void setServiceResponse(String key, ByteBuffer val) {
+  public synchronized void setServiceResponse(String key, ByteBuffer val) {
     initServiceResponse();
     this.serviceResponse.put(key, val);
   }
   @Override
-  public void removeServiceResponse(String key) {
+  public synchronized void removeServiceResponse(String key) {
     initServiceResponse();
     this.serviceResponse.remove(key);
   }
   @Override
-  public void clearServiceResponse() {
+  public synchronized void clearServiceResponse() {
     initServiceResponse();
     this.serviceResponse.clear();
   }

Modified: hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java?rev=1166849&r1=1166848&r2=1166849&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java (original)
+++ hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java Thu Sep  8 18:40:27 2011
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -72,7 +73,14 @@ public class AuxServices extends Abstrac
    * the the name of the service as defined in the configuration.
    */
   public Map<String, ByteBuffer> getMeta() {
-    return Collections.unmodifiableMap(serviceMeta);
+    Map<String, ByteBuffer> metaClone = new HashMap<String, ByteBuffer>(
+        serviceMeta.size());
+    synchronized (serviceMeta) {
+      for (Entry<String, ByteBuffer> entry : serviceMeta.entrySet()) {
+        metaClone.put(entry.getKey(), entry.getValue().duplicate());
+      }
+    }
+    return metaClone;
   }
 
   @Override