aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--messagebus/abi-spec.json5
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/ErrorCode.java11
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java4
-rwxr-xr-xmessagebus/src/test/java/com/yahoo/messagebus/ErrorTestCase.java36
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java14
5 files changed, 66 insertions, 4 deletions
diff --git a/messagebus/abi-spec.json b/messagebus/abi-spec.json
index baf2046e322..9c445aea6fc 100644
--- a/messagebus/abi-spec.json
+++ b/messagebus/abi-spec.json
@@ -174,7 +174,10 @@
],
"methods": [
"public void <init>()",
- "public static java.lang.String getName(int)"
+ "public static java.lang.String getName(int)",
+ "public static boolean isFatal(int)",
+ "public static boolean isTransient(int)",
+ "public static boolean isMBusError(int)"
],
"fields": [
"public static final int NONE",
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/ErrorCode.java b/messagebus/src/main/java/com/yahoo/messagebus/ErrorCode.java
index e54279e0541..460783457af 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/ErrorCode.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/ErrorCode.java
@@ -122,4 +122,15 @@ public final class ErrorCode {
default : return "UNKNOWN(" + error + ")";
}
}
+ public static boolean isFatal(int code) {
+ return code >= FATAL_ERROR;
+ }
+ public static boolean isTransient(int code) {
+ return (code >= TRANSIENT_ERROR) && (code < FATAL_ERROR);
+ }
+ public static boolean isMBusError(int code) {
+ return ((code < APP_TRANSIENT_ERROR) && isTransient(code))
+ || ((code < APP_FATAL_ERROR) && isFatal(code))
+ || ((code < TRANSIENT_ERROR) && (code >= NONE));
+ }
}
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java b/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java
index e98a3820ff2..e28809c2928 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/routing/RoutingNode.java
@@ -244,7 +244,7 @@ public class RoutingNode implements ReplyHandler {
policy.merge(routingContext);
} catch (RuntimeException e) {
setError(ErrorCode.POLICY_ERROR,
- "Policy '" + dir.getName() + "' threw an exception; " + exceptionMessageWithTrace(e));
+ "Policy '" + dir.getName() + "' threw an exception during merge; " + exceptionMessageWithTrace(e));
}
if (reply == null) {
setError(ErrorCode.APP_FATAL_ERROR,
@@ -539,7 +539,7 @@ public class RoutingNode implements ReplyHandler {
policy.select(routingContext);
} catch (RuntimeException e) {
setError(ErrorCode.POLICY_ERROR,
- "Policy '" + dir.getName() + "' threw an exception; " + exceptionMessageWithTrace(e));
+ "Policy '" + dir.getName() + "' threw an exception during select; " + exceptionMessageWithTrace(e));
return false;
}
if (children.isEmpty()) {
diff --git a/messagebus/src/test/java/com/yahoo/messagebus/ErrorTestCase.java b/messagebus/src/test/java/com/yahoo/messagebus/ErrorTestCase.java
index 805f743536e..271da8717bf 100755
--- a/messagebus/src/test/java/com/yahoo/messagebus/ErrorTestCase.java
+++ b/messagebus/src/test/java/com/yahoo/messagebus/ErrorTestCase.java
@@ -89,4 +89,40 @@ public class ErrorTestCase {
src.destroy();
slobrok.stop();
}
+ @Test
+ public void testErrorCodeCategorization() {
+ assertTrue(ErrorCode.isFatal(ErrorCode.FATAL_ERROR));
+ assertFalse(ErrorCode.isTransient(ErrorCode.FATAL_ERROR));
+ assertTrue(ErrorCode.isMBusError(ErrorCode.FATAL_ERROR));
+
+ assertTrue(ErrorCode.isFatal(ErrorCode.APP_FATAL_ERROR));
+ assertFalse(ErrorCode.isTransient(ErrorCode.APP_FATAL_ERROR));
+ assertFalse(ErrorCode.isMBusError(ErrorCode.APP_FATAL_ERROR));
+
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.TRANSIENT_ERROR));
+ assertTrue(ErrorCode.isTransient(ErrorCode.TRANSIENT_ERROR));
+ assertTrue(ErrorCode.isMBusError(ErrorCode.TRANSIENT_ERROR));
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.APP_TRANSIENT_ERROR));
+ assertTrue(ErrorCode.isTransient(ErrorCode.APP_TRANSIENT_ERROR));
+ assertFalse(ErrorCode.isMBusError(ErrorCode.APP_TRANSIENT_ERROR));
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.APP_TRANSIENT_ERROR - 1));
+ assertTrue(ErrorCode.isTransient(ErrorCode.APP_TRANSIENT_ERROR - 1));
+ assertTrue(ErrorCode.isMBusError(ErrorCode.APP_TRANSIENT_ERROR - 1));
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.FATAL_ERROR - 1));
+ assertTrue(ErrorCode.isTransient(ErrorCode.FATAL_ERROR - 1));
+ assertFalse(ErrorCode.isMBusError(ErrorCode.FATAL_ERROR - 1));
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.TRANSIENT_ERROR - 1));
+ assertFalse(ErrorCode.isTransient(ErrorCode.TRANSIENT_ERROR - 1));
+ assertTrue(ErrorCode.isMBusError(ErrorCode.TRANSIENT_ERROR - 1));
+
+ assertFalse(ErrorCode.isFatal(ErrorCode.NONE));
+ assertFalse(ErrorCode.isTransient(ErrorCode.NONE));
+ assertTrue(ErrorCode.isMBusError(ErrorCode.NONE));
+
+ }
}
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
index b9bbe4f792e..cf22d25b510 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java
@@ -21,12 +21,12 @@ import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol;
import com.yahoo.documentapi.metrics.DocumentApiMetrics;
import com.yahoo.documentapi.metrics.DocumentOperationStatus;
import com.yahoo.documentapi.metrics.DocumentOperationType;
+import com.yahoo.messagebus.ErrorCode;
import com.yahoo.messagebus.StaticThrottlePolicy;
import com.yahoo.metrics.simple.MetricReceiver;
import com.yahoo.vdslib.VisitorOrdering;
import com.yahoo.vespaclient.ClusterDef;
import com.yahoo.vespaxmlparser.FeedOperation;
-import com.yahoo.vespaxmlparser.VespaXMLFeedReader;
import com.yahoo.yolean.concurrent.ConcurrentResourcePool;
import com.yahoo.yolean.concurrent.ResourceFactory;
import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -108,10 +108,19 @@ public class OperationHandlerImpl implements OperationHandler {
documentAccess.shutdown();
}
+ private static final int HTTP_STATUS_SERVER_ERROR = 500;
private static final int HTTP_STATUS_BAD_REQUEST = 400;
private static final int HTTP_STATUS_INSUFFICIENT_STORAGE = 507;
private static final int HTTP_PRE_CONDIDTION_FAILED = 412;
+ private static boolean isFatalMBusErrorCode(Set<Integer> errorCodes) {
+ for (Integer e : errorCodes) {
+ if (ErrorCode.isFatal(e) && ErrorCode.isMBusError(e)) {
+ return true;
+ }
+ }
+ return false;
+ }
public static int getHTTPStatusCode(Set<Integer> errorCodes) {
if (errorCodes.size() == 1 && errorCodes.contains(DocumentProtocol.ERROR_NO_SPACE)) {
return HTTP_STATUS_INSUFFICIENT_STORAGE;
@@ -119,6 +128,9 @@ public class OperationHandlerImpl implements OperationHandler {
if (errorCodes.contains(DocumentProtocol.ERROR_TEST_AND_SET_CONDITION_FAILED)) {
return HTTP_PRE_CONDIDTION_FAILED;
}
+ if (isFatalMBusErrorCode(errorCodes)) {
+ return HTTP_STATUS_SERVER_ERROR;
+ }
return HTTP_STATUS_BAD_REQUEST;
}