From 7b3b9076b04517f70358cca8d1950caae67f9663 Mon Sep 17 00:00:00 2001 From: alena Date: Mon, 27 Dec 2010 16:05:10 -0800 Subject: [PATCH] bug 6168: throw a runtime exception when unable to schedule Async job instead of returning jobId=0L status 6168: resolved fixed --- server/src/com/cloud/api/ApiDispatcher.java | 48 +++++++++++-------- server/src/com/cloud/api/ApiServer.java | 7 +++ .../com/cloud/async/AsyncJobManagerImpl.java | 7 +-- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 5329bd9314e..145120466de 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -82,11 +82,11 @@ public class ApiDispatcher { s_logger.info(t.getMessage()); errorMsg = "Parameter error"; throw new ServerApiException(BaseCmd.PARAM_ERROR, t.getMessage()); - }else if (t instanceof PermissionDeniedException) { + } else if (t instanceof PermissionDeniedException) { s_logger.info("PermissionDenied: " + t.getMessage()); errorMsg = "Permission denied"; throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, t.getMessage()); - }else if (t instanceof AccountLimitException) { + } else if (t instanceof AccountLimitException) { s_logger.info(t.getMessage()); errorMsg = "Account resource limit error"; throw new ServerApiException(BaseCmd.ACCOUNT_RESOURCE_LIMIT_ERROR, t.getMessage()); @@ -94,24 +94,27 @@ public class ApiDispatcher { s_logger.info(t.getMessage()); errorMsg = "Insufficient capacity"; throw new ServerApiException(BaseCmd.INSUFFICIENT_CAPACITY_ERROR, t.getMessage()); - }else if (t instanceof ResourceAllocationException) { + } else if (t instanceof ResourceAllocationException) { s_logger.info(t.getMessage()); errorMsg = "Resource allocation error"; throw new ServerApiException(BaseCmd.RESOURCE_ALLOCATION_ERROR, t.getMessage()); - }else if (t instanceof ResourceUnavailableException) { + } else if (t instanceof ResourceUnavailableException) { s_logger.warn("Exception: ", t); errorMsg = "Resource unavailable error"; throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, t.getMessage()); - }else if (t instanceof ServerApiException) { + } else if (t instanceof AsyncCommandQueued) { + throw (AsyncCommandQueued)t; + } else if (t instanceof ServerApiException) { s_logger.warn(t.getClass() + " : " + ((ServerApiException) t).getDescription()); errorMsg = ((ServerApiException) t).getDescription(); - throw new ServerApiException(((ServerApiException) t).getErrorCode(), ((ServerApiException) t).getDescription()); - }else if (t instanceof AsyncCommandQueued) { - throw (AsyncCommandQueued)t; - }else { + if (UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, t.getMessage()); + else + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); + } else { errorMsg = "Internal error"; s_logger.error("Exception while executing " + cmd.getClass().getSimpleName() + ":", t); - if (UserContext.current().getAccount() == null || UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) + if (UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) throw new ServerApiException(BaseCmd.INTERNAL_ERROR, t.getMessage()); else throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); @@ -142,36 +145,39 @@ public class ApiDispatcher { s_logger.info(t.getMessage()); errorMsg = "Parameter error"; throw new ServerApiException(BaseCmd.PARAM_ERROR, t.getMessage()); - }else if (t instanceof PermissionDeniedException) { + } else if (t instanceof PermissionDeniedException) { s_logger.info("PermissionDenied: " + t.getMessage()); errorMsg = "Permission denied"; throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, t.getMessage()); - }else if (t instanceof AccountLimitException) { + } else if (t instanceof AccountLimitException) { s_logger.info(t.getMessage()); errorMsg = "Account resource limit error"; throw new ServerApiException(BaseCmd.ACCOUNT_RESOURCE_LIMIT_ERROR, t.getMessage()); - }else if (t instanceof InsufficientCapacityException) { + } else if (t instanceof InsufficientCapacityException) { s_logger.info(t.getMessage()); errorMsg = "Insufficient capacity"; throw new ServerApiException(BaseCmd.INSUFFICIENT_CAPACITY_ERROR, t.getMessage()); - }else if (t instanceof ResourceAllocationException) { + } else if (t instanceof ResourceAllocationException) { s_logger.warn("Exception: ", t); errorMsg = "Resource allocation error"; throw new ServerApiException(BaseCmd.RESOURCE_ALLOCATION_ERROR, t.getMessage()); - }else if (t instanceof ResourceUnavailableException) { + } else if (t instanceof ResourceUnavailableException) { s_logger.warn("Exception: ", t); errorMsg = "Resource unavailable error"; throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, t.getMessage()); - }else if (t instanceof ServerApiException) { - errorMsg = ((ServerApiException) t).getDescription(); - s_logger.warn(t.getClass() + " : " + ((ServerApiException) t).getDescription()); - throw new ServerApiException(((ServerApiException) t).getErrorCode(), ((ServerApiException) t).getDescription()); } else if (t instanceof AsyncCommandQueued) { throw (AsyncCommandQueued)t; - }else { + } else if (t instanceof ServerApiException) { + errorMsg = ((ServerApiException) t).getDescription(); + s_logger.warn(t.getClass() + " : " + ((ServerApiException) t).getDescription()); + if (UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, t.getMessage()); + else + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); + } else { errorMsg = "Internal error"; s_logger.error("Exception while executing " + cmd.getClass().getSimpleName() + ":", t); - if (UserContext.current().getAccount() == null || UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) + if (UserContext.current().getAccount().getType() == Account.ACCOUNT_TYPE_ADMIN) throw new ServerApiException(BaseCmd.INTERNAL_ERROR, t.getMessage()); else throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 8d245f6e24f..de67ec815aa 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -412,6 +412,13 @@ public class ApiServer implements HttpRequestHandler { job.setCmdInfo(ApiGsonHelper.getBuilder().create().toJson(params)); long jobId = _asyncMgr.submitAsyncJob(job); + + if (jobId == 0L) { + String errorMsg = "Unable to schedule async job for command " + job.getCmd(); + s_logger.warn(errorMsg); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, errorMsg); + } + if (objectId != null) { return ((BaseAsyncCreateCmd)asyncCmd).getResponse(jobId, objectId); } diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index c30bc060426..8eedb429417 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -127,11 +127,12 @@ public class AsyncJobManagerImpl implements AsyncJobManager { s_logger.debug("submit async job-" + job.getId() + ", details: " + job.toString()); } return job.getId(); - } catch(Exception e) { - s_logger.error("Unexpected exception: ", e); + } catch(Exception e) { txt.rollback(); + String errMsg = "Unable to schedule async job for command " + job.getCmd() + ", unexpected exception."; + s_logger.warn(errMsg, e); + throw new CloudRuntimeException(errMsg); } - return 0L; } @Override @DB