Search code examples
nextflow

`errorStrategy` setting to stop current process but continue pipeline


I have a lot of samples that go through a process which sometimes fail (deterministically). In such a case, I would want the failing process to stop, but all other samples to still get submitted and processed independently.

If I understand correctly, setting errorStrategy 'ignore' will continue the script within the failing process, which is not what I want. And errorStrategy 'finish' would stop submitting new samples, even though there is no reason for the other samples to fail too. And while errorStrategy 'retry' could technically work (by repeating the failing processes while the good ones get through), that doesn't seem like a good solution.

Am I missing something?


Solution

  • If a process can fail deterministically, it might be better to handle this situation somehow. Setting the errorStrategy directive to 'ignore' will mean any processes execution errors are ignored and allow your workflow continue. For example, you might get a process execution error if a process exits with a non-zero exit status or if one or more expected output files are missing. The pipeline will continue, however downstream processes will not be attempted.

    Contents of test.nf:

    nextflow.enable.dsl=2
    
    process foo {
    
        tag { sample }
    
        input:
        val sample
    
        output:
        path "${sample}.txt"
    
        """
        if [ "${sample}" == "s1" ] ; then
            (exit 1)
        fi
        if [ "${sample}" == "s2" ] ; then
            echo "Hello" > "${sample}.txt"
        fi
        """
    }
    
    process bar {
    
        tag { txt }
    
        input:
        path txt
    
        output:
        path "${txt}.gz"
    
        """
        gzip -c "${txt}" > "${txt}.gz"
        """
    }
    
    workflow {
    
        Channel.of('s1', 's2', 's3') | foo | bar
    }
    

    Contents of nextflow.config:

    process {
    
      // this is the default task.shell:
      shell = [ '/bin/bash', '-ue' ]
    
      errorStrategy = 'ignore'
    }
    

    Run with:

    nextflow run -ansi-log false test.nf
    

    Results:

    N E X T F L O W  ~  version 20.10.0
    Launching `test.nf` [drunk_bartik] - revision: e2103ea23b
    [9b/56ce2d] Submitted process > foo (s2)
    [43/0d5c9d] Submitted process > foo (s1)
    [51/7b6752] Submitted process > foo (s3)
    [43/0d5c9d] NOTE: Process `foo (s1)` terminated with an error exit status (1) -- Error is ignored
    [51/7b6752] NOTE: Missing output file(s) `s3.txt` expected by process `foo (s3)` -- Error is ignored
    [51/267685] Submitted process > bar (s2.txt)