Author: suresh
Date: Thu May  2 16:37:54 2013
New Revision: 1478432

URL: http://svn.apache.org/r1478432
Log:
HADOOP-8711. Merge 1478426 and 1478429 from branch-1

Added:
    
hadoop/common/branches/branch-1.2/src/test/org/apache/hadoop/ipc/TestServer.java
      - copied unchanged from r1478429, 
hadoop/common/branches/branch-1/src/test/org/apache/hadoop/ipc/TestServer.java
Modified:
    hadoop/common/branches/branch-1.2/CHANGES.txt
    hadoop/common/branches/branch-1.2/src/core/org/apache/hadoop/ipc/Server.java

Modified: hadoop/common/branches/branch-1.2/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/common/branches/branch-1.2/CHANGES.txt?rev=1478432&r1=1478431&r2=1478432&view=diff
==============================================================================
--- hadoop/common/branches/branch-1.2/CHANGES.txt (original)
+++ hadoop/common/branches/branch-1.2/CHANGES.txt Thu May  2 16:37:54 2013
@@ -613,6 +613,9 @@ Release 1.2.0 - 2013.04.16
     HADOOP-9537. Backport changes to add support running Hadoop client on AIX.
     (Aaron T. Myers, backported by Arpit Agarwal via suresh)
 
+    HADOOP-8711. Provide an option for IPC server users to avoid printing stack
+    information for certain exceptions. (Brandon Li via suresh)
+
 Release 1.1.2 - 2013.01.30
 
   INCOMPATIBLE CHANGES

Modified: 
hadoop/common/branches/branch-1.2/src/core/org/apache/hadoop/ipc/Server.java
URL: 
http://svn.apache.org/viewvc/hadoop/common/branches/branch-1.2/src/core/org/apache/hadoop/ipc/Server.java?rev=1478432&r1=1478431&r2=1478432&view=diff
==============================================================================
--- 
hadoop/common/branches/branch-1.2/src/core/org/apache/hadoop/ipc/Server.java 
(original)
+++ 
hadoop/common/branches/branch-1.2/src/core/org/apache/hadoop/ipc/Server.java 
Thu May  2 16:37:54 2013
@@ -43,11 +43,13 @@ import java.nio.channels.WritableByteCha
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -95,7 +97,44 @@ import org.apache.hadoop.util.StringUtil
 public abstract class Server {
   private final boolean authorize;
   private boolean isSecurityEnabled;
-  
+  private ExceptionsHandler exceptionsHandler = new ExceptionsHandler();
+
+  public void addTerseExceptions(Class<?>... exceptionClass) {
+    exceptionsHandler.addTerseExceptions(exceptionClass);
+  }
+
+  /**
+   * ExceptionsHandler manages Exception groups for special handling e.g., 
terse
+   * exception group for concise logging messages
+   */
+  static class ExceptionsHandler {
+    private volatile Set<String> terseExceptions = new HashSet<String>();
+
+    /**
+     * Add exception class so server won't log its stack trace. Modifying the
+     * terseException through this method is thread safe.
+     * 
+     * @param exceptionClass
+     *          exception classes
+     */
+    void addTerseExceptions(Class<?>... exceptionClass) {
+
+      // Make a copy of terseException for performing modification
+      final HashSet<String> newSet = new HashSet<String>(terseExceptions);
+
+      // Add all class names into the HashSet
+      for (Class<?> name : exceptionClass) {
+        newSet.add(name.toString());
+      }
+      // Replace terseException set
+      terseExceptions = Collections.unmodifiableSet(newSet);
+    }
+
+    boolean isTerse(Class<?> t) {
+      return terseExceptions.contains(t.toString());
+    }
+  }
+
   /**
    * The first four bytes of Hadoop RPC connections
    */
@@ -1398,7 +1437,19 @@ public abstract class Server {
                   );
             }
           } catch (Throwable e) {
-            LOG.info(getName()+", call "+call+": error: " + e, e);
+            String logMsg = getName() + ", call " + call + ": error: " + e;
+            if (e instanceof RuntimeException || e instanceof Error) {
+              // These exception types indicate something is probably wrong
+              // on the server side, as opposed to just a normal exceptional
+              // result.
+              LOG.warn(logMsg, e);
+            } else if (exceptionsHandler.isTerse(e.getClass())) {
+              // Don't log the whole stack trace of these exceptions.
+              // Way too noisy!
+              LOG.info(logMsg);
+            } else {
+              LOG.info(logMsg, e);
+            }
             errorClass = e.getClass().getName();
             error = StringUtils.stringifyException(e);
           }


Reply via email to