Skip to content

Commit

Permalink
Change xtable warning to be based on time
Browse files Browse the repository at this point in the history
Signed-off-by: Chris Telfer <ctelfer@docker.com>
  • Loading branch information
ctelfer committed Apr 25, 2018
1 parent f099e73 commit 63b499f
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions iptables/iptables.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"sync"
"time"

"github.com/sirupsen/logrus"
)
Expand Down Expand Up @@ -423,10 +424,18 @@ func existsRaw(table Table, chain string, rule ...string) bool {
return strings.Contains(string(existingRules), ruleString)
}

func filterOutput(output []byte, args ...string) []byte {
// ignore iptables' message about xtables lock
if strings.Contains(string(output), xLockWaitMsg) {
// Maximum duration that an iptables operation can take
// before flagging a warning.
const opWarnTime = 2 * time.Second

func filterOutput(start time.Time, output []byte, args ...string) []byte {
// Flag operations that have taken a long time to complete
if time.Since(start) > opWarnTime {
logrus.Warnf("xtables contention detected while running [%s]: %q", strings.Join(args, " "), string(output))
}
// ignore iptables' message about xtables lock:
// it is a warning, not an error.
if strings.Contains(string(output), xLockWaitMsg) {
output = []byte("")
}
// Put further filters here if desired
Expand All @@ -436,9 +445,10 @@ func filterOutput(output []byte, args ...string) []byte {
// Raw calls 'iptables' system command, passing supplied arguments.
func Raw(args ...string) ([]byte, error) {
if firewalldRunning {
startTime := time.Now()
output, err := Passthrough(Iptables, args...)
if err == nil || !strings.Contains(err.Error(), "was not provided by any .service files") {
return filterOutput(output, args...), err
return filterOutput(startTime, output, args...), err
}
}
return raw(args...)
Expand All @@ -457,12 +467,13 @@ func raw(args ...string) ([]byte, error) {

logrus.Debugf("%s, %v", iptablesPath, args)

startTime := time.Now()
output, err := exec.Command(iptablesPath, args...).CombinedOutput()
if err != nil {
return nil, fmt.Errorf("iptables failed: iptables %v: %s (%s)", strings.Join(args, " "), output, err)
}

return filterOutput(output, args...), err
return filterOutput(startTime, output, args...), err
}

// RawCombinedOutput inernally calls the Raw function and returns a non nil
Expand Down

0 comments on commit 63b499f

Please sign in to comment.