diff options
Diffstat (limited to 'client/go/script-utils/services/configproxy.go')
-rw-r--r-- | client/go/script-utils/services/configproxy.go | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/client/go/script-utils/services/configproxy.go b/client/go/script-utils/services/configproxy.go new file mode 100644 index 00000000000..fb452a4de00 --- /dev/null +++ b/client/go/script-utils/services/configproxy.go @@ -0,0 +1,134 @@ +// 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/defaults" + "github.com/vespa-engine/vespa/client/go/envvars" + "github.com/vespa-engine/vespa/client/go/jvm" + "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 ( + CONFIGPROXY_PIDFILE = "var/run/configproxy.pid" + PROXY_SERVICE_NAME = "configproxy" +) + +func JustRunConfigproxy() int { + commonPreChecks() + vespa.CheckCorrectUser() + configsources := defaults.VespaConfigserverRpcAddrs() + if len(configsources) < 1 { + util.JustExitMsg("could not find any configservers") + } + util.TuneResourceLimits() + c := jvm.NewConfigProxyJvm(PROXY_SERVICE_NAME) + userargs := os.Getenv(envvars.VESPA_CONFIGPROXY_JVMARGS) + c.ConfigureOptions(configsources, userargs) + c.Exec() + // unreachable: + return 1 +} + +func startProxyWithRunserver() { + commonPreChecks() + vespa.CheckCorrectUser() + configsources := defaults.VespaConfigserverRpcAddrs() + fmt.Printf( + "Starting config proxy using %s as config source(s)\n", + strings.Join(configsources, " and ")) + args := []string{ + "-r", "10", + "-s", PROXY_SERVICE_NAME, + "-p", CONFIGPROXY_PIDFILE, + "--", + "libexec/vespa/script-utils", "just-run-configproxy", + } + 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() + } +} + +func waitForProxyResponse() bool { + hname, _ := vespa.FindOurHostname() + backtick := util.BackTicksWithStderr + start := time.Now() + fmt.Printf("Waiting for config proxy to start\n") + for sleepcount := 0; sleepcount < 1800; sleepcount++ { + time.Sleep(100 * time.Millisecond) + got, err := os.ReadFile(CONFIGPROXY_PIDFILE) + if err == nil { + pid, err := strconv.Atoi(strings.TrimSpace(string(got))) + if err == nil && pid > 0 { + out, err := backtick.Run("vespa-ping-configproxy", "-s", hname) + if err == nil { + secs := time.Since(start).Seconds() + fmt.Printf("config proxy started after %ds (runserver pid %d)\n", int(secs), pid) + return true + } + if sleepcount%50 == 9 { + trace.Warning("Could not ping configproxy:", err) + if sleepcount%500 == 59 { + secs := time.Since(start).Seconds() + trace.Warning("ping output after", int(secs), "seconds:", strings.TrimSpace(out)) + logFile := defaults.VespaLogFile() + cmd := fmt.Sprintf("tail -n 15 %s | vespa-logfmt -l all -N", logFile) + out, err = backtick.Run("sh", "-c", cmd) + fmt.Fprintf(os.Stderr, "tail of logfile: >>>\n%s<<<\n", out) + } + } + } else { + trace.Debug("bad contents (", string(got), ") in pid file", CONFIGPROXY_PIDFILE) + } + } else { + trace.Debug("bad pid file", CONFIGPROXY_PIDFILE, err) + } + } + secs := time.Since(start).Seconds() + fmt.Fprintf(os.Stderr, "Config proxy still failed to start after %d seconds!\n", int(secs)) + got, err := os.ReadFile(CONFIGPROXY_PIDFILE) + if err != nil { + fmt.Fprintf(os.Stderr, "pid file %s was not created\n", CONFIGPROXY_PIDFILE) + return false + } + gotpid := strings.TrimSpace(string(got)) + pid, err := strconv.Atoi(gotpid) + if err != nil || pid < 1 { + fmt.Fprintf(os.Stderr, "invalid pid '%s' in file %s\n", gotpid, CONFIGPROXY_PIDFILE) + return false + } + out, err := backtick.Run("kill", "-0", gotpid) + if err != nil { + fmt.Fprintf(os.Stderr, "config proxy process `%s` has terminated: %s\n", gotpid, strings.TrimSpace(out)) + return false + } + out, err = backtick.Run("vespa-ping-configproxy", "-s", hname) + fmt.Fprintf(os.Stderr, "failed to ping configproxy: %s\n", out) + return false +} + +func StartConfigproxy() int { + commonPreChecks() + vespa.MaybeSwitchUser("start-configproxy") + startProxyWithRunserver() + if waitForProxyResponse() { + return 0 + } + return 1 +} |