mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
*) I/O protocol parse issues should shutdown the container as the container goes to inconsistent state between calls. (eg. next call may receive previous calls left overs.) *) Move ghost read/write code into io_utils in common. *) Clean unused error from docker Wait() *) We can catch one case in JSON, if there's remaining unparsed data in decoder buffer, we can shut the container *) stdout/stderr when container is not handling a request are now blocked if freezer is also enabled. *) if a fatal err is set for slot, we do not requeue it and proceed to shutdown *) added a test function for a few cases with freezer strict behavior
74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package agent
|
|
|
|
import (
|
|
"errors"
|
|
"math"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type AgentConfig struct {
|
|
MinDockerVersion string `json:"min_docker_version"`
|
|
FreezeIdleMsecs time.Duration `json:"freeze_idle_msecs"`
|
|
EjectIdleMsecs time.Duration `json:"eject_idle_msecs"`
|
|
MaxResponseSize uint64 `json:"max_response_size"`
|
|
}
|
|
|
|
var MaxDisabledMsecs = time.Duration(math.MaxInt64)
|
|
|
|
func NewAgentConfig() (*AgentConfig, error) {
|
|
|
|
var err error
|
|
|
|
cfg := &AgentConfig{
|
|
MinDockerVersion: "17.06.0-ce",
|
|
}
|
|
|
|
cfg.FreezeIdleMsecs, err = getEnvMsecs("FN_FREEZE_IDLE_MSECS", 50*time.Millisecond)
|
|
if err != nil {
|
|
return cfg, errors.New("error initializing freeze idle delay")
|
|
}
|
|
|
|
cfg.EjectIdleMsecs, err = getEnvMsecs("FN_EJECT_IDLE_MSECS", 1000*time.Millisecond)
|
|
if err != nil {
|
|
return cfg, errors.New("error initializing eject idle delay")
|
|
}
|
|
|
|
if cfg.EjectIdleMsecs == time.Duration(0) {
|
|
return cfg, errors.New("error eject idle delay cannot be zero")
|
|
}
|
|
|
|
if size := os.Getenv("FN_MAX_RESPONSE_SIZE"); size != "" {
|
|
cfg.MaxResponseSize, err = strconv.ParseUint(size, 10, 64)
|
|
if err != nil {
|
|
return cfg, errors.New("error initializing response buffer size")
|
|
}
|
|
if cfg.MaxResponseSize < 0 {
|
|
return cfg, errors.New("error invalid response buffer size")
|
|
}
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func getEnvMsecs(name string, defaultVal time.Duration) (time.Duration, error) {
|
|
|
|
delay := defaultVal
|
|
|
|
if dur := os.Getenv(name); dur != "" {
|
|
durInt, err := strconv.ParseInt(dur, 10, 64)
|
|
if err != nil {
|
|
return defaultVal, err
|
|
}
|
|
// disable if negative or set to msecs specified.
|
|
if durInt < 0 || time.Duration(durInt) >= MaxDisabledMsecs/time.Millisecond {
|
|
delay = MaxDisabledMsecs
|
|
} else {
|
|
delay = time.Duration(durInt) * time.Millisecond
|
|
}
|
|
}
|
|
|
|
return delay, nil
|
|
}
|