diff options
author | Arne Juul <arnej@yahooinc.com> | 2023-01-19 10:55:28 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2023-01-20 15:18:02 +0000 |
commit | 02aabca514dc2a1f1bfe768a7939d7983bdec821 (patch) | |
tree | 7cbc5909eb5be97892887dc0ef01149e65889d9b /client/go/script-utils/services/sentinel.go | |
parent | effe4b34bb8a8740d9bf7ede11d24e2eaa0f8c15 (diff) |
prepare to switch vespa-start-services script
* make it easier to start non-jdisc JVM
* add hooks to start configproxy java program
* add sentinel startup
* port over more from common-env.sh
* tune some logging levels, use spam tracing
* use TRACE_STARTUP=true to get some tracing
Diffstat (limited to 'client/go/script-utils/services/sentinel.go')
-rw-r--r-- | client/go/script-utils/services/sentinel.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/client/go/script-utils/services/sentinel.go b/client/go/script-utils/services/sentinel.go new file mode 100644 index 00000000000..17f07ce4d55 --- /dev/null +++ b/client/go/script-utils/services/sentinel.go @@ -0,0 +1,84 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package services + +import ( + "fmt" + "os" + "os/exec" + "strconv" + "strings" + "time" + + "github.com/vespa-engine/vespa/client/go/envvars" + "github.com/vespa-engine/vespa/client/go/trace" + "github.com/vespa-engine/vespa/client/go/util" + "github.com/vespa-engine/vespa/client/go/vespa" +) + +const ( + SENTINEL_PIDFILE = "var/run/sentinel.pid" + SENTINEL_SERVICE_NAME = "config-sentinel" +) + +func startSentinelWithRunserver() { + _, veHost := commonPreChecks() + vespa.CheckCorrectUser() + os.Setenv(envvars.VESPA_SERVICE_NAME, SENTINEL_SERVICE_NAME) + configId := fmt.Sprintf("hosts/%s", veHost) + args := []string{ + "-r", "10", + "-s", SENTINEL_SERVICE_NAME, + "-p", SENTINEL_PIDFILE, + "--", + "sbin/vespa-config-sentinel", + "-c", configId, + } + cmd := exec.Command("vespa-runserver", args...) + cmd.Stdin = nil + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Start() + p := cmd.Process + if p != nil { + p.Release() + } + os.Unsetenv(envvars.VESPA_SERVICE_NAME) +} + +func waitForSentinelPid() bool { + backtick := util.BackTicksWithStderr + start := time.Now() + for sleepcount := 0; sleepcount < 1000; sleepcount++ { + time.Sleep(10 * time.Millisecond) + got, err := os.ReadFile(CONFIGPROXY_PIDFILE) + if err == nil { + pid, err := strconv.Atoi(strings.TrimSpace(string(got))) + if err == nil && pid > 0 { + _, err := backtick.Run("kill", "-0", strconv.Itoa(pid)) + if err == nil { + secs := int(time.Since(start).Seconds()) + if secs > 0 { + fmt.Printf("config sentinel started after %d seconds\n", secs) + } + return true + } + } + } + if sleepcount%500 == 90 { + trace.Warning("Waiting for sentinel to start") + } + } + return false +} + +func StartConfigSentinel() int { + commonPreChecks() + vespa.MaybeSwitchUser("start-config-sentinel") + startSentinelWithRunserver() + if waitForSentinelPid() { + return 0 + } + return 1 +} |