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);
}