diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-04-29 12:33:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-29 12:33:16 +0200 |
commit | 99fb39fadc0a8a25a1423f224cbe2585734ecfa8 (patch) | |
tree | a640ec1d1cf0022182647ae9c436143dc16363e9 | |
parent | d26962c2102e9b38004035bb9876326d1c92722f (diff) | |
parent | 7d597df5d7ad1d9dcf088b6cc3ddc6d78dd3360c (diff) |
Merge pull request #9210 from vespa-engine/balder/let-fatal-messagebus-errors-be-reported-as-server-errors
Report fatal-mbus-errors-as server error.
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; } |