You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by ew...@apache.org on 2016/02/09 19:17:12 UTC

kafka git commit: KAFKA-3189: Kafka server returns UnknownServerException for inherited exceptions

Repository: kafka
Updated Branches:
  refs/heads/trunk 6352a30f4 -> cd15321e0


KAFKA-3189: Kafka server returns UnknownServerException for inherited exceptions

… exceptions

Author: Grant Henke <gr...@gmail.com>

Reviewers: Jiangjie Qin <be...@gmail.com>, Ismael Juma <is...@juma.me.uk>, Ewen Cheslack-Postava <ew...@confluent.io>

Closes #856 from granthenke/inherited-errors


Project: http://git-wip-us.apache.org/repos/asf/kafka/repo
Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/cd15321e
Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/cd15321e
Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/cd15321e

Branch: refs/heads/trunk
Commit: cd15321e0d250253abb990af53e1f5624cf46b42
Parents: 6352a30
Author: Grant Henke <gr...@gmail.com>
Authored: Tue Feb 9 10:16:57 2016 -0800
Committer: Ewen Cheslack-Postava <me...@ewencp.org>
Committed: Tue Feb 9 10:16:57 2016 -0800

----------------------------------------------------------------------
 .../apache/kafka/common/protocol/Errors.java    | 13 ++++++--
 .../kafka/common/protocol/ErrorsTest.java       | 17 +++++++++++
 .../scala/unit/kafka/message/MessageTest.scala  | 32 +++++++++++++-------
 3 files changed, 48 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kafka/blob/cd15321e/clients/src/main/java/org/apache/kafka/common/protocol/Errors.java
----------------------------------------------------------------------
diff --git a/clients/src/main/java/org/apache/kafka/common/protocol/Errors.java b/clients/src/main/java/org/apache/kafka/common/protocol/Errors.java
index 8581544..4a20869 100644
--- a/clients/src/main/java/org/apache/kafka/common/protocol/Errors.java
+++ b/clients/src/main/java/org/apache/kafka/common/protocol/Errors.java
@@ -192,10 +192,17 @@ public enum Errors {
     }
 
     /**
-     * Return the error instance associated with this exception (or UNKNOWN if there is none)
+     * Return the error instance associated with this exception or any of its superclasses (or UNKNOWN if there is none).
+     * If there are multiple matches in the class hierarchy, the first match starting from the bottom is used.
      */
     public static Errors forException(Throwable t) {
-        Errors error = classToError.get(t.getClass());
-        return error == null ? UNKNOWN : error;
+        Class clazz = t.getClass();
+        while (clazz != null) {
+            Errors error = classToError.get(clazz);
+            if (error != null)
+                return error;
+            clazz = clazz.getSuperclass();
+        }
+        return UNKNOWN;
     }
 }

http://git-wip-us.apache.org/repos/asf/kafka/blob/cd15321e/clients/src/test/java/org/apache/kafka/common/protocol/ErrorsTest.java
----------------------------------------------------------------------
diff --git a/clients/src/test/java/org/apache/kafka/common/protocol/ErrorsTest.java b/clients/src/test/java/org/apache/kafka/common/protocol/ErrorsTest.java
index b511b4b..2d96e58 100644
--- a/clients/src/test/java/org/apache/kafka/common/protocol/ErrorsTest.java
+++ b/clients/src/test/java/org/apache/kafka/common/protocol/ErrorsTest.java
@@ -24,6 +24,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.kafka.common.errors.ApiException;
+import org.apache.kafka.common.errors.TimeoutException;
 import org.junit.Test;
 
 public class ErrorsTest {
@@ -60,4 +61,20 @@ public class ErrorsTest {
         assertNull("The NONE error should not have an exception", Errors.NONE.exception());
     }
 
+    @Test
+    public void testForExceptionInheritance() {
+        class ExtendedTimeoutException extends TimeoutException { }
+
+        Errors expectedError = Errors.forException(new TimeoutException());
+        Errors actualError = Errors.forException(new ExtendedTimeoutException());
+
+        assertEquals("forException should match super classes", expectedError, actualError);
+    }
+
+    @Test
+    public void testForExceptionDefault() {
+        Errors error = Errors.forException(new ApiException());
+        assertEquals("forException should default to unknown", Errors.UNKNOWN, error);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/kafka/blob/cd15321e/core/src/test/scala/unit/kafka/message/MessageTest.scala
----------------------------------------------------------------------
diff --git a/core/src/test/scala/unit/kafka/message/MessageTest.scala b/core/src/test/scala/unit/kafka/message/MessageTest.scala
index 3c12d13..1755633 100755
--- a/core/src/test/scala/unit/kafka/message/MessageTest.scala
+++ b/core/src/test/scala/unit/kafka/message/MessageTest.scala
@@ -5,7 +5,7 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *    http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
@@ -19,6 +19,8 @@ package kafka.message
 
 import java.nio._
 import java.util.HashMap
+import org.apache.kafka.common.protocol.Errors
+
 import scala.collection._
 import org.junit.Assert._
 import org.scalatest.junit.JUnitSuite
@@ -27,15 +29,15 @@ import kafka.utils.TestUtils
 import kafka.utils.CoreUtils
 import org.apache.kafka.common.utils.Utils
 
-case class MessageTestVal(val key: Array[Byte], 
-                          val payload: Array[Byte], 
-                          val codec: CompressionCodec, 
+case class MessageTestVal(val key: Array[Byte],
+                          val payload: Array[Byte],
+                          val codec: CompressionCodec,
                           val message: Message)
 
 class MessageTest extends JUnitSuite {
-  
+
   var messages = new mutable.ArrayBuffer[MessageTestVal]()
-  
+
   @Before
   def setUp(): Unit = {
     val keys = Array(null, "key".getBytes, "".getBytes)
@@ -44,7 +46,7 @@ class MessageTest extends JUnitSuite {
     for(k <- keys; v <- vals; codec <- codecs)
       messages += new MessageTestVal(k, v, codec, new Message(v, k, codec))
   }
-  
+
   @Test
   def testFieldValues {
     for(v <- messages) {
@@ -73,7 +75,7 @@ class MessageTest extends JUnitSuite {
       assertFalse("Message with invalid checksum should be invalid", v.message.isValid)
     }
   }
-  
+
   @Test
   def testEquality() {
     for(v <- messages) {
@@ -84,7 +86,7 @@ class MessageTest extends JUnitSuite {
       assertTrue("Should equal another message with the same content.", v.message.equals(copy))
     }
   }
-  
+
   @Test
   def testIsHashable() {
     // this is silly, but why not
@@ -94,6 +96,14 @@ class MessageTest extends JUnitSuite {
     for(v <- messages)
       assertEquals(v.message, m.get(v.message))
   }
-  
+
+  @Test
+  def testExceptionMapping() {
+    val expected = Errors.CORRUPT_MESSAGE
+    val actual = Errors.forException(new InvalidMessageException())
+
+    assertEquals("InvalidMessageException should map to a corrupt message error", expected, actual)
+  }
+
 }
- 	
+