X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a74c81b035c67d299e2a7298f8db3d368a578510..644f5de63e2b8b02e054fcbb3e9af39560cffae3:/services/crunch-dispatch-local/crunch-dispatch-local.go diff --git a/services/crunch-dispatch-local/crunch-dispatch-local.go b/services/crunch-dispatch-local/crunch-dispatch-local.go index 0ca7651851..279327ba18 100644 --- a/services/crunch-dispatch-local/crunch-dispatch-local.go +++ b/services/crunch-dispatch-local/crunch-dispatch-local.go @@ -1,19 +1,30 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main // Dispatcher service for Crunch that runs containers locally. import ( + "context" "flag" - "git.curoverse.com/arvados.git/sdk/go/arvados" - "git.curoverse.com/arvados.git/sdk/go/arvadosclient" - "git.curoverse.com/arvados.git/sdk/go/dispatch" + "fmt" "log" "os" "os/exec" + "os/signal" "sync" + "syscall" "time" + + "git.curoverse.com/arvados.git/sdk/go/arvados" + "git.curoverse.com/arvados.git/sdk/go/arvadosclient" + "git.curoverse.com/arvados.git/sdk/go/dispatch" ) +var version = "dev" + func main() { err := doMain() if err != nil { @@ -41,9 +52,22 @@ func doMain() error { "/usr/bin/crunch-run", "Crunch command to run container") + 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-local %s\n", version) + return nil + } + + log.Printf("crunch-dispatch-local %s started", version) + runningCmds = make(map[string]*exec.Cmd) arv, err := arvadosclient.MakeArvadosClient() @@ -54,16 +78,25 @@ func doMain() error { arv.Retries = 25 dispatcher := dispatch.Dispatcher{ - Arv: arv, - RunContainer: run, - PollInterval: time.Duration(*pollInterval) * time.Second, - DoneProcessing: make(chan struct{})} + Arv: arv, + RunContainer: run, + PollPeriod: time.Duration(*pollInterval) * time.Second, + } - err = dispatcher.RunDispatcher() + ctx, cancel := context.WithCancel(context.Background()) + err = dispatcher.Run(ctx) if err != nil { return err } + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-c + log.Printf("Received %s, shutting down", sig) + signal.Stop(c) + + cancel() + runningCmdsMutex.Lock() // Finished dispatching; interrupt any crunch jobs that are still running for _, cmd := range runningCmds { @@ -93,7 +126,7 @@ var startCmd = startFunc // crunch-run terminates, mark the container as Cancelled. func run(dispatcher *dispatch.Dispatcher, container arvados.Container, - status chan arvados.Container) { + status <-chan arvados.Container) { uuid := container.UUID @@ -160,8 +193,7 @@ func run(dispatcher *dispatch.Dispatcher, if err != nil { log.Printf("Error getting final container state: %v", err) } - if container.LockedByUUID == dispatcher.Auth.UUID && - (container.State == dispatch.Locked || container.State == dispatch.Running) { + if container.State == dispatch.Locked || container.State == dispatch.Running { log.Printf("After %s process termination, container state for %v is %q. Updating it to %q", *crunchRunCommand, container.State, uuid, dispatch.Cancelled) dispatcher.UpdateState(uuid, dispatch.Cancelled)