From: <bsc...@us...> - 2009-04-08 15:07:10
|
Revision: 4463 http://unicore.svn.sourceforge.net/unicore/?rev=4463&view=rev Author: bschuller Date: 2009-04-08 15:06:53 +0000 (Wed, 08 Apr 2009) Log Message: ----------- improved error reporting to user; improved error logging Modified Paths: -------------- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/Configuration.java xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/Action.java xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/ProcessingContext.java xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/jsdl/JSDLProcessor.java xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/simple/SimpleDataStagingProcessor.java xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/util/LogUtil.java xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestAction.java xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestJSDLProcessing.java Added Paths: ----------- xnjs/trunk/xnjs-module-core/src/test/resources/ems/example_stagein_problem.jsdl Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/Configuration.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/Configuration.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/Configuration.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -218,11 +218,11 @@ buildConfigCaches(); } catch (XmlException e) { String msg="Invalid configuration file"; - logger.error(msg,e); + LogUtil.logException(msg,e,logger); throw new XNJSException(msg); } catch (IOException e) { String msg="Error reading config file."; - logger.error(msg,e); + LogUtil.logException(msg,e,logger); throw new XNJSException(msg); } } @@ -269,7 +269,7 @@ logger.warn("Duplicate component registration: "+clazz+", ignored."); } catch(Exception ex){ - logger.warn("Problems reading configuration.",ex); + LogUtil.logException("Problems reading configuration.",ex,logger); } } } @@ -388,6 +388,10 @@ if(clazz==null)throw new NullPointerException("Component class cannot be null!"); try{ Object o = pico.getComponentInstanceOfType(clazz); + if(o==null){ + logger.debug("Component <"+clazz.getName()+"> is not registered"); + return null; + } if(o instanceof XnjsComponent){ ((XnjsComponent)o).setConfiguration(this); } @@ -396,7 +400,7 @@ } return (T)o; }catch(Exception ex){ - logger.warn("Don't have an instance of the requested component <"+clazz.getName()+">. Continuing..."); + LogUtil.logException("Error setting up the requested component <"+clazz.getName()+">. Continuing...",ex,logger); return null; } } @@ -462,7 +466,7 @@ pf=getProcessorFactory(); return pf.getProcessor(actionType); }catch(Exception ex){ - logger.warn("Can't create processor for action type "+actionType+", continuing...",ex); + LogUtil.logException("Can't create processor for action type "+actionType+", continuing...",ex,logger); return null; } } @@ -617,7 +621,7 @@ return asf.getInstance(id,this); }catch(Exception ex){ String msg="Config error: requested component not available."; - logger.fatal(msg,ex); + LogUtil.logException(msg,ex,logger); throw new XNJSException(msg,ex); } } Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/Action.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/Action.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/Action.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -367,8 +367,6 @@ * helper method that sets the action to "FAILED" */ public void fail(){ - setStatus(ActionStatus.DONE); - addLogTrace("Status set to DONE."); ActionResult res=new ActionResult(ActionResult.NOT_SUCCESSFUL ,"Failed."); if(executionContext!=null && executionContext.getExitCode()!=null){ @@ -376,6 +374,8 @@ } setResult(res); addLogTrace("Result: Failed."); + setStatus(ActionStatus.DONE); + addLogTrace("Status set to DONE."); } public String toString(){ Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/ProcessingContext.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/ProcessingContext.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/ems/ProcessingContext.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -25,7 +25,7 @@ public <T> T get(Class<T>key){ Object val=super.get(key); if(val==null)return null; - if(val.getClass().isAssignableFrom(key)){ + if(key.isAssignableFrom(val.getClass())){ return key.cast(val); } else throw new IllegalArgumentException("Object found in map, but has wrong type. " + Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/jsdl/JSDLProcessor.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/jsdl/JSDLProcessor.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/jsdl/JSDLProcessor.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -182,13 +182,17 @@ } else{ action.addLogTrace("Staging in was NOT SUCCESSFUL"); + StringBuilder errorDescription=new StringBuilder("Staging in was NOT SUCCESSFUL"); + if(r.getErrorMessage()!=null){ + errorDescription.append(": "+r.getErrorMessage()); + } //TODO: policy on this or not? - setToDoneAndFailed(); + setToDoneAndFailed(errorDescription.toString()); } } }catch(Exception ex){ - logger.error("Error processing stage-in.",ex); - setToDoneAndFailed(); + LogUtil.logException("Error processing stage-in.",ex); + setToDoneAndFailed("Error processing stage-in."); } } @@ -256,9 +260,9 @@ action.setStatus(ActionStatus.POSTPROCESSING); } }catch(ExecutionException ex){ - String msg="Could not submit action: "+ex.getMessage(); + String msg="Could not submit job: "+ex.getMessage(); action.addLogTrace(msg); - setToDoneAndFailed(); + setToDoneAndFailed(msg); throw new ProcessingException(msg,ex); } catch(TSIBusyException tbe){ @@ -324,7 +328,19 @@ action.addLogTrace("Stage-out log:"); action.appendLogTraceFrom(subAction); action.addLogTrace("Stage-out is DONE."); - setToDoneSuccessfully(); + ActionResult r=subAction.getResult(); + if(!r.isSuccessful()){ + action.addLogTrace("Staging out was NOT SUCCESSFUL"); + StringBuilder errorDescription=new StringBuilder("Staging out was NOT SUCCESSFUL"); + if(r.getErrorMessage()!=null){ + errorDescription.append(": "+r.getErrorMessage()); + } + //TODO: policy on this or not? + setToDoneAndFailed(errorDescription.toString()); + } + else{ + setToDoneSuccessfully(); + } } }catch(Exception ex){ throw new ProcessingException(ex); @@ -445,9 +461,10 @@ logger.info("Action "+action.getUUID()+ " SUCCESSFUL."); } - private void setToDoneAndFailed(){ + private void setToDoneAndFailed(String reason){ action.fail(); - logger.info("Action "+action.getUUID()+ " FAILED."); + action.setResult(new ActionResult(ActionResult.NOT_SUCCESSFUL,reason,getExitCode())); + logger.info("Action "+action.getUUID()+ " FAILED"+(reason!=null?": "+reason:".")); } private int getExitCode(){ @@ -466,7 +483,7 @@ super.handleAborting(); } catch(Exception ex){ - setToDoneAndFailed(); + setToDoneAndFailed("Could not abort action."); throw new ProcessingException("Could not abort action.",ex); } } Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/simple/SimpleDataStagingProcessor.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/simple/SimpleDataStagingProcessor.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/simple/SimpleDataStagingProcessor.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -101,7 +101,7 @@ String workingDirectory=action.getExecutionContext().getWorkingDirectory(); if(dstl==null){ logger.info("Data staging expected but not found. File transfers failed."); - setToDoneAndFailed(); + setToDoneAndFailed("Internal server error."); } else{ List<String>filesToDelete=new ArrayList<String>(); @@ -132,8 +132,9 @@ filesToDelete.add(dst.getFileName()); } }catch(Exception e){ - logger.error("Error adding filetransfer: "+dst,e); - setToDoneAndFailed(); + String msg=LogUtil.createFaultMessage("Error adding filetransfer",e); + LogUtil.logException("Error adding filetransfer",e); + setToDoneAndFailed(msg); return; } } @@ -147,8 +148,8 @@ action.addLogTrace("Started filetransfer "+ft.getSource()+" -> "+ft.getTarget()); ftList.add(ft.getUniqueId()); }catch(RejectedExecutionException e){ - logger.error("Error starting filetransfer: "+ft.getSource()+"->"+ft.getTarget()); - setToDoneAndFailed(); + LogUtil.logException("Error starting filetransfer: "+ft.getSource()+"->"+ft.getTarget(),e); + setToDoneAndFailed("Error starting filetransfer (internal work queue too full)"); return; } } @@ -171,9 +172,9 @@ return ft; } - private void setToDoneAndFailed(){ + private void setToDoneAndFailed(String reason){ action.setStatus(ActionStatus.DONE); - action.setResult(new ActionResult(ActionResult.NOT_SUCCESSFUL)); + action.setResult(new ActionResult(ActionResult.NOT_SUCCESSFUL,reason)); } /* @@ -240,9 +241,10 @@ } else if(ft.getStatus()==IFileTransfer.Status.FAILED){ logger.debug("File transfer "+ft.getUniqueId()+" failed."); - action.addLogTrace("Filetransfer FAILED: "+ft.getSource()+" -> "+ft.getTarget()+ - ", error message: "+ft.getStatusMessage()); - setToDoneAndFailed(); + String message="Filetransfer FAILED: "+ft.getSource()+" -> "+ft.getTarget()+ + ", error message: "+ft.getStatusMessage(); + action.addLogTrace(message); + setToDoneAndFailed(message); cleanup(); return; } Modified: xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/util/LogUtil.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/util/LogUtil.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/main/java/de/fzj/unicore/xnjs/util/LogUtil.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -105,10 +105,13 @@ } while(cause!=null); - if(message!=null)sb.append(type).append(": ").append(message); + if(message!=null)sb.append(message); else sb.append(type).append(" (no further message available)"); return sb.toString(); } + public static String createFaultMessage(String message, Throwable cause){ + return message+": "+getDetailMessage(cause); + } } Modified: xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestAction.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestAction.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestAction.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -35,6 +35,8 @@ import java.io.PrintWriter; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; import junit.framework.TestCase; @@ -62,5 +64,10 @@ pc.put(Boolean.class,Boolean.TRUE); assertNotNull(pc.get(Boolean.class)); assertTrue(pc.get(Boolean.class)); + ArrayList<String>l=new ArrayList<String>(); + pc.put(List.class,l); + List<String>l2=pc.get(List.class); + assertNotNull(l2); + } } Modified: xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestJSDLProcessing.java =================================================================== --- xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestJSDLProcessing.java 2009-04-08 13:56:22 UTC (rev 4462) +++ xnjs/trunk/xnjs-module-core/src/test/java/de/fzj/unicore/xnjs/ems/TestJSDLProcessing.java 2009-04-08 15:06:53 UTC (rev 4463) @@ -47,7 +47,8 @@ //jsdl document paths private static String d1="src/test/resources/ems/example.jsdl", - d2="src/test/resources/ems/example2.jsdl" + d2="src/test/resources/ems/example2.jsdl", + d3="src/test/resources/ems/example_stagein_problem.jsdl" ; @@ -128,4 +129,30 @@ } + public void testFaultyJSDL1(){ + try{ + String id=(String)mgr.add(xnjs.getConfig().makeAction(getJSDLDoc(d3)),null); + assertNotNull(id); + int status=0; + do{ + status=mgr.getStatus(id,null).intValue(); + Thread.sleep(100); + if(ActionStatus.DONE==status){ + break; + } + }while(!("READY".equals(ActionStatus.toString(status)))); + + Action a=xnjs.getConfig().getInternalManager().getAction(id); + ActionResult res=a.getResult(); + assertFalse(res.isSuccessful()); + System.out.println(res.getErrorMessage()); + + + }catch(Exception e){ + e.printStackTrace(); + fail(e.getMessage()); + } + } + + } Added: xnjs/trunk/xnjs-module-core/src/test/resources/ems/example_stagein_problem.jsdl =================================================================== --- xnjs/trunk/xnjs-module-core/src/test/resources/ems/example_stagein_problem.jsdl (rev 0) +++ xnjs/trunk/xnjs-module-core/src/test/resources/ems/example_stagein_problem.jsdl 2009-04-08 15:06:53 UTC (rev 4463) @@ -0,0 +1,18 @@ +<?xml version="1.0"?> + <jsdl:JobDefinition xmlns:jsdl="http://schemas.ggf.org/jsdl/2005/11/jsdl" xmlns:jsdl-posix="http://schemas.ggf.org/jsdl/2005/11/jsdl-posix"> + <jsdl:JobDescription> + + <jsdl:DataStaging> + <jsdl:FileName>infile.txt</jsdl:FileName> + <jsdl:Source> + <jsdl:URI>wrongscheme:///wrongurl</jsdl:URI> + </jsdl:Source> + </jsdl:DataStaging> + <jsdl:Application> + <jsdl-posix:POSIXApplication> + <jsdl-posix:Executable>/bin/ls</jsdl-posix:Executable> + <jsdl-posix:Argument>-l</jsdl-posix:Argument> + </jsdl-posix:POSIXApplication> + </jsdl:Application> + </jsdl:JobDescription> + </jsdl:JobDefinition> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |