X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6346a7c4c0cb5d7e8c5f01392b6cc64d329b68ec..733e8c44dacf230d605fe6e5ea3f95f0abb8d823:/services/crunch-dispatch-slurm/slurm.go diff --git a/services/crunch-dispatch-slurm/slurm.go b/services/crunch-dispatch-slurm/slurm.go index 735e057e25..791f294df1 100644 --- a/services/crunch-dispatch-slurm/slurm.go +++ b/services/crunch-dispatch-slurm/slurm.go @@ -13,13 +13,22 @@ import ( ) type Slurm interface { + Batch(script io.Reader, args []string) error Cancel(name string) error - Renice(name string, nice int64) error QueueCommand(args []string) *exec.Cmd - Batch(script io.Reader, args []string) error + Release(name string) error + Renice(name string, nice int64) error +} + +type slurmCLI struct { + runSemaphore chan bool } -type slurmCLI struct{} +func NewSlurmCLI() *slurmCLI { + return &slurmCLI{ + runSemaphore: make(chan bool, 3), + } +} func (scli *slurmCLI) Batch(script io.Reader, args []string) error { return scli.run(script, "sbatch", args) @@ -54,11 +63,17 @@ func (scli *slurmCLI) QueueCommand(args []string) *exec.Cmd { return exec.Command("squeue", args...) } +func (scli *slurmCLI) Release(name string) error { + return scli.run(nil, "scontrol", []string{"release", "Name=" + name}) +} + func (scli *slurmCLI) Renice(name string, nice int64) error { return scli.run(nil, "scontrol", []string{"update", "JobName=" + name, fmt.Sprintf("Nice=%d", nice)}) } func (scli *slurmCLI) run(stdin io.Reader, prog string, args []string) error { + scli.runSemaphore <- true + defer func() { <-scli.runSemaphore }() cmd := exec.Command(prog, args...) cmd.Stdin = stdin out, err := cmd.CombinedOutput()