X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/262871175bbe08f6ab1b7051bf9c5dfdd74283ac..3384d541acca51c346f8ebfe08b0dc93a33936ff:/services/crunch-run/crunchrun.go diff --git a/services/crunch-run/crunchrun.go b/services/crunch-run/crunchrun.go index 46d2d20680..0576337aa1 100644 --- a/services/crunch-run/crunchrun.go +++ b/services/crunch-run/crunchrun.go @@ -1518,6 +1518,14 @@ func (runner *ContainerRunner) Run() (err error) { runner.CrunchLog.Close() }() + err = runner.fetchContainerRecord() + if err != nil { + return + } + if runner.Container.State != "Locked" { + return fmt.Errorf("dispatch error detected: container %q has state %q", runner.Container.UUID, runner.Container.State) + } + defer func() { // checkErr prints e (unless it's nil) and sets err to // e (unless err is already non-nil). Thus, if err @@ -1558,10 +1566,6 @@ func (runner *ContainerRunner) Run() (err error) { checkErr("UpdateContainerFinal", runner.UpdateContainerFinal()) }() - err = runner.fetchContainerRecord() - if err != nil { - return - } runner.setupSignals() err = runner.startHoststat() if err != nil { @@ -1733,6 +1737,7 @@ func main() { cgroupParentSubsystem := flag.String("cgroup-parent-subsystem", "", "use current cgroup for given subsystem as parent cgroup for container") caCertsPath := flag.String("ca-certs", "", "Path to TLS root certificates") detach := flag.Bool("detach", false, "Detach from parent process and run in the background") + stdinEnv := flag.Bool("stdin-env", false, "Load environment variables from JSON message on stdin") sleep := flag.Duration("sleep", 0, "Delay before starting (testing use only)") kill := flag.Int("kill", -1, "Send signal to an existing crunch-run process for given UUID") list := flag.Bool("list", false, "List UUIDs of existing crunch-run processes") @@ -1762,6 +1767,13 @@ func main() { flag.Parse() + if *stdinEnv && !ignoreDetachFlag { + // Load env vars on stdin if asked (but not in a + // detached child process, in which case stdin is + // /dev/null). + loadEnv(os.Stdin) + } + switch { case *detach && !ignoreDetachFlag: os.Exit(Detach(flag.Arg(0), os.Args, os.Stdout, os.Stderr)) @@ -1852,3 +1864,21 @@ func main() { log.Fatalf("%s: %v", containerId, runerr) } } + +func loadEnv(rdr io.Reader) { + buf, err := ioutil.ReadAll(rdr) + if err != nil { + log.Fatalf("read stdin: %s", err) + } + var env map[string]string + err = json.Unmarshal(buf, &env) + if err != nil { + log.Fatalf("decode stdin: %s", err) + } + for k, v := range env { + err = os.Setenv(k, v) + if err != nil { + log.Fatalf("setenv(%q): %s", k, err) + } + } +}