From 7157119dc5e1a63a49d94684d1185bd35d79e87a Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Tue, 10 Sep 2024 23:26:29 +0100 Subject: job-state: Move job-state records into separate module. * ravanan/job-state.scm: New file. * ravanan/command-line-tool.scm: Import (ravanan job-state). (, ): Move to (ravanan job-state). (command-line-tool-scheduler): Use job-state-status and job-state-script. --- ravanan/command-line-tool.scm | 50 +++++--------------------- ravanan/job-state.scm | 83 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 ravanan/job-state.scm diff --git a/ravanan/command-line-tool.scm b/ravanan/command-line-tool.scm index cbb81c4..9f77f2a 100644 --- a/ravanan/command-line-tool.scm +++ b/ravanan/command-line-tool.scm @@ -46,6 +46,7 @@ #:use-module (yaml) #:use-module (ravanan config) #:use-module (ravanan glob) + #:use-module (ravanan job-state) #:use-module (ravanan monads) #:use-module (ravanan propnet) #:use-module (ravanan reader) @@ -105,18 +106,6 @@ (scatter scheduler-proc-scatter) (scatter-method scheduler-proc-scatter-method)) -(define-immutable-record-type - (single-machine-job-state script success?) - single-machine-job-state? - (script single-machine-job-state-script) - (success? single-machine-job-state-success?)) - -(define-immutable-record-type - (slurm-job-state script job-id) - slurm-job-state? - (script slurm-job-state-script) - (job-id slurm-job-state-job-id)) - (define-condition-type &job-failure &error job-failure job-failure? (script job-failure-script)) @@ -998,32 +987,12 @@ failed." script (script->store-stdout-file script store) (script->store-stderr-file script store))))) - (cond - ;; Single machine jobs are run synchronously. So, they return success or - ;; failure immediately. - ((single-machine-job-state? state) - (if (single-machine-job-state-success? state) - 'completed - (raise-exception - (job-failure (single-machine-job-state-script state))))) - ;; Poll slurm for job state. - ((slurm-job-state? state) - (case (job-state (slurm-job-state-job-id state) - #:api-endpoint slurm-api-endpoint - #:jwt slurm-jwt) - ((failed) - (raise-exception - (job-failure (slurm-job-state-script state)))) - (else => identity))) - ;; For vector states, poll each state element and return 'completed only - ;; if all state elements have completed. - ((vector? state) - (or (vector-every (lambda (state-element) - (case (poll state-element) - ((completed) => identity) - (else #f))) - state) - 'pending))))) + (case (job-state-status state + #:slurm-api-endpoint slurm-api-endpoint + #:slurm-jwt slurm-jwt) + ((failed) + (raise-exception (job-failure (job-state-script state)))) + (else => identity)))) (define (capture-output state) "Return output of completed job @var{state}." @@ -1043,10 +1012,7 @@ failed." outputs)))) head-output))) ;; Log progress and return captured output. - (let ((script ((case batch-system - ((single-machine) single-machine-job-state-script) - ((slurm-api) slurm-job-state-script)) - state))) + (let ((script (job-state-script state))) (format (current-error-port) "~a completed; logs at ~a and ~a~%" script diff --git a/ravanan/job-state.scm b/ravanan/job-state.scm new file mode 100644 index 0000000..fc0045a --- /dev/null +++ b/ravanan/job-state.scm @@ -0,0 +1,83 @@ +;;; ravanan --- High-reproducibility CWL runner powered by Guix +;;; Copyright © 2024 Arun Isaac +;;; +;;; This file is part of ravanan. +;;; +;;; ravanan 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. +;;; +;;; ravanan 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 ravanan. If not, see . + +;;; Commentary: + +;; This module isolates the various job-state record types and exports only a +;; generic interface to them. In addition, it also exports constructors for the +;; various job-state record types. + +;;; Code: + +(define-module (ravanan job-state) + #:use-module (srfi srfi-9 gnu) + #:use-module (ravanan slurm-api) + #:use-module (ravanan vectors) + #:export (single-machine-job-state + slurm-job-state + + job-state-script + job-state-status)) + +(define-immutable-record-type + (single-machine-job-state script success?) + single-machine-job-state? + (script single-machine-job-state-script) + (success? single-machine-job-state-success?)) + +(define-immutable-record-type + (slurm-job-state script job-id) + slurm-job-state? + (script slurm-job-state-script) + (job-id slurm-job-state-job-id)) + +(define (job-state-script state) + ((cond + ((single-machine-job-state? state) + single-machine-job-state-script) + ((slurm-job-state? state) + slurm-job-state-script)) + state)) + +(define* (job-state-status state #:key slurm-api-endpoint slurm-jwt) + "Return current status of job with @var{state}---one of the symbols +@code{completed}, @code{failed} or @code{pending}. + +@var{slurm-api-endpoint} and @var{slurm-jwt} are the same as in +@code{run-workflow} from @code{(ravanan workflow)}." + (cond + ;; Single machine jobs are run synchronously. So, they return success or + ;; failure immediately. + ((single-machine-job-state? state) + (if (single-machine-job-state-success? state) + 'completed + 'failed)) + ;; Poll slurm for job state. + ((slurm-job-state? state) + (job-state (slurm-job-state-job-id state) + #:api-endpoint slurm-api-endpoint + #:jwt slurm-jwt)) + ;; For vector states, poll each state element and return 'completed only if + ;; all state elements have completed. + ((vector? state) + (or (vector-every (lambda (state-element) + (case (job-state-status state-element) + ((completed) => identity) + (else #f))) + state) + 'pending)))) -- cgit v1.2.3