Repository: falcon Updated Branches: refs/heads/master ec0a4a82e -> 205465a8c
FALCON-1565 Listing API non-intuitive response if time > endTime. Contributed by Praveen Adlakha. Project: http://git-wip-us.apache.org/repos/asf/falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/205465a8 Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/205465a8 Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/205465a8 Branch: refs/heads/master Commit: 205465a8c7cc3ef928119e95c4fd0c45ae589863 Parents: ec0a4a8 Author: Ajay Yadava <[email protected]> Authored: Wed Dec 30 01:31:44 2015 +0530 Committer: Ajay Yadava <[email protected]> Committed: Wed Dec 30 01:58:43 2015 +0530 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../apache/falcon/cli/FalconInstanceCLI.java | 3 +- .../falcon/client/FalconCLIException.java | 35 +++++++++++++++ .../org/apache/falcon/client/FalconClient.java | 45 +++++++++++++++++++- .../org/apache/falcon/FalconWebException.java | 13 ++++++ .../resource/AbstractInstanceManager.java | 26 +++++------ .../falcon/resource/channel/HTTPChannel.java | 8 +++- .../resource/proxy/InstanceManagerProxy.java | 5 ++- 8 files changed, 120 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 402e72a..618bb2a 100755 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -90,6 +90,8 @@ Trunk (Unreleased) OPTIMIZATIONS BUG FIXES + FALCON-1565 Listing API non-intuitive response if time > endTime (Praveen Adlakha via Ajay Yadava) + FALCON-1696 Falcon build failing in checkstyle module (Praveen Adlakha via Pallavi Rao) FALCON-1694 Status API shows params along with instance status(Pallavi Rao via Ajay Yadava) http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java b/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java index 6ea34da..bfb1d65 100644 --- a/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java +++ b/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java @@ -267,8 +267,7 @@ public class FalconInstanceCLI extends FalconCLI { result = ResponseHelper.getString(client.getParamsOfInstance(type, entity, start, colo, lifeCycles, doAsUser)); } else if (optionsList.contains(LISTING_OPT)) { - result = ResponseHelper.getString(client - .getFeedListing(type, entity, start, end, colo, doAsUser)); + result = ResponseHelper.getString(client.getFeedInstanceListing(type, entity, start, end, colo, doAsUser)); } else { throw new FalconCLIException("Invalid command"); } http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/client/FalconCLIException.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/falcon/client/FalconCLIException.java b/client/src/main/java/org/apache/falcon/client/FalconCLIException.java index 51ef952..831f7ac 100644 --- a/client/src/main/java/org/apache/falcon/client/FalconCLIException.java +++ b/client/src/main/java/org/apache/falcon/client/FalconCLIException.java @@ -76,4 +76,39 @@ public class FalconCLIException extends Exception { } return statusValue + ";" + message; } + + public static FalconCLIException fromReponse(ClientResponse clientResponse, Class clazz) { + return new FalconCLIException(getMessage(clientResponse, clazz)); + } + + private static String getMessage(ClientResponse clientResponse, Class<? extends APIResult> clazz) { + ClientResponse.Status status = clientResponse.getClientResponseStatus(); + String statusValue = status.toString(); + String message = ""; + if (status == ClientResponse.Status.BAD_REQUEST) { + clientResponse.bufferEntity(); + InputStream in = clientResponse.getEntityInputStream(); + try { + in.mark(MB); + message = clientResponse.getEntity(clazz).getMessage(); + } catch (Throwable th) { + try { + in.reset(); + message = clientResponse.getEntity(APIResult.class).getMessage(); + } catch (Throwable t) { + byte[] data = new byte[MB]; + try { + in.reset(); + int len = in.read(data); + message = new String(data, 0, len); + } catch (IOException e) { + message = e.getMessage(); + } + } + } + + + } + return statusValue + ";" + message; + } } http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/client/FalconClient.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/falcon/client/FalconClient.java b/client/src/main/java/org/apache/falcon/client/FalconClient.java index 00aa167..4a773c6 100644 --- a/client/src/main/java/org/apache/falcon/client/FalconClient.java +++ b/client/src/main/java/org/apache/falcon/client/FalconClient.java @@ -48,6 +48,7 @@ import org.apache.hadoop.security.authentication.client.AuthenticatedURL; import org.apache.hadoop.security.authentication.client.KerberosAuthenticator; import org.apache.hadoop.security.authentication.client.PseudoAuthenticator; + import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -952,6 +953,36 @@ public class FalconClient extends AbstractFalconClient { return clientResponse; } + + public FeedInstanceResult getFeedInstanceListing(String type, String entity, String start, String end, String colo + , String doAsUser) throws FalconCLIException { + + checkType(type); + Instances api = Instances.LISTING; + WebResource resource = service.path(api.path).path(type).path(entity); + if (colo != null) { + resource = resource.queryParam("colo", colo); + } + if (StringUtils.isNotEmpty(doAsUser)) { + resource = resource.queryParam(FalconCLI.DO_AS_OPT, doAsUser); + } + if (StringUtils.isNotEmpty(start)){ + resource = resource.queryParam("start", start); + } + if (StringUtils.isNotEmpty(end)) { + resource = resource.queryParam("end", end); + } + + ClientResponse clientResponse = resource.header("Cookie", AUTH_COOKIE_EQ + authenticationToken) + .accept(api.mimeType) + .method(api.method, ClientResponse.class); + + printClientResponse(clientResponse); + checkIfSuccessful(clientResponse, FeedInstanceResult.class); + return clientResponse.getEntity(FeedInstanceResult.class); + } + + public InstanceDependencyResult getInstanceDependencies(String entityType, String entityName, String instanceTime, String colo) throws FalconCLIException { checkType(entityType); @@ -1232,7 +1263,10 @@ public class FalconClient extends AbstractFalconClient { printClientResponse(clientResponse); return clientResponse.getEntity(String.class); } - + /* + * Donot use this getMessage use the overloaded one + * with clazz as param for better error handling + * */ private void checkIfSuccessful(ClientResponse clientResponse) throws FalconCLIException { Response.Status.Family statusFamily = clientResponse.getClientResponseStatus().getFamily(); if (statusFamily != Response.Status.Family.SUCCESSFUL @@ -1241,6 +1275,15 @@ public class FalconClient extends AbstractFalconClient { } } + private void checkIfSuccessful(ClientResponse clientResponse, Class clazz) throws FalconCLIException { + Response.Status.Family statusFamily = clientResponse.getClientResponseStatus().getFamily(); + if (statusFamily != Response.Status.Family.SUCCESSFUL + && statusFamily != Response.Status.Family.INFORMATIONAL) { + throw FalconCLIException.fromReponse(clientResponse, clazz); + } + } + + private void printClientResponse(ClientResponse clientResponse) { if (getDebugMode()) { OUT.get().println(clientResponse.toString()); http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/FalconWebException.java ---------------------------------------------------------------------- diff --git a/prism/src/main/java/org/apache/falcon/FalconWebException.java b/prism/src/main/java/org/apache/falcon/FalconWebException.java index 666e3d7..0b6c38e 100644 --- a/prism/src/main/java/org/apache/falcon/FalconWebException.java +++ b/prism/src/main/java/org/apache/falcon/FalconWebException.java @@ -104,6 +104,19 @@ public class FalconWebException extends WebApplicationException { return e.getCause()==null? e.getMessage():e.getMessage() + "\nCausedBy: " + e.getCause().getMessage(); } + + public static FalconWebException newAPIException(String message) { + Response response = Response.status(Response.Status.BAD_REQUEST) + .entity(new APIResult(APIResult.Status.FAILED, message)) + .type(MediaType.TEXT_XML_TYPE) + .build(); + return new FalconWebException(response); + } + + public FalconWebException(Response response) { + super(response); + } + public FalconWebException(Throwable e, Response response) { super(e, response); } http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java ---------------------------------------------------------------------- diff --git a/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java b/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java index da2fea7..d50d111 100644 --- a/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java +++ b/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java @@ -179,10 +179,9 @@ public abstract class AbstractInstanceManager extends AbstractEntityManager { return getInstanceResultSubset(wfEngine.getStatus(entityObject, startAndEndDate.first, startAndEndDate.second, lifeCycles), filterBy, orderBy, sortOrder, offset, numResults); - } catch (Throwable e) { + } catch (FalconException e) { LOG.error("Failed to get instances status", e); - throw FalconWebException - .newInstanceException(e, Response.Status.BAD_REQUEST); + throw FalconWebException.newAPIException(e.getMessage()); } } @@ -515,18 +514,20 @@ public abstract class AbstractInstanceManager extends AbstractEntityManager { String endStr, String colo) { checkColo(colo); EntityType entityType = checkType(type); + + if (entityType != EntityType.FEED) { + throw FalconWebException.newAPIException("getLocation is not applicable for " + entityType); + } try { - if (entityType != EntityType.FEED) { - throw new IllegalArgumentException("getLocation is not applicable for " + type); - } + validateParams(type, entity); Entity entityObject = EntityUtil.getEntity(type, entity); Pair<Date, Date> startAndEndDate = getStartAndEndDate(entityObject, startStr, endStr); return FeedHelper.getFeedInstanceListing(entityObject, startAndEndDate.first, startAndEndDate.second); - } catch (Throwable e) { + } catch (FalconException e) { LOG.error("Failed to get instances listing", e); - throw FalconWebException.newInstanceException(e, Response.Status.BAD_REQUEST); + throw FalconWebException.newAPIException(e.getMessage()); } } @@ -873,12 +874,13 @@ public abstract class AbstractInstanceManager extends AbstractEntityManager { Frequency frequency = EntityUtil.getFrequency(entityObject); Date endDate = getEndDate(endStr, clusterStartEndDates.second); Date startDate = getStartDate(startStr, endDate, clusterStartEndDates.first, frequency, numResults); - if (startDate.after(endDate)) { - throw new FalconException("Specified End date " + SchemaHelper.getDateFormat().format(endDate) - + " is before the entity was scheduled " + SchemaHelper.getDateFormat().format(startDate)); + throw FalconWebException.newAPIException("Specified End date " + + SchemaHelper.getDateFormat().format(endDate) + + " is before the entity was scheduled " + + SchemaHelper.getDateFormat().format(startDate)); } - return new Pair<Date, Date>(startDate, endDate); + return new Pair<>(startDate, endDate); } private Date getEndDate(String endStr, Date clusterEndDate) throws FalconException { http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java ---------------------------------------------------------------------- diff --git a/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java b/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java index 6801398..41be13f 100644 --- a/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java +++ b/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java @@ -23,6 +23,8 @@ import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.DefaultClientConfig; import org.apache.falcon.FalconException; +import org.apache.falcon.FalconWebException; +import org.apache.falcon.resource.APIResult; import org.apache.falcon.resource.proxy.BufferedRequest; import org.apache.falcon.security.CurrentUser; import org.apache.falcon.util.DeploymentProperties; @@ -117,11 +119,15 @@ public class HTTPChannel extends AbstractChannel { } else if (response.getClientResponseStatus().getStatusCode() == Response.Status.BAD_REQUEST.getStatusCode()) { LOG.error("Request failed: {}", response.getClientResponseStatus().getStatusCode()); - return (T) response.getEntity(method.getReturnType()); + throw FalconWebException.newInstanceException(response. + getEntity(APIResult.class).getMessage(), Response.Status.BAD_REQUEST); } else { LOG.error("Request failed: {}", response.getClientResponseStatus().getStatusCode()); throw new FalconException(response.getEntity(String.class)); } + } catch (FalconWebException falconWebException) { + LOG.error("Request failed", falconWebException); + throw falconWebException; } catch (Throwable e) { LOG.error("Request failed", e); throw new FalconException(e); http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java ---------------------------------------------------------------------- diff --git a/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java b/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java index 96c99f0..801bd10 100644 --- a/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java +++ b/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java @@ -619,10 +619,13 @@ public class InstanceManagerProxy extends AbstractInstanceManager { try { T resultHolder = doExecute(colo); results.put(colo, resultHolder); + } catch (FalconWebException e){ + APIResult result = (APIResult)e.getResponse().getEntity(); + results.put(colo, getResultInstance(APIResult.Status.FAILED, result.getMessage())); } catch (Throwable e) { LOG.error("Failed to fetch results for colo:{}", colo, e); results.put(colo, getResultInstance(APIResult.Status.FAILED, - e.getClass().getName() + "::" + e.getMessage())); + e.getClass().getName() + "::" + e.getMessage())); } } T finalResult = consolidateResult(results, clazz);
