JAL-1239 make doubly sure sub job status is set to complete/cancelled
[jalview.git] / src / jalview / ws / jws2 / MsaWSThread.java
index 393f475..08accba 100644 (file)
@@ -1,27 +1,26 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- * 
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.ws.jws2;
 
 import java.util.*;
 
 import compbio.data.msa.MsaWS;
-import compbio.data.sequence.AlignmentMetadata;
-import compbio.data.sequence.Program;
 import compbio.metadata.Argument;
 import compbio.metadata.ChunkHolder;
 import compbio.metadata.JobStatus;
@@ -516,7 +515,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI
           try
           {
             boolean cancelledJob = server.cancelJob(jobs[job].getJobId());
-            if (cancelledJob || true)
+            if (true) // cancelledJob || true)
             {
               // CANCELLED_JOB
               // if the Jaba server indicates the job can't be cancelled, its
@@ -546,6 +545,11 @@ class MsaWSThread extends AWS2Thread implements WSClientI
           }
           wsInfo.setProgressText(jobs[job].getJobnum(), OutputHeader
                   + cancelledMessage + "\n");
+        } else {
+          // if we hadn't submitted then just mark the job as cancelled.
+          jobs[job].setSubjobComplete(true);
+          wsInfo.setStatus(jobs[job].getJobnum(), WebserviceInfo.STATE_CANCELLED_OK);
+          
         }
       }
       if (cancelled)
@@ -586,7 +590,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI
   {
     StringBuffer response = j.jobProgress;
     long lastchunk = j.getLastChunk();
-    boolean changed=false;
+    boolean changed = false;
     do
     {
       j.setLastChunk(lastchunk);
@@ -594,9 +598,16 @@ class MsaWSThread extends AWS2Thread implements WSClientI
               .pullExecStatistics(j.getJobId(), lastchunk);
       if (chunk != null)
       {
-        changed=chunk.getChunk().length()>0;
+        changed |= chunk.getChunk().length() > 0;
         response.append(chunk.getChunk());
         lastchunk = chunk.getNextPosition();
+        try
+        {
+          Thread.sleep(50);
+        } catch (InterruptedException x)
+        {
+        }
+        ;
       }
       ;
     } while (lastchunk >= 0 && j.getLastChunk() != lastchunk);
@@ -640,7 +651,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI
       }
       else if (j.hasArguments())
       {
-        j.setJobId(server.customAlign(j.seqs,j.getJabaArguments()));
+        j.setJobId(server.customAlign(j.seqs, j.getJabaArguments()));
       }
       else
       {
@@ -726,7 +737,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI
 
   public void parseResult()
   {
-    long progbar=System.currentTimeMillis();
+    long progbar = System.currentTimeMillis();
     wsInfo.setProgressBar("Collecting job results.", progbar);
     int results = 0; // number of result sets received
     JobStateSummary finalState = new JobStateSummary();
@@ -737,40 +748,45 @@ class MsaWSThread extends AWS2Thread implements WSClientI
         MsaWSJob msjob = ((MsaWSJob) jobs[j]);
         if (jobs[j].isFinished() && msjob.alignment == null)
         {
-          boolean jpchanged=false,jpex=false;
-          do {
+          int nunchanged = 3, nexcept = 3;
+          boolean jpchanged = false, jpex = false;
+          do
+          {
             try
             {
               jpchanged = updateJobProgress(msjob);
-              jpex=false;
+              jpex = false;
+              if (jpchanged)
+              {
+                nexcept = 3;
+              }
             } catch (Exception e)
             {
-              
+
               Cache.log
                       .warn("Exception when retrieving remaining Job progress data for job "
                               + msjob.getJobId() + " on server " + WsUrl);
               e.printStackTrace();
-              if (jpex) {
-                // give up polling after two consecutive exceptions
-                jpchanged=false;
-              } else {
-                jpchanged=true;
-              }
+              nexcept--;
+              nunchanged = 3;
               // set flag remember that we've had an exception.
-              jpex=true;
+              jpex = true;
+              jpchanged = false;
             }
-            if (jpchanged)
+            if (!jpchanged)
             {
               try
               {
-                Thread.sleep(jpex ? 400 : 200); // wait a bit longer if we experienced an exception.
+                Thread.sleep(jpex ? 2400 : 1200); // wait a bit longer if we
+                                                  // experienced an exception.
               } catch (Exception ex)
               {
               }
               ;
+              nunchanged--;
             }
-          } while (jpchanged);
-          
+          } while (nunchanged > 0 && nexcept > 0);
+
           if (Cache.log.isDebugEnabled())
           {
             System.out.println("Job Execution file for job: "
@@ -789,6 +805,9 @@ class MsaWSThread extends AWS2Thread implements WSClientI
             Cache.log
                     .debug("Results not available for finished job - marking as broken job.",
                             e);
+            msjob.jobProgress
+                    .append("\nResult not available. Probably due to invalid input or parameter settings. Server error message below:\n\n"
+                            + e.getLocalizedMessage());
             msjob.setjobStatus(JobStatus.FAILED);
           } catch (Exception e)
           {
@@ -845,9 +864,9 @@ class MsaWSThread extends AWS2Thread implements WSClientI
     }
     else
     {
-      wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
       wsInfo.setFinishedNoResults();
     }
+    updateGlobalStatus(finalState);
     wsInfo.setProgressBar(null, progbar);
   }