Skip to content

Commit

Permalink
Allows to set generic knobs on the Sandbox
Browse files Browse the repository at this point in the history
Refactor the ostweaks file to allows a more easy reuse
Add a method on the osl.Sandbox interface to allow setting
knobs on the sandbox

Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
  • Loading branch information
Flavio Crisciani committed May 18, 2018
1 parent b58e5e9 commit f22f60a
Show file tree
Hide file tree
Showing 11 changed files with 112 additions and 53 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
*.o
*.a
*.so
*~
*.swp
tags
bin/
.gtm/

# Folders
integration-tmp/
Expand Down
5 changes: 5 additions & 0 deletions controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1146,6 +1146,11 @@ func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (S
}
}

// Apply operating specific knobs on the load balancer sandbox
if sb.loadBalancer {
sb.osSbox.ApplyOSTweaks()
}

c.Lock()
c.sandboxes[sb.id] = sb
c.Unlock()
Expand Down
55 changes: 3 additions & 52 deletions drivers/overlay/ostweaks_linux.go
Original file line number Diff line number Diff line change
@@ -1,72 +1,23 @@
package overlay

import (
"io/ioutil"
"path"
"strconv"
"strings"

"github.com/sirupsen/logrus"
"github.com/docker/libnetwork/osl/kernel"
)

type conditionalCheck func(val1, val2 string) bool

type osValue struct {
value string
checkFn conditionalCheck
}

var osConfig = map[string]osValue{
var ovConfig = map[string]kernel.OSValue{
"net.ipv4.neigh.default.gc_thresh1": {"8192", checkHigher},
"net.ipv4.neigh.default.gc_thresh2": {"49152", checkHigher},
"net.ipv4.neigh.default.gc_thresh3": {"65536", checkHigher},
}

func propertyIsValid(val1, val2 string, check conditionalCheck) bool {
if check == nil || check(val1, val2) {
return true
}
return false
}

func checkHigher(val1, val2 string) bool {
val1Int, _ := strconv.ParseInt(val1, 10, 32)
val2Int, _ := strconv.ParseInt(val2, 10, 32)
return val1Int < val2Int
}

// writeSystemProperty writes the value to a path under /proc/sys as determined from the key.
// For e.g. net.ipv4.ip_forward translated to /proc/sys/net/ipv4/ip_forward.
func writeSystemProperty(key, value string) error {
keyPath := strings.Replace(key, ".", "/", -1)
return ioutil.WriteFile(path.Join("/proc/sys", keyPath), []byte(value), 0644)
}

func readSystemProperty(key string) (string, error) {
keyPath := strings.Replace(key, ".", "/", -1)
value, err := ioutil.ReadFile(path.Join("/proc/sys", keyPath))
if err != nil {
return "", err
}
return string(value), nil
}

func applyOStweaks() {
for k, v := range osConfig {
// read the existing property from disk
oldv, err := readSystemProperty(k)
if err != nil {
logrus.Errorf("error reading the kernel parameter %s, error: %s", k, err)
continue
}

if propertyIsValid(oldv, v.value, v.checkFn) {
// write new prop value to disk
if err := writeSystemProperty(k, v.value); err != nil {
logrus.Errorf("error setting the kernel parameter %s = %s, (leaving as %s) error: %s", k, v.value, oldv, err)
continue
}
logrus.Debugf("updated kernel parameter %s = %s (was %s)", k, v.value, oldv)
}
}
kernel.ApplyOSTweaks(ovConfig)
}
3 changes: 2 additions & 1 deletion network.go
Original file line number Diff line number Diff line change
Expand Up @@ -2113,7 +2113,8 @@ func (n *network) lbEndpointName() string {
func (n *network) createLoadBalancerSandbox() error {
var err error
sandboxName := n.lbSandboxName()
sbOptions := []SandboxOption{}
// Mark the sandbox to be a load balancer
sbOptions := []SandboxOption{OptionLoadBalancer()}
if n.ingress {
sbOptions = append(sbOptions, OptionIngress())
}
Expand Down
16 changes: 16 additions & 0 deletions osl/kernel/knobs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kernel

type conditionalCheck func(val1, val2 string) bool

// OSValue represents a tuple, value defired, check function when to apply the value
type OSValue struct {
Value string
CheckFn conditionalCheck
}

func propertyIsValid(val1, val2 string, check conditionalCheck) bool {
if check == nil || check(val1, val2) {
return true
}
return false
}
47 changes: 47 additions & 0 deletions osl/kernel/knobs_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package kernel

import (
"io/ioutil"
"path"
"strings"

"github.com/sirupsen/logrus"
)

// writeSystemProperty writes the value to a path under /proc/sys as determined from the key.
// For e.g. net.ipv4.ip_forward translated to /proc/sys/net/ipv4/ip_forward.
func writeSystemProperty(key, value string) error {
keyPath := strings.Replace(key, ".", "/", -1)
return ioutil.WriteFile(path.Join("/proc/sys", keyPath), []byte(value), 0644)
}

// readSystemProperty reads the value from the path under /proc/sys and returns it
func readSystemProperty(key string) (string, error) {
keyPath := strings.Replace(key, ".", "/", -1)
value, err := ioutil.ReadFile(path.Join("/proc/sys", keyPath))
if err != nil {
return "", err
}
return string(value), nil
}

// ApplyOSTweaks applies the configuration values passed as arguments
func ApplyOSTweaks(osConfig map[string]OSValue) {
for k, v := range osConfig {
// read the existing property from disk
oldv, err := readSystemProperty(k)
if err != nil {
logrus.WithError(err).Errorf("error reading the kernel parameter %s", k)
continue
}

if propertyIsValid(oldv, v.Value, v.CheckFn) {
// write new prop value to disk
if err := writeSystemProperty(k, v.Value); err != nil {
logrus.WithError(err).Errorf("error setting the kernel parameter %s = %s, (leaving as %s)", k, v.Value, oldv)
continue
}
logrus.Debugf("updated kernel parameter %s = %s (was %s)", k, v.Value, oldv)
}
}
}
8 changes: 8 additions & 0 deletions osl/kernel/knobs_unsupported.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// +build !linux

package kernel

// ApplyOSTweaks applies the configuration values passed as arguments
func ApplyOSTweaks(osConfig map[string]OSValue) {
return nil
}
12 changes: 12 additions & 0 deletions osl/namespace_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (

"github.com/docker/docker/pkg/reexec"
"github.com/docker/libnetwork/ns"
"github.com/docker/libnetwork/osl/kernel"
"github.com/docker/libnetwork/types"
"github.com/sirupsen/logrus"
"github.com/vishvananda/netlink"
Expand Down Expand Up @@ -630,3 +631,14 @@ func setIPv6(path, iface string, enable bool) error {
}
return nil
}

var sbConfig = map[string]kernel.OSValue{
// expires connection from the IPVS connection table when the backend is not available
// more info: https://github.com/torvalds/linux/blob/master/Documentation/networking/ipvs-sysctl.txt#L126:1
"net.ipv4.vs.expire_nodest_conn": {"1", nil},
}

// ApplyOSTweaks applies linux configs on the sandbox
func (n *networkNamespace) ApplyOSTweaks() {
kernel.ApplyOSTweaks(sbConfig)
}
4 changes: 4 additions & 0 deletions osl/namespace_unsupported.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@ func GetSandboxForExternalKey(path string, key string) (Sandbox, error) {
// SetBasePath sets the base url prefix for the ns path
func SetBasePath(path string) {
}

func (n *networkNamespace) applyOSTweaks() error {
return nil
}
3 changes: 3 additions & 0 deletions osl/sandbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ type Sandbox interface {

// restore sandbox
Restore(ifsopt map[string][]IfaceOption, routes []*types.StaticRoute, gw net.IP, gw6 net.IP) error

// ApplyOSTweaks applies operating system specific knobs on the sandbox
ApplyOSTweaks()
}

// NeighborOptionSetter interface defines the option setter methods for interface options
Expand Down
8 changes: 8 additions & 0 deletions sandbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ type sandbox struct {
inDelete bool
ingress bool
ndotsSet bool
loadBalancer bool
sync.Mutex
// This mutex is used to serialize service related operation for an endpoint
// The lock is here because the endpoint is saved into the store so is not unique
Expand Down Expand Up @@ -1151,6 +1152,13 @@ func OptionIngress() SandboxOption {
}
}

// OptionLoadBalancer function returns an option setter for marking a
// sandbox as a load balancer sandbox.
func OptionLoadBalancer() SandboxOption {
return func(sb *sandbox) {
sb.loadBalancer = true
}
}
func (eh epHeap) Len() int { return len(eh) }

func (eh epHeap) Less(i, j int) bool {
Expand Down

0 comments on commit f22f60a

Please sign in to comment.