Merge branch 'master' of git.curoverse.com:arvados into 11876-r-sdk
[arvados.git] / services / crunch-dispatch-slurm / crunch-dispatch-slurm.go
index f37909910ad5b25a9355b73bf3b5aa42395905b1..3c89103f38dbc1cd094047d173c10bfe0b28f08e 100644 (file)
@@ -26,6 +26,8 @@ import (
        "github.com/coreos/go-systemd/daemon"
 )
 
+var version = "dev"
+
 // Config used by crunch-dispatch-slurm
 type Config struct {
        Client arvados.Client
@@ -69,10 +71,21 @@ func doMain() error {
                "dump-config",
                false,
                "write current configuration to stdout and exit")
-
+       getVersion := flags.Bool(
+               "version",
+               false,
+               "Print version information and exit.")
        // Parse args; omit the first arg which is the command name
        flags.Parse(os.Args[1:])
 
+       // Print version information if requested
+       if *getVersion {
+               fmt.Printf("crunch-dispatch-slurm %s\n", version)
+               return nil
+       }
+
+       log.Printf("crunch-dispatch-slurm %s started", version)
+
        err := readConfig(&theConfig, *configPath)
        if err != nil {
                return err
@@ -158,7 +171,8 @@ func niceness(priority int) int {
        if priority < 0 {
                priority = 0
        }
-       return (1000 - priority) * 1000
+       // Niceness range 1-10000
+       return (1000 - priority) * 10
 }
 
 // sbatchCmd
@@ -194,7 +208,7 @@ func scancelFunc(container arvados.Container) *exec.Cmd {
 
 // scontrolCmd
 func scontrolFunc(container arvados.Container) *exec.Cmd {
-       return exec.Command("scontrol", "update", "JobName="+container.UUID, fmt.Sprintf("--nice=%d", niceness(container.Priority)))
+       return exec.Command("scontrol", "update", "JobName="+container.UUID, fmt.Sprintf("Nice=%d", niceness(container.Priority)))
 }
 
 // Wrap these so that they can be overridden by tests
@@ -208,7 +222,12 @@ func submit(dispatcher *dispatch.Dispatcher, container arvados.Container, crunch
 
        // Send a tiny script on stdin to execute the crunch-run
        // command (slurm requires this to be a #! script)
-       cmd.Stdin = strings.NewReader(execScript(append(crunchRunCommand, container.UUID)))
+
+       // append() here avoids modifying crunchRunCommand's
+       // underlying array, which is shared with other goroutines.
+       args := append([]string(nil), crunchRunCommand...)
+       args = append(args, container.UUID)
+       cmd.Stdin = strings.NewReader(execScript(args))
 
        var stdout, stderr bytes.Buffer
        cmd.Stdout = &stdout
@@ -294,8 +313,9 @@ func run(disp *dispatch.Dispatcher, ctr arvados.Container, status <-chan arvados
                        } else if updated.Priority == 0 {
                                log.Printf("Container %s has state %q, priority %d: cancel slurm job", ctr.UUID, updated.State, updated.Priority)
                                scancel(ctr)
-                       } else if niceness(updated.Priority) != sqCheck.GetNiceness(ctr.UUID) {
+                       } else if niceness(updated.Priority) != sqCheck.GetNiceness(ctr.UUID) && sqCheck.GetNiceness(ctr.UUID) != -1 {
                                // dynamically adjust priority
+                               log.Printf("Container priority %v != %v", niceness(updated.Priority), sqCheck.GetNiceness(ctr.UUID))
                                scontrolUpdate(updated)
                        }
                }