aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2022-11-16 12:41:18 +0000
committerArne Juul <arnej@yahooinc.com>2022-11-18 13:15:13 +0000
commit9856a174e70177a3df3f9b15f5b8c193e0e4a395 (patch)
tree82ae64f026006488e6bfa48487caee9cf141a6a8
parentadd8c45ce4753256356efd832a8a34ddbfaa4287 (diff)
add start script for standalone containers
-rw-r--r--client/go/.gitignore1
-rw-r--r--client/go/jvm/application_container.go9
-rw-r--r--client/go/jvm/container.go18
-rw-r--r--client/go/jvm/env.go9
-rw-r--r--client/go/jvm/options_test.go4
-rw-r--r--client/go/jvm/standalone_container.go12
-rw-r--r--client/go/script-utils/main.go3
-rw-r--r--client/go/script-utils/standalone/start.go52
8 files changed, 99 insertions, 9 deletions
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
+}