class SequenceServer::BLAST::Error

Attributes

exitstatus[R]
stderr[R]
stdout[R]

Public Class Methods

new(exitstatus:, stdout:, stderr:) click to toggle source
# File lib/sequenceserver/blast/error.rb, line 8
def initialize(exitstatus:, stdout:, stderr:)
  @exitstatus = exitstatus
  @stdout = stdout
  @stderr = stderr
end

Public Instance Methods

raise!() click to toggle source
# File lib/sequenceserver/blast/error.rb, line 14
      def raise!
        return true if exitstatus.zero? && !File.zero?(stdout)

        case exitstatus
        when 1..2
          # 1: Error in query sequences or options.
          # 2: Error in BLAST databases.
          error = IO.foreach(stderr).grep(ERROR_LINE).join
          error = File.read(stderr) if error.empty?
          fail InputError, "(#{exitstatus}) #{error}"
        when 4
          # Out of memory. User can retry with a shorter search, so raising
          # InputError here instead of SystemError.
          fail InputError, <<~MSG
            Ran out of memory. Please try a smaller query, fewer and smaller
            databases, or limiting the output by using advanced options.
          MSG
        when 6
          # Error creating output files. It can't be a permission issue as that
          # would have been caught while creating job directory. But we can run
          # out of storage after creating the job directory and while running
          # the job. This is a SystemError.
          fail SystemError, 'Ran out of disk space.'
        else
          # I am not sure what the exit codes 3 means and we should not
          # encounter exit code 5. The only other error that I know can happen
          # but is not yet handled is when BLAST+ binaries break such as after
          # macOS updates. So raise SystemError, include the exit status in the
          # message, and say that that the "most likely" reason is broken BLAST+
          # binaries.

          error = File.read(stderr)
          error = 'Most likely there is a problem with the BLAST+ binaries.' if error.empty?

          fail SystemError, "BLAST failed abruptly (exit status: #{exitstatus}). #{error}"
        end
      end