summaryrefslogtreecommitdiff
path: root/vendor/github.com/KimMachineGun/automemlimit/memlimit/experiment.go
blob: 2a7c320edc92f02e77da2b7df883e04acc0d6725 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package memlimit

import (
	"fmt"
	"os"
	"reflect"
	"strings"
)

const (
	envAUTOMEMLIMIT_EXPERIMENT = "AUTOMEMLIMIT_EXPERIMENT"
)

// Experiments is a set of experiment flags.
// It is used to enable experimental features.
//
// You can set the flags by setting the environment variable AUTOMEMLIMIT_EXPERIMENT.
// The value of the environment variable is a comma-separated list of experiment names.
//
// The following experiment names are known:
//
//   - none: disable all experiments
//   - system: enable fallback to system memory limit
type Experiments struct {
	// System enables fallback to system memory limit.
	System bool
}

func parseExperiments() (Experiments, error) {
	var exp Experiments

	// Create a map of known experiment names.
	names := make(map[string]func(bool))
	rv := reflect.ValueOf(&exp).Elem()
	rt := rv.Type()
	for i := 0; i < rt.NumField(); i++ {
		field := rv.Field(i)
		names[strings.ToLower(rt.Field(i).Name)] = field.SetBool
	}

	// Parse names.
	for _, f := range strings.Split(os.Getenv(envAUTOMEMLIMIT_EXPERIMENT), ",") {
		if f == "" {
			continue
		}
		if f == "none" {
			exp = Experiments{}
			continue
		}
		val := true
		set, ok := names[f]
		if !ok {
			return Experiments{}, fmt.Errorf("unknown AUTOMEMLIMIT_EXPERIMENT %s", f)
		}
		set(val)
	}

	return exp, nil
}