summaryrefslogtreecommitdiffstats
path: root/client/go/script-utils/services/sentinel.go
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-01-19 10:55:28 +0000
committerArne Juul <arnej@yahooinc.com>2023-01-20 15:18:02 +0000
commit02aabca514dc2a1f1bfe768a7939d7983bdec821 (patch)
tree7cbc5909eb5be97892887dc0ef01149e65889d9b /client/go/script-utils/services/sentinel.go
parenteffe4b34bb8a8740d9bf7ede11d24e2eaa0f8c15 (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.go84
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
+}