associate task runners with a particular task manager
This commit is contained in:
parent
32ebb804fb
commit
606dd17e08
|
@ -174,10 +174,11 @@ The JobManager then performs the job and, when finished, asserts (job-finished I
|
||||||
;; ---------------------------------------------------------------------------------------------------
|
;; ---------------------------------------------------------------------------------------------------
|
||||||
;; TaskRunner
|
;; TaskRunner
|
||||||
|
|
||||||
(define (spawn-task-runner)
|
;; ID ID -> Spawn
|
||||||
(define id (gensym 'task-runner))
|
(define (spawn-task-runner id tm-id)
|
||||||
(spawn #:name id
|
(spawn #:name id
|
||||||
(assert (task-runner id))
|
(assert (task-runner id))
|
||||||
|
(stop-when (retracted (task-manager tm-id _)))
|
||||||
;; Task (TaskStateDesc -> Void) -> Void
|
;; Task (TaskStateDesc -> Void) -> Void
|
||||||
(define (perform-task tsk job-id on-complete! update-status!)
|
(define (perform-task tsk job-id on-complete! update-status!)
|
||||||
(match-define (task tid desc) tsk)
|
(match-define (task tid desc) tsk)
|
||||||
|
@ -225,18 +226,36 @@ The JobManager then performs the job and, when finished, asserts (job-finished I
|
||||||
;; ---------------------------------------------------------------------------------------------------
|
;; ---------------------------------------------------------------------------------------------------
|
||||||
;; TaskManager
|
;; TaskManager
|
||||||
|
|
||||||
(define (spawn-task-manager)
|
;; PosInt -> Spawn
|
||||||
|
(define (spawn-task-manager num-task-runners)
|
||||||
(define id (gensym 'task-manager))
|
(define id (gensym 'task-manager))
|
||||||
(spawn #:name id
|
(spawn #:name id
|
||||||
(log "Task Manager (TM) ~a is running" id)
|
(log "Task Manager (TM) ~a is running" id)
|
||||||
(during (job-manager-alive)
|
(during (job-manager-alive)
|
||||||
(log "TM learns about JM")
|
(log "TM learns about JM")
|
||||||
(define/query-set task-runners (task-runner $id) id
|
|
||||||
#:on-add (log "TM learns about task-runner ~a" id))
|
(field [task-runners (set)])
|
||||||
|
|
||||||
|
;; Create & Monitor Task Runners
|
||||||
|
(on-start
|
||||||
|
(for ([_ (in-range num-task-runners)])
|
||||||
|
(define tr-id (gensym 'task-runner))
|
||||||
|
(react
|
||||||
|
(on-start (spawn-task-runner tr-id id))
|
||||||
|
(on (asserted (task-runner tr-id))
|
||||||
|
(log "TM successfully created task-runner ~a" id)
|
||||||
|
(task-runners (set-add (task-runners) tr-id)))
|
||||||
|
(on (retracted (task-runner tr-id))
|
||||||
|
(log "Detected failure of task runner ~a, restarting" tr-id)
|
||||||
|
(spawn-task-runner tr-id id)))))
|
||||||
|
|
||||||
|
;; Assign incoming tasks
|
||||||
(field [busy-runners (set)])
|
(field [busy-runners (set)])
|
||||||
(define/dataflow idle-runners
|
(define/dataflow idle-runners
|
||||||
(set-count (set-subtract (task-runners) (busy-runners))))
|
(set-count (set-subtract (task-runners) (busy-runners))))
|
||||||
|
|
||||||
(assert (task-manager id (idle-runners)))
|
(assert (task-manager id (idle-runners)))
|
||||||
|
|
||||||
(define (can-accept?)
|
(define (can-accept?)
|
||||||
(positive? (idle-runners)))
|
(positive? (idle-runners)))
|
||||||
(define (select-runner)
|
(define (select-runner)
|
||||||
|
@ -564,9 +583,7 @@ The JobManager then performs the job and, when finished, asserts (job-finished I
|
||||||
|
|
||||||
(spawn-client (file->job "lorem.txt"))
|
(spawn-client (file->job "lorem.txt"))
|
||||||
(spawn-job-manager)
|
(spawn-job-manager)
|
||||||
(spawn-task-manager)
|
(spawn-task-manager 2)
|
||||||
(spawn-task-runner)
|
|
||||||
(spawn-task-runner)
|
|
||||||
(spawn-observer)
|
(spawn-observer)
|
||||||
|
|
||||||
(module+ main
|
(module+ main
|
||||||
|
|
Loading…
Reference in New Issue