From 25f3fd331fefaea9da5b90ceda1d788fe79c51dc Mon Sep 17 00:00:00 2001 From: Bilung Lee Date: Mon, 5 Nov 2012 14:16:09 -0800 Subject: [PATCH] SQOOP-679 Wrap exception to MSubmission metadata object (Jarek Jarcec Cecho) --- .../client/utils/SubmissionDisplayer.java | 25 ++++++++- .../org/apache/sqoop/json/SubmissionBean.java | 14 +++++ .../org/apache/sqoop/model/MSubmission.java | 51 ++++++++++++++++++- .../sqoop/submission/SubmissionStatus.java | 4 ++ .../apache/sqoop/json/TestSubmissionBean.java | 16 ++++++ .../mapreduce/MapreduceSubmissionEngine.java | 1 + 6 files changed, 109 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java b/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java index d4d68258..a7b4bcae 100644 --- a/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java +++ b/client/src/main/java/org/apache/sqoop/client/utils/SubmissionDisplayer.java @@ -18,6 +18,7 @@ package org.apache.sqoop.client.utils; import org.apache.sqoop.model.MSubmission; +import org.apache.sqoop.submission.SubmissionStatus; import org.apache.sqoop.submission.counter.Counter; import org.apache.sqoop.submission.counter.CounterGroup; import org.apache.sqoop.submission.counter.Counters; @@ -35,7 +36,8 @@ public static void display(IO io, MSubmission submission) { io.out.println(submission.getJobId()); io.out.print("Status: "); - io.out.println(submission.getStatus()); + printColoredStatus(io, submission.getStatus()); + io.out.println(); String externalId = submission.getExternalId(); if(externalId != null) { @@ -72,5 +74,26 @@ public static void display(IO io, MSubmission submission) { } } } + + // Exception handling + if(submission.getExceptionInfo() != null) { + io.out.print("@|red Exception: |@"); + io.out.println(submission.getExceptionInfo()); + + if(submission.getExceptionStackTrace() != null) { + io.out.print("@|bold Stack trace: |@"); + io.out.println(submission.getExceptionStackTrace()); + } + } + } + + public static void printColoredStatus(IO io, SubmissionStatus status) { + if(status.isRunning()) { + io.out.print("@|green " + status.toString() + " |@"); + } else if(status.isFailure()) { + io.out.print("@|red " + status.toString() + " |@"); + } else { + io.out.print(status.toString()); + } } } diff --git a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java index d7188f47..08804189 100644 --- a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java +++ b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java @@ -38,6 +38,8 @@ public class SubmissionBean implements JsonBean { private static final String STATUS = "status"; private static final String EXTERNAL_ID = "external-id"; private static final String EXTERNAL_LINK = "external-link"; + private static final String EXCEPTION = "exception"; + private static final String EXCEPTION_TRACE = "exception-trace"; private static final String PROGRESS = "progress"; private static final String COUNTERS = "counters"; @@ -74,6 +76,12 @@ public JSONObject extract() { if(submission.getExternalLink() != null) { ret.put(EXTERNAL_LINK, submission.getExternalLink()); } + if(submission.getExceptionInfo() != null) { + ret.put(EXCEPTION, submission.getExceptionInfo()); + } + if(submission.getExceptionStackTrace() != null) { + ret.put(EXCEPTION_TRACE, submission.getExceptionStackTrace()); + } if(submission.getCounters() != null) { ret.put(COUNTERS, extractCounters(submission.getCounters())); } @@ -113,6 +121,12 @@ public void restore(JSONObject json) { if(json.containsKey(EXTERNAL_LINK)) { submission.setExternalLink((String) json.get(EXTERNAL_LINK)); } + if(json.containsKey(EXCEPTION)) { + submission.setExceptionInfo((String) json.get(EXCEPTION)); + } + if(json.containsKey(EXCEPTION_TRACE)) { + submission.setExceptionStackTrace((String) json.get(EXCEPTION_TRACE)); + } if(json.containsKey(COUNTERS)) { submission.setCounters(restoreCounters((JSONObject) json.get(COUNTERS))); } diff --git a/common/src/main/java/org/apache/sqoop/model/MSubmission.java b/common/src/main/java/org/apache/sqoop/model/MSubmission.java index f8ca32ef..c8ba0e28 100644 --- a/common/src/main/java/org/apache/sqoop/model/MSubmission.java +++ b/common/src/main/java/org/apache/sqoop/model/MSubmission.java @@ -20,6 +20,8 @@ import org.apache.sqoop.submission.SubmissionStatus; import org.apache.sqoop.submission.counter.Counters; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Date; /** @@ -82,6 +84,20 @@ public class MSubmission extends MPersistableEntity { */ String externalLink; + /** + * Associated exception info with this job (if any). + * + * This is optional property that is not serialized in metastore. + */ + String exceptionInfo; + + /** + * Associated exception stacktrace with this job (if any). + * + * This is optional property that is not serialized in metastore. + */ + String exceptionStackTrace; + public MSubmission() { status = SubmissionStatus.UNKNOWN; progress = -1; @@ -168,13 +184,46 @@ public String getExternalLink() { return externalLink; } + public void setExceptionInfo(String exceptionInfo) { + this.exceptionInfo = exceptionInfo; + } + + public String getExceptionInfo() { + return exceptionInfo; + } + + public void setExceptionStackTrace(String stackTrace) { + this.exceptionStackTrace = stackTrace; + } + + public String getExceptionStackTrace() { + return exceptionStackTrace; + } + + public void setException(Throwable e) { + // Exception info + this.setExceptionInfo(e.toString()); + + // Exception stack trace + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + writer.flush(); + this.setExceptionStackTrace(writer.toString()); + } + @Override public String toString() { return "MSubmission{" + "jobId=" + jobId + ", date=" + date + ", status=" + status + - ", externalId=" + externalId + "}"; + ", externalId='" + externalId + '\'' + + ", progress=" + progress + + ", counters=" + counters + + ", externalLink='" + externalLink + '\'' + + ", exceptionInfo='" + exceptionInfo + '\'' + + ", exceptionStackTrace='" + exceptionStackTrace + '\'' + + '}'; } public static MSubmission UNKNOWN = new MSubmission(); diff --git a/common/src/main/java/org/apache/sqoop/submission/SubmissionStatus.java b/common/src/main/java/org/apache/sqoop/submission/SubmissionStatus.java index 025690a1..e2da8f54 100644 --- a/common/src/main/java/org/apache/sqoop/submission/SubmissionStatus.java +++ b/common/src/main/java/org/apache/sqoop/submission/SubmissionStatus.java @@ -72,4 +72,8 @@ public static SubmissionStatus[] unfinished() { public boolean isRunning() { return this == RUNNING || this == BOOTING; } + + public boolean isFailure() { + return this == FAILED || this == UNKNOWN || this == FAILURE_ON_SUBMIT; + } } diff --git a/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java b/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java index 9c5e0438..9732fa1a 100644 --- a/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java +++ b/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java @@ -78,6 +78,22 @@ public void testTransferExternalLink() { assertEquals("http://", target.getExternalLink()); } + public void testTransferException() { + MSubmission source = new MSubmission(); + source.setExceptionInfo("EndOfTheWorldException"); + + MSubmission target = transfer(source); + assertEquals("EndOfTheWorldException", target.getExceptionInfo()); + } + + public void testTransferExceptionTrace() { + MSubmission source = new MSubmission(); + source.setExceptionStackTrace("void.java(3): line infinity"); + + MSubmission target = transfer(source); + assertEquals("void.java(3): line infinity", target.getExceptionStackTrace()); + } + public void testTransferProgress() { MSubmission source = new MSubmission(); source.setProgress(25.0); diff --git a/submission/mapreduce/src/main/java/org/apache/sqoop/submission/mapreduce/MapreduceSubmissionEngine.java b/submission/mapreduce/src/main/java/org/apache/sqoop/submission/mapreduce/MapreduceSubmissionEngine.java index 70499245..94098def 100644 --- a/submission/mapreduce/src/main/java/org/apache/sqoop/submission/mapreduce/MapreduceSubmissionEngine.java +++ b/submission/mapreduce/src/main/java/org/apache/sqoop/submission/mapreduce/MapreduceSubmissionEngine.java @@ -197,6 +197,7 @@ public boolean submit(SubmissionRequest request) { LOG.debug("Executed new map-reduce job with id " + jobId); } catch (Exception e) { + request.getSummary().setException(e); LOG.error("Error in submitting job", e); return false; }