diff options
Diffstat (limited to 'client/go/internal/admin/vespa-wrapper/configserver')
7 files changed, 274 insertions, 0 deletions
diff --git a/client/go/internal/admin/vespa-wrapper/configserver/check.go b/client/go/internal/admin/vespa-wrapper/configserver/check.go new file mode 100644 index 00000000000..a0248dd128f --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/check.go @@ -0,0 +1,24 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "fmt" + + "github.com/vespa-engine/vespa/client/go/internal/admin/defaults" + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" +) + +func checkIsConfigserver(myname string) { + onlyHosts := defaults.VespaConfigserverHosts() + for _, hn := range onlyHosts { + if hn == "localhost" || hn == myname { + trace.Debug("should run configserver:", hn) + return + } + } + trace.Warning("only these hosts should run a config server:", onlyHosts) + util.JustExitMsg(fmt.Sprintf("this host [%s] should not run a config server", myname)) +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/env.go b/client/go/internal/admin/vespa-wrapper/configserver/env.go new file mode 100644 index 00000000000..1c4c33f5628 --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/env.go @@ -0,0 +1,31 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "fmt" + "os" + + "github.com/vespa-engine/vespa/client/go/internal/admin/envvars" + "github.com/vespa-engine/vespa/client/go/internal/util" +) + +func exportSettings(vespaHome string) { + vlt := fmt.Sprintf("file:%s/logs/vespa/vespa.log", vespaHome) + lcd := fmt.Sprintf("%s/var/db/vespa/logcontrol", vespaHome) + lcf := fmt.Sprintf("%s/configserver.logcontrol", lcd) + dlp := fmt.Sprintf("%s/lib64", vespaHome) + app := fmt.Sprintf("%s/conf/configserver-app", vespaHome) + os.Setenv(envvars.VESPA_LOG_TARGET, vlt) + os.Setenv(envvars.VESPA_LOG_CONTROL_DIR, lcd) + os.Setenv(envvars.VESPA_LOG_CONTROL_FILE, lcf) + os.Setenv(envvars.VESPA_SERVICE_NAME, "configserver") + os.Setenv(envvars.LD_LIBRARY_PATH, dlp) + os.Setenv(envvars.JAVAVM_LD_PRELOAD, "") + os.Setenv(envvars.LD_PRELOAD, "") + os.Setenv(envvars.STANDALONE_JDISC_APP_LOCATION, app) + os.Setenv(envvars.STANDALONE_JDISC_DEPLOYMENT_PROFILE, "configserver") + os.Setenv(envvars.MALLOC_ARENA_MAX, "1") + util.OptionallyReduceTimerFrequency() +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/fix_dirs_and_files.go b/client/go/internal/admin/vespa-wrapper/configserver/fix_dirs_and_files.go new file mode 100644 index 00000000000..8410d3f657c --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/fix_dirs_and_files.go @@ -0,0 +1,27 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "github.com/vespa-engine/vespa/client/go/internal/util" + "github.com/vespa-engine/vespa/client/go/internal/vespa" +) + +func makeFixSpec() util.FixSpec { + vespaUid, vespaGid := vespa.FindVespaUidAndGid() + return util.FixSpec{ + UserId: vespaUid, + GroupId: vespaGid, + DirMode: 0755, + FileMode: 0644, + } +} + +func fixDirsAndFiles(fixSpec util.FixSpec) { + fixSpec.FixDir("var/zookeeper") + fixSpec.FixDir("var/zookeeper/conf") + fixSpec.FixDir("var/zookeeper/version-2") + fixSpec.FixFile("var/zookeeper/conf/zookeeper.cfg") + fixSpec.FixFile("var/zookeeper/myid") +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/logd.go b/client/go/internal/admin/vespa-wrapper/configserver/logd.go new file mode 100644 index 00000000000..39a2100b20f --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/logd.go @@ -0,0 +1,25 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "os" + + "github.com/vespa-engine/vespa/client/go/internal/admin/envvars" + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" +) + +func maybeStartLogd() { + v1 := os.Getenv(envvars.CLOUDCONFIG_SERVER_MULTITENANT) + v2 := os.Getenv(envvars.VESPA_CONFIGSERVER_MULTITENANT) + if v1 == "true" || v2 == "true" { + backticks := util.BackTicksForwardStderr + out, err := backticks.Run("libexec/vespa/start-logd") + if err != nil { + panic(err) + } + trace.Info(out) + } +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/runserver.go b/client/go/internal/admin/vespa-wrapper/configserver/runserver.go new file mode 100644 index 00000000000..bef50009d8d --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/runserver.go @@ -0,0 +1,59 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "fmt" + + "github.com/vespa-engine/vespa/client/go/internal/admin/defaults" + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" +) + +const ( + PROG_NAME = "vespa-runserver" +) + +type RunServer struct { + ServiceName string + Args []string +} + +func (rs *RunServer) PidFile() string { + varRunDir := defaults.UnderVespaHome("var/run") + return fmt.Sprintf("%s/%s.pid", varRunDir, rs.ServiceName) +} + +func (rs *RunServer) ProgPath() string { + p := fmt.Sprintf("%s/bin64/%s", defaults.VespaHome(), PROG_NAME) + if util.IsExecutableFile(p) { + return p + } + p = fmt.Sprintf("%s/bin/%s", defaults.VespaHome(), PROG_NAME) + if util.IsExecutableFile(p) { + return p + } + panic(fmt.Errorf("not an executable file: %s", p)) +} + +func (rs *RunServer) WouldRun() bool { + backticks := util.BackTicksForwardStderr + out, err := backticks.Run(rs.ProgPath(), "-s", rs.ServiceName, "-p", rs.PidFile(), "-W") + trace.Trace("output from -W:", out, "error:", err) + return err == nil +} + +func (rs *RunServer) Exec(prog string) { + argv := util.ArrayList[string]{ + PROG_NAME, + "-s", rs.ServiceName, + "-r", "30", + "-p", rs.PidFile(), + "--", + prog, + } + argv.AppendAll(rs.Args...) + err := util.Execvp(rs.ProgPath(), argv) + util.JustExitWith(err) +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/start.go b/client/go/internal/admin/vespa-wrapper/configserver/start.go new file mode 100644 index 00000000000..e2ea6a11357 --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/start.go @@ -0,0 +1,86 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "os" + + "github.com/vespa-engine/vespa/client/go/internal/admin/envvars" + "github.com/vespa-engine/vespa/client/go/internal/admin/jvm" + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" + "github.com/vespa-engine/vespa/client/go/internal/vespa" +) + +const ( + SERVICE_NAME = "configserver" +) + +func commonPreChecks() (veHome string) { + if doTrace := os.Getenv(envvars.TRACE_JVM_STARTUP); doTrace != "" { + trace.AdjustVerbosity(1) + } + if doDebug := os.Getenv(envvars.DEBUG_JVM_STARTUP); doDebug != "" { + trace.AdjustVerbosity(2) + } + _ = vespa.FindAndVerifyVespaHome() + err := vespa.LoadDefaultEnv() + if err != nil { + panic(err) + } + veHome = vespa.FindAndVerifyVespaHome() + veHost, e := vespa.FindOurHostname() + if e != nil { + trace.Warning("could not detect hostname:", err, "; using fallback:", veHost) + } + checkIsConfigserver(veHost) + e = os.Chdir(veHome) + if e != nil { + util.JustExitWith(e) + } + return +} + +func JustStartConfigserver() int { + vespaHome := commonPreChecks() + vespa.CheckCorrectUser() + util.TuneResourceLimits() + util.TuneLogging(SERVICE_NAME, "com.google.api.client.http.HttpTransport", "config=off") + exportSettings(vespaHome) + removeStaleZkLocks(vespaHome) + c := jvm.NewStandaloneContainer(SERVICE_NAME) + jvmOpts := c.JvmOptions() + if extra := os.Getenv(envvars.VESPA_CONFIGSERVER_JVMARGS); extra != "" { + jvmOpts.AddJvmArgsFromString(extra) + } + minFallback := jvm.MegaBytesOfMemory(128) + maxFallback := jvm.MegaBytesOfMemory(2048) + jvmOpts.AddDefaultHeapSizeArgs(minFallback, maxFallback) + c.Exec() + // unreachable: + return 1 +} + +func runConfigserverWithRunserver() int { + commonPreChecks() + vespa.CheckCorrectUser() + rs := RunServer{ + ServiceName: SERVICE_NAME, + Args: []string{"just-start-configserver"}, + } + rs.Exec("libexec/vespa/vespa-wrapper") + return 1 +} + +func StartConfigserverEtc() int { + vespaHome := commonPreChecks() + vespa.RunPreStart() + util.TuneResourceLimits() + fixSpec := makeFixSpec() + fixDirsAndFiles(fixSpec) + exportSettings(vespaHome) + vespa.MaybeSwitchUser("vespa-start-configserver") + maybeStartLogd() + return runConfigserverWithRunserver() +} diff --git a/client/go/internal/admin/vespa-wrapper/configserver/zk.go b/client/go/internal/admin/vespa-wrapper/configserver/zk.go new file mode 100644 index 00000000000..91ddf522848 --- /dev/null +++ b/client/go/internal/admin/vespa-wrapper/configserver/zk.go @@ -0,0 +1,22 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +package configserver + +import ( + "fmt" + + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" +) + +const ( + ZOOKEEPER_LOG_FILE_PREFIX = "logs/vespa/zookeeper.configserver" +) + +func removeStaleZkLocks(vespaHome string) { + backticks := util.BackTicksIgnoreStderr + cmd := fmt.Sprintf("rm -f '%s/%s'*lck", vespaHome, ZOOKEEPER_LOG_FILE_PREFIX) + trace.Trace("cleaning locks:", cmd) + backticks.Run("/bin/sh", "-c", cmd) +} |