From 9856a174e70177a3df3f9b15f5b8c193e0e4a395 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Wed, 16 Nov 2022 12:41:18 +0000 Subject: add start script for standalone containers --- client/go/.gitignore | 1 - client/go/jvm/application_container.go | 9 ++++++ client/go/jvm/container.go | 18 +++++++++-- client/go/jvm/env.go | 9 +++--- client/go/jvm/options_test.go | 4 ++- client/go/jvm/standalone_container.go | 12 +++++++ client/go/script-utils/main.go | 3 ++ client/go/script-utils/standalone/start.go | 52 ++++++++++++++++++++++++++++++ 8 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 client/go/script-utils/standalone/start.go diff --git a/client/go/.gitignore b/client/go/.gitignore index baab7c638c6..1d2f5a949a6 100644 --- a/client/go/.gitignore +++ b/client/go/.gitignore @@ -1,7 +1,6 @@ bin/ dist/ share/ -!Makefile !build/ !target/ mytestapp/ diff --git a/client/go/jvm/application_container.go b/client/go/jvm/application_container.go index 924a47f1997..e1ce45f890c 100644 --- a/client/go/jvm/application_container.go +++ b/client/go/jvm/application_container.go @@ -9,6 +9,7 @@ import ( "github.com/vespa-engine/vespa/client/go/defaults" "github.com/vespa-engine/vespa/client/go/envvars" + "github.com/vespa-engine/vespa/client/go/prog" "github.com/vespa-engine/vespa/client/go/trace" "github.com/vespa-engine/vespa/client/go/util" ) @@ -166,3 +167,11 @@ func (a *ApplicationContainer) configureOptions() { opts.AddOption("-Dzookeeper_log_file_prefix=" + zkLogFile) } } + +func (c *ApplicationContainer) exportExtraEnv(ps *prog.Spec) { + if c.ConfigId() != "" { + ps.Setenv(envvars.VESPA_CONFIG_ID, c.ConfigId()) + } else { + util.JustExitMsg("application container requires a config id") + } +} diff --git a/client/go/jvm/container.go b/client/go/jvm/container.go index 384384da137..3a66a2d37c4 100644 --- a/client/go/jvm/container.go +++ b/client/go/jvm/container.go @@ -5,6 +5,7 @@ package jvm import ( "fmt" + "sort" "strings" "github.com/vespa-engine/vespa/client/go/prog" @@ -18,6 +19,7 @@ type Container interface { ArgForMain() string JvmOptions() *Options Exec() + exportExtraEnv(ps *prog.Spec) } type containerBase struct { @@ -38,10 +40,20 @@ func (cb *containerBase) ConfigId() string { return cb.configId } +func keysOfMap(m map[string]string) []string { + keys := make([]string, 0, len(m)) + for k, _ := range m { + keys = append(keys, k) + } + return keys +} + func readableEnv(env map[string]string) string { + keys := keysOfMap(env) + sort.Strings(keys) var buf strings.Builder - for k, v := range env { - fmt.Fprintf(&buf, " %s=%s", k, v) + for _, k := range keys { + fmt.Fprintf(&buf, " %s=%s", k, env[k]) } return buf.String() } @@ -54,7 +66,7 @@ func (cb *containerBase) Exec() { } p := prog.NewSpec(argv) p.ConfigureNumaCtl() - cb.exportEnvSettings(p) + cb.JvmOptions().exportEnvSettings(p) trace.Info("starting container; env:", readableEnv(p.Env)) trace.Info("starting container; exec:", argv) err := p.Run() diff --git a/client/go/jvm/env.go b/client/go/jvm/env.go index 97050bcca7c..a23606e6d0d 100644 --- a/client/go/jvm/env.go +++ b/client/go/jvm/env.go @@ -12,13 +12,16 @@ import ( "github.com/vespa-engine/vespa/client/go/util" ) -func (c *containerBase) exportEnvSettings(ps *prog.Spec) { +func (opts *Options) exportEnvSettings(ps *prog.Spec) { + c := opts.container vespaHome := defaults.VespaHome() vlt := fmt.Sprintf("file:%s/logs/vespa/vespa.log", vespaHome) lcd := fmt.Sprintf("%s/var/db/vespa/logcontrol", vespaHome) + lcf := fmt.Sprintf("%s/%s.logcontrol", lcd, c.ServiceName()) dlp := fmt.Sprintf("%s/lib64", vespaHome) ps.Setenv(envvars.VESPA_LOG_TARGET, vlt) ps.Setenv(envvars.VESPA_LOG_CONTROL_DIR, lcd) + ps.Setenv(envvars.VESPA_LOG_CONTROL_FILE, lcf) ps.Setenv(envvars.VESPA_SERVICE_NAME, c.ServiceName()) ps.Setenv(envvars.LD_LIBRARY_PATH, dlp) ps.Setenv(envvars.MALLOC_ARENA_MAX, "1") @@ -26,8 +29,6 @@ func (c *containerBase) exportEnvSettings(ps *prog.Spec) { ps.Setenv(envvars.JAVAVM_LD_PRELOAD, preload) ps.Setenv(envvars.LD_PRELOAD, preload) } - if c.ConfigId() != "" { - ps.Setenv(envvars.VESPA_CONFIG_ID, c.ConfigId()) - } util.OptionallyReduceTimerFrequency() + c.exportExtraEnv(ps) } diff --git a/client/go/jvm/options_test.go b/client/go/jvm/options_test.go index 9ccecf5ae6b..cfb4e90d5e5 100644 --- a/client/go/jvm/options_test.go +++ b/client/go/jvm/options_test.go @@ -5,11 +5,13 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/vespa-engine/vespa/client/go/prog" ) type dummyContainer struct{ containerBase } -func (*dummyContainer) ArgForMain() string { return "arg-for-main" } +func (*dummyContainer) ArgForMain() string { return "arg-for-main" } +func (*dummyContainer) exportExtraEnv(ps *prog.Spec) {} func newDummyContainer() Container { var dc dummyContainer dc.serviceName = "foo" diff --git a/client/go/jvm/standalone_container.go b/client/go/jvm/standalone_container.go index a2181ed7c3e..edaea346889 100644 --- a/client/go/jvm/standalone_container.go +++ b/client/go/jvm/standalone_container.go @@ -8,6 +8,8 @@ import ( "os" "github.com/vespa-engine/vespa/client/go/defaults" + "github.com/vespa-engine/vespa/client/go/envvars" + "github.com/vespa-engine/vespa/client/go/prog" "github.com/vespa-engine/vespa/client/go/trace" "github.com/vespa-engine/vespa/client/go/util" ) @@ -78,3 +80,13 @@ func (a *StandaloneContainer) addJdiscProperties() { opts.AddOption("-Djdisc.cache.path=" + bCacheDir) opts.AddOption("-Djdisc.logger.tag=" + svcName) } + +func (c *StandaloneContainer) exportExtraEnv(ps *prog.Spec) { + vespaHome := defaults.VespaHome() + app := fmt.Sprintf("%s/conf/%s-app", vespaHome, c.ServiceName()) + if util.IsDirectory(app) { + ps.Setenv(envvars.STANDALONE_JDISC_APP_LOCATION, app) + } else { + util.JustExitMsg("standalone container requires an application directory, missing: " + app) + } +} diff --git a/client/go/script-utils/main.go b/client/go/script-utils/main.go index 9d35cb46e1c..97f31957b36 100644 --- a/client/go/script-utils/main.go +++ b/client/go/script-utils/main.go @@ -13,6 +13,7 @@ import ( "github.com/vespa-engine/vespa/client/go/cmd/logfmt" "github.com/vespa-engine/vespa/client/go/jvm" "github.com/vespa-engine/vespa/client/go/script-utils/configserver" + "github.com/vespa-engine/vespa/client/go/script-utils/standalone" "github.com/vespa-engine/vespa/client/go/script-utils/startcbinary" "github.com/vespa-engine/vespa/client/go/util" "github.com/vespa-engine/vespa/client/go/vespa" @@ -38,6 +39,8 @@ func main() { os.Exit(configserver.JustStartConfigserver()) case "vespa-start-container-daemon": os.Exit(jvm.RunApplicationContainer(os.Args[1:])) + case "run-standalone-container": + os.Exit(standalone.StartStandaloneContainer(os.Args[1:])) case "start-c-binary": os.Exit(startcbinary.Run(os.Args[1:])) case "export-env": diff --git a/client/go/script-utils/standalone/start.go b/client/go/script-utils/standalone/start.go new file mode 100644 index 00000000000..7b929730f5a --- /dev/null +++ b/client/go/script-utils/standalone/start.go @@ -0,0 +1,52 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Author: arnej + +// for starting standalone jdisc containers +package standalone + +import ( + "os" + + "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" +) + +func commonPreChecks() { + if doTrace := os.Getenv("TRACE_JVM_STARTUP"); doTrace != "" { + trace.AdjustVerbosity(1) + } + if doDebug := os.Getenv("DEBUG_JVM_STARTUP"); doDebug != "" { + trace.AdjustVerbosity(2) + } + veHome := vespa.FindAndVerifyVespaHome() + err := os.Chdir(veHome) + if err != nil { + util.JustExitWith(err) + } + err = vespa.LoadDefaultEnv() + if err != nil { + util.JustExitWith(err) + } +} + +func StartStandaloneContainer(extraArgs []string) int { + commonPreChecks() + util.TuneResourceLimits() + serviceName := os.Getenv("VESPA_SERVICE_NAME") + if serviceName == "" { + util.JustExitMsg("Missing service name, ensure VESPA_SERVICE_NAME is set in the environment") + } + c := jvm.NewStandaloneContainer(serviceName) + jvmOpts := c.JvmOptions() + for _, extra := range extraArgs { + jvmOpts.AddOption(extra) + } + minFallback := jvm.MegaBytesOfMemory(128) + maxFallback := jvm.MegaBytesOfMemory(2048) + jvmOpts.AddDefaultHeapSizeArgs(minFallback, maxFallback) + c.Exec() + // unreachable: + return 1 +} -- cgit v1.2.3