summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2025-01-20 00:27:33 +0000
committerArun Isaac2025-01-21 00:16:16 +0000
commitf7ef493180b8413b96b0ff7fe9e45bc8cd83d8d2 (patch)
treef1215010443a38ead1681805c7e2ac0583273cce
parent96140e46e18c72ad57bc2e2cca1d9933a8fd4966 (diff)
downloadravanan-f7ef493180b8413b96b0ff7fe9e45bc8cd83d8d2.tar.gz
ravanan-f7ef493180b8413b96b0ff7fe9e45bc8cd83d8d2.tar.lz
ravanan-f7ef493180b8413b96b0ff7fe9e45bc8cd83d8d2.zip
propnet: Introduce <state+status> objects for polling.
Let pollers return <state+status> objects instead of two separate
values. <state+status> objects are essentially named 2-tuples. This
will be more convenient than multiple values when dealing with the
state monad.

* ravanan/propnet.scm (<state+status>): New record type.
(poll-propnet): Accept and return <state+status> objects.
* ravanan/workflow.scm (workflow-scheduler)[poll]: Accept and return
<state+status> objects.
(run-workflow): Accept <state+status> objects from poll.
-rw-r--r--ravanan/propnet.scm39
-rw-r--r--ravanan/workflow.scm51
2 files changed, 51 insertions, 39 deletions
diff --git a/ravanan/propnet.scm b/ravanan/propnet.scm
index da74dec..360aea4 100644
--- a/ravanan/propnet.scm
+++ b/ravanan/propnet.scm
@@ -40,6 +40,9 @@
             scheduler-poll
             scheduler-capture-output
             schedule-propnet
+            state+status
+            state+status-state
+            state+status-status
             poll-propnet
             capture-propnet-output))
 
@@ -67,6 +70,12 @@
   (poll scheduler-poll)
   (capture-output scheduler-capture-output))
 
+(define-immutable-record-type <state+status>
+  (state+status state status)
+  state+status?
+  (state state+status-state)
+  (status state+status-status))
+
 (define-immutable-record-type <propnet-state>
   (propnet-state propnet cells cells-inbox propagators-in-flight propagators-inbox)
   propnet-state?
@@ -127,9 +136,9 @@ exists, return @code{#f}. @var{val} is compared using @code{equal?}."
                  (propnet-propagators propnet)))
 
 (define (poll-propnet state)
-  "Poll propagator network @var{state}. Return two values---a status symbol (either
-@code{completed} or @code{pending}) and the current state of the propagator
-network."
+  "Poll propagator network @var{state}. Return a @code{<state+status>} object
+containing two values---the updated state of the propagator network and a status
+symbol (either @code{completed} or @code{pending})."
   (define propnet
     (propnet-state-propnet state))
 
@@ -226,12 +235,12 @@ their states."
             ;; All propagators are finished. The propnet has stabilized. We are
             ;; done. Return all cell values.
             (()
-             (values 'completed
-                     (propnet-state propnet
-                                    cells
-                                    cell-values-inbox
-                                    propagators-in-flight
-                                    propagators-inbox)))
+             (state+status (propnet-state propnet
+                                          cells
+                                          cell-values-inbox
+                                          propagators-in-flight
+                                          propagators-inbox)
+                           'completed))
             ;; Propagators are still in flight. Check if any of them have
             ;; completed.
             (_
@@ -253,12 +262,12 @@ their states."
                  ;; None of the propagators we checked have completed. Return a
                  ;; pending state.
                  (()
-                  (values 'pending
-                          (propnet-state propnet
-                                         cells
-                                         cell-values-inbox
-                                         propagators-still-in-flight
-                                         propagators-inbox)))
+                  (state+status (propnet-state propnet
+                                               cells
+                                               cell-values-inbox
+                                               propagators-still-in-flight
+                                               propagators-inbox)
+                                'pending))
                  ;; Some of the propagators we checked have completed. Enqueue
                  ;; their outputs in the cells inbox and loop.
                  (_
diff --git a/ravanan/workflow.scm b/ravanan/workflow.scm
index 13deb6f..3615664 100644
--- a/ravanan/workflow.scm
+++ b/ravanan/workflow.scm
@@ -311,9 +311,9 @@ job state object. @var{proc} may either be a @code{<propnet>} object or a
                                (assoc-ref* cwl "outputs")))))))))
 
   (define (poll state)
-    "Return current status and updated state of job @var{state} object. The status is
-one of the symbols @code{pending} or @code{completed}. Raise an exception and
-exit if job has failed."
+    "Return updated state and current status of job @var{state} object as a
+@code{<state+status>} object. The status is one of the symbols @code{pending} or
+@code{completed}."
     (guard (c ((job-failure? c)
                (let ((script (job-failure-script c)))
                  (user-error
@@ -326,28 +326,30 @@ exit if job has failed."
        ;; completed.
        ((vector? state)
         (let ((status state (vector-mapn poll state)))
-          (values (if (vector-every (cut eq? <> 'completed)
-                                    status)
-                      'completed
-                      'pending)
-                  state)))
+          (state+status state
+                        (if (vector-every (cut eq? <> 'completed)
+                                          status)
+                            'completed
+                            'pending))))
        ;; Poll job state. Raise an exception if the job has failed.
        ((command-line-tool-state? state)
-        (values (case (job-state-status (command-line-tool-state-job-state state)
-                                        batch-system)
-                  ((failed)
-                   (raise-exception (job-failure
-                                     (job-state-script
-                                      (command-line-tool-state-job-state state)))))
-                  (else => identity))
-                state))
+        (state+status state
+                      (case (job-state-status (command-line-tool-state-job-state state)
+                                              batch-system)
+                        ((failed)
+                         (raise-exception (job-failure
+                                           (job-state-script
+                                            (command-line-tool-state-job-state state)))))
+                        (else => identity))))
        ;; Poll sub-workflow state. We do not need to check the status here since
        ;; job failures only occur at the level of a CommandLineTool.
        ((workflow-state? state)
-        (let ((status updated-propnet-state
-                      (poll-propnet (workflow-state-propnet-state state))))
-          (values status
-                  (set-workflow-state-propnet-state state updated-propnet-state))))
+        (let ((updated-state+status
+               (poll-propnet (workflow-state-propnet-state state))))
+          (state+status
+           (set-workflow-state-propnet-state state
+                                             (state+status-state updated-state+status))
+           (state+status-status updated-state+status))))
        (else
         (assertion-violation state "Invalid state")))))
 
@@ -615,8 +617,8 @@ area need not be shared. @var{store} is the path to the shared ravanan store.
                         inputs
                         scheduler))))
       ;; Poll.
-      (let ((status state ((scheduler-poll scheduler) state)))
-        (if (eq? status 'pending)
+      (let ((state+status ((scheduler-poll scheduler) state)))
+        (if (eq? (state+status-status state+status) 'pending)
             (begin
               ;; Pause before looping and polling again so we don't bother the
               ;; job server too often.
@@ -627,6 +629,7 @@ area need not be shared. @var{store} is the path to the shared ravanan store.
                         0)
                        ((slurm-api-batch-system? batch-system)
                         %job-poll-interval)))
-              (loop state))
+              (loop (state+status-state state+status)))
             ;; Capture outputs.
-            ((scheduler-capture-output scheduler) state))))))
+            ((scheduler-capture-output scheduler)
+             (state+status-state state+status)))))))