proc walker: optimize readLimits

This commit is contained in:
Alban Crequy
2017-04-25 12:05:29 +02:00
parent bdb09f5f9d
commit 3a8a09a606
2 changed files with 25 additions and 12 deletions

View File

@@ -2,7 +2,6 @@ package process
import (
"bytes"
"fmt"
"os"
"path"
"strconv"
@@ -99,17 +98,31 @@ func readLimits(path string) (openFilesLimit uint64, err error) {
if err != nil {
return 0, err
}
for _, line := range strings.Split(string(buf), "\n") {
if strings.HasPrefix(line, "Max open files") {
splits := strings.Fields(line)
if len(splits) < 6 {
return 0, fmt.Errorf("Invalid /proc/PID/limits")
}
openFilesLimit, err := strconv.Atoi(splits[3])
return uint64(openFilesLimit), err
}
content := string(buf)
// File format: one line header + one line per limit
//
// Limit Soft Limit Hard Limit Units
// ...
// Max open files 1024 4096 files
// ...
delim := "\nMax open files"
pos := strings.Index(content, delim)
if pos < 0 {
// Tests such as TestWalker can synthetise empty files
return 0, nil
}
return 0, nil
pos += len(delim)
for pos < len(content) && content[pos] == ' ' {
pos++
}
var softLimit uint64
softLimit = parseUint64WithSpaces(&buf, &pos)
return softLimit, nil
}
// Walk walks the supplied directory (expecting it to look like /proc)

View File

@@ -23,7 +23,7 @@ var mockFS = fs.Dir("",
},
fs.File{
FName: "limits",
FContents: `Max open files 32768 65536 files`,
FContents: "Limit Soft-Limit Hard-Limit Units\nMax open files 32768 65536 files",
},
fs.Dir("fd", fs.File{FName: "0"}, fs.File{FName: "1"}, fs.File{FName: "2"}),
),