diff options
Diffstat (limited to 'client/go/util/setrlimit.go')
-rw-r--r-- | client/go/util/setrlimit.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/client/go/util/setrlimit.go b/client/go/util/setrlimit.go new file mode 100644 index 00000000000..4ec1ea60a3c --- /dev/null +++ b/client/go/util/setrlimit.go @@ -0,0 +1,62 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +//go:build !windows + +package util + +import ( + "github.com/vespa-engine/vespa/client/go/trace" + "golang.org/x/sys/unix" + "os" +) + +type ResourceId int + +const ( + RLIMIT_CORE ResourceId = unix.RLIMIT_AS + RLIMIT_NOFILE ResourceId = unix.RLIMIT_NOFILE + RLIMIT_NPROC ResourceId = unix.RLIMIT_NPROC + NO_RLIMIT uint64 = ^uint64(0) +) + +func (rid ResourceId) String() string { + switch rid { + case RLIMIT_CORE: + return "core file size" + case RLIMIT_NOFILE: + return "open files" + case RLIMIT_NPROC: + return "max user processes" + } + return "unknown resource id" +} + +func SetResourceLimit(resource ResourceId, newVal uint64) { + var current unix.Rlimit + err := unix.Getrlimit(int(resource), ¤t) + if err != nil { + trace.Warning("Could not get current resource limit:", err) + return + } + wanted := current + if current.Max < newVal { + if os.Getuid() == 0 { + wanted.Max = newVal + } else if newVal > current.Max { + trace.Warning( + "Wanted", newVal, + "as limit for", resource.String(), + "but cannot exceed current hard limit:", current.Max) + newVal = current.Max + } + } + if current.Cur < newVal { + wanted.Cur = newVal + } + err = unix.Setrlimit(int(resource), &wanted) + if err != nil { + trace.Trace("Failed setting resource limit:", err) + } else { + trace.Trace("Resource limit", resource, "adjusted OK:", wanted.Cur, "/", wanted.Max) + } +} |