Author: sms Date: Fri Jul 17 01:02:14 2009 New Revision: 794929 URL: http://svn.apache.org/viewvc?rev=794929&view=rev Log: PIG-728: All backend error messages must be logged to preserve the original error messages
Modified: hadoop/pig/trunk/CHANGES.txt hadoop/pig/trunk/src/org/apache/pig/Main.java hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/Launcher.java hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/MapReduceLauncher.java hadoop/pig/trunk/src/org/apache/pig/impl/util/LogUtils.java hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java hadoop/pig/trunk/src/org/apache/pig/tools/grunt/GruntParser.java Modified: hadoop/pig/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/CHANGES.txt?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/CHANGES.txt (original) +++ hadoop/pig/trunk/CHANGES.txt Fri Jul 17 01:02:14 2009 @@ -40,6 +40,9 @@ BUG FIXES + PIG-728: All backend error messages must be logged to preserve the + original error messages (sms) + PIG-877: Push up filter does not account for added columns in foreach (sms) Modified: hadoop/pig/trunk/src/org/apache/pig/Main.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/Main.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/Main.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/Main.java Fri Jul 17 01:02:14 2009 @@ -406,12 +406,12 @@ } if(!gruntCalled) { - LogUtils.writeLog(pe, logFileName, log, verbose); + LogUtils.writeLog(pe, logFileName, log, verbose, "Error before Pig is launched"); } } catch (Throwable e) { rc = 2; if(!gruntCalled) { - LogUtils.writeLog(e, logFileName, log, verbose); + LogUtils.writeLog(e, logFileName, log, verbose, "Error before Pig is launched"); } } finally { // clear temp files Modified: hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/Launcher.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/Launcher.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/Launcher.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/Launcher.java Fri Jul 17 01:02:14 2009 @@ -160,19 +160,21 @@ protected void getStats(Job job, JobClient jobClient, boolean errNotDbg, PigContext pigContext) throws Exception { JobID MRJobID = job.getAssignedJobID(); String jobMessage = job.getMessage(); + Exception backendException = null; if(MRJobID == null) { try { - throw getExceptionFromString(jobMessage); + LogUtils.writeLog("Backend error message during job submission", jobMessage, + pigContext.getProperties().getProperty("pig.logfile"), + log); + backendException = getExceptionFromString(jobMessage); } catch (Exception e) { //just get the first line in the message and log the rest String firstLine = getFirstLineFromMessage(jobMessage); - - LogUtils.writeLog(new Exception(jobMessage), pigContext.getProperties().getProperty("pig.logfile"), - log, false, null, false, false); int errCode = 2997; String msg = "Unable to recreate exception from backend error: " + firstLine; - throw new ExecException(msg, errCode, PigException.BUG, e); + throw new ExecException(msg, errCode, PigException.BUG); } + throw backendException; } try { TaskReport[] mapRep = jobClient.getMapTaskReports(MRJobID); @@ -223,15 +225,16 @@ //errNotDbg is used only for failed jobs //keep track of all the unique exceptions try { + LogUtils.writeLog("Backend error message", msgs[j], + pigContext.getProperties().getProperty("pig.logfile"), + log); Exception e = getExceptionFromString(msgs[j]); exceptions.add(e); } catch (Exception e1) { String firstLine = getFirstLineFromMessage(msgs[j]); - LogUtils.writeLog(new Exception(msgs[j]), pigContext.getProperties().getProperty("pig.logfile"), - log, false, null, false, false); int errCode = 2997; String msg = "Unable to recreate exception from backed error: " + firstLine; - throw new ExecException(msg, errCode, PigException.BUG, e1); + throw new ExecException(msg, errCode, PigException.BUG); } } else { log.debug("Error message from task (" + type + ") " + @@ -587,7 +590,7 @@ return new StackTraceElement(declaringClass, methodName, fileName, lineNumber); } - private String getFirstLineFromMessage(String message) { + protected String getFirstLineFromMessage(String message) { String[] messages = message.split(newLine); if(messages.length > 0) { return messages[0]; Modified: hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/MapReduceLauncher.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/MapReduceLauncher.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/MapReduceLauncher.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/MapReduceLauncher.java Fri Jul 17 01:02:14 2009 @@ -57,6 +57,7 @@ import org.apache.pig.impl.plan.CompilationMessageCollector.Message; import org.apache.pig.impl.plan.CompilationMessageCollector.MessageType; import org.apache.pig.impl.util.ConfigurationValidator; +import org.apache.pig.impl.util.LogUtils; import org.apache.pig.impl.io.FileLocalizer; import org.apache.pig.impl.io.FileSpec; import org.apache.pig.tools.pigstats.PigStats; @@ -70,6 +71,7 @@ //used to track the exception thrown by the job control which is run in a separate thread private Exception jobControlException = null; + private String jobControlExceptionStackTrace = null; private boolean aggregateWarning = false; private Map<FileSpec, Exception> failureMap; @@ -148,6 +150,11 @@ //no jobs to check for failure if(jobControlException != null) { if(jobControlException instanceof PigException) { + if(jobControlExceptionStackTrace != null) { + LogUtils.writeLog("Error message from job controller", jobControlExceptionStackTrace, + pc.getProperties().getProperty("pig.logfile"), + log); + } throw jobControlException; } else { int errCode = 2117; @@ -372,12 +379,13 @@ ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); throwable.printStackTrace(ps); - String exceptionString = baos.toString(); + jobControlExceptionStackTrace = baos.toString(); try { - jobControlException = getExceptionFromString(exceptionString); + jobControlException = getExceptionFromString(jobControlExceptionStackTrace); } catch (Exception e) { - String errMsg = "Could not resolve error that occured when launching map reduce job."; - jobControlException = new RuntimeException(errMsg, e); + String errMsg = "Could not resolve error that occured when launching map reduce job: " + + getFirstLineFromMessage(jobControlExceptionStackTrace); + jobControlException = new RuntimeException(errMsg); } } } Modified: hadoop/pig/trunk/src/org/apache/pig/impl/util/LogUtils.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/impl/util/LogUtils.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/impl/util/LogUtils.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/impl/util/LogUtils.java Fri Jul 17 01:02:14 2009 @@ -68,14 +68,22 @@ } - public static void writeLog(Throwable t, String logFileName, Log log, boolean verbose) { - writeLog(t, logFileName, log, verbose, null, true, true); + public static void writeLog(Throwable t, String logFileName, Log log, boolean verbose, String headerMessage) { + writeLog(t, logFileName, log, verbose, headerMessage, true, true); } public static void writeLog(Throwable t, String logFileName, Log log, boolean verbose, String headerMessage, boolean displayFooter, boolean displayMessage) { String message = null; + String marker = null; + StringBuilder sb = new StringBuilder("="); + + for(int i = 0; i < 79; ++i) { + sb.append("="); + } + sb.append("\n"); + marker = sb.toString(); if(t instanceof Exception) { Exception pe = LogUtils.getPermissionException((Exception)t); @@ -113,7 +121,7 @@ if(logFileName == null) { //if exec is invoked programmatically then logFileName will be null - log.warn("There is no log file to write to"); + log.warn("There is no log file to write to."); log.error(bs.toString()); return; } @@ -122,9 +130,24 @@ File logFile = new File(logFileName); try { fos = new FileOutputStream(logFile, true); - if(headerMessage != null) fos.write((headerMessage + "\n").getBytes("UTF-8")); - fos.write((message + "\n").getBytes("UTF-8")); - fos.write(bs.toString().getBytes("UTF-8")); + if(headerMessage != null) { + fos.write((headerMessage + "\n").getBytes("UTF-8")); + sb = new StringBuilder("-"); + for(int i = 1; i < headerMessage.length(); ++i) { + sb.append("-"); + } + sb.append("\n"); + fos.write(sb.toString().getBytes("UTF-8")); + } + if(message != null) { + if(message.charAt(message.length() - 1) == '\n') { + fos.write((message + "\n").getBytes("UTF-8")); + } else { + fos.write((message + "\n\n").getBytes("UTF-8")); + } + } + fos.write(bs.toString().getBytes("UTF-8")); + fos.write(marker.getBytes("UTF-8")); fos.close(); if(displayFooter) { if(verbose) { @@ -137,7 +160,43 @@ log.warn("Could not write to log file: " + logFileName + " :" + ioe.getMessage()); log.error(bs.toString()); } - } + } + + public static void writeLog(String headerMessage, String message, String logFileName, Log log) { + if(logFileName == null) { + //if exec is invoked programmatically then logFileName will be null + log.warn("There is no log file to write to."); + log.error(message); + return; + } + + + File logFile = new File(logFileName); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(logFile, true); + if(headerMessage != null) { + fos.write((headerMessage + "\n").getBytes("UTF-8")); + StringBuilder sb = new StringBuilder("-"); + for(int i = 1; i < headerMessage.length(); ++i) { + sb.append("-"); + } + sb.append("\n"); + fos.write(sb.toString().getBytes("UTF-8")); + } + if(message != null) { + if(message.charAt(message.length() - 1) == '\n') { + fos.write((message + "\n").getBytes("UTF-8")); + } else { + fos.write((message + "\n\n").getBytes("UTF-8")); + } + } + fos.close(); + } catch (IOException ioe) { + log.warn("Could not write to log file: " + logFileName + " :" + ioe.getMessage()); + log.error(message); + } + } } Modified: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/Grunt.java Fri Jul 17 01:02:14 2009 @@ -75,7 +75,8 @@ parser.parseStopOnError(); break; } catch(Throwable t) { - LogUtils.writeLog(t, pig.getPigContext().getProperties().getProperty("pig.logfile"), log, verbose); + LogUtils.writeLog(t, pig.getPigContext().getProperties().getProperty("pig.logfile"), + log, verbose, "Pig Stack Trace"); parser.ReInit(in); } } @@ -87,7 +88,8 @@ parser.setInteractive(false); return parser.parseStopOnError(); } catch (Throwable t) { - LogUtils.writeLog(t, pig.getPigContext().getProperties().getProperty("pig.logfile"), log, verbose); + LogUtils.writeLog(t, pig.getPigContext().getProperties().getProperty("pig.logfile"), + log, verbose, "Pig Stack Trace"); throw (t); } } Modified: hadoop/pig/trunk/src/org/apache/pig/tools/grunt/GruntParser.java URL: http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/tools/grunt/GruntParser.java?rev=794929&r1=794928&r2=794929&view=diff ============================================================================== --- hadoop/pig/trunk/src/org/apache/pig/tools/grunt/GruntParser.java (original) +++ hadoop/pig/trunk/src/org/apache/pig/tools/grunt/GruntParser.java Fri Jul 17 01:02:14 2009 @@ -118,7 +118,8 @@ job.getException(), mPigServer.getPigContext().getProperties().getProperty("pig.logfile"), log, - "true".equalsIgnoreCase(mPigServer.getPigContext().getProperties().getProperty("verbose"))); + "true".equalsIgnoreCase(mPigServer.getPigContext().getProperties().getProperty("verbose")), + "Pig Stack Trace"); } } else { @@ -542,7 +543,7 @@ else { job.killJob(); - log.error("kill submitted."); + log.info("Kill " + id + " submitted."); } } }