Skip to content

Commit 7d386bb

Browse files
committed
Read /dev/kmsg in non-block mode
1 parent 1e5254d commit 7d386bb

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

pkg/checkers/oom/oom.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package oom
22

33
import (
44
"bufio"
5+
"errors"
56
"fmt"
7+
"io"
68
"os"
79
"regexp"
810
"strings"
11+
"syscall"
912

1013
"github.com/Azure/kdebug/pkg/base"
1114
)
@@ -83,15 +86,38 @@ func (c *OOMChecker) checkOOM(ctx *base.CheckContext) (*base.CheckResult, error)
8386
}
8487
return result, nil
8588
}
89+
90+
type nonBlockReader struct {
91+
fd int
92+
}
93+
94+
func (r *nonBlockReader) Read(buf []byte) (n int, err error) {
95+
n, err = syscall.Read(r.fd, buf)
96+
if err != nil {
97+
if errors.Is(err, syscall.EAGAIN) {
98+
return 0, io.EOF
99+
}
100+
}
101+
if n == 0 && err == nil {
102+
return 0, io.EOF
103+
}
104+
return n, err
105+
}
106+
86107
func (c *OOMChecker) getAndParseOOMLog() ([]string, error) {
87108
file, err := os.Open(c.kernLogPath)
88109
if err != nil {
89110
return nil, err
90111
}
91112
defer file.Close()
92113

114+
fd := int(file.Fd())
115+
if err = syscall.SetNonblock(fd, true); err != nil {
116+
return nil, fmt.Errorf("Fail to read in non-block mode: %s", err)
117+
}
118+
93119
var oomInfos []string
94-
scanner := bufio.NewScanner(file)
120+
scanner := bufio.NewScanner(&nonBlockReader{fd})
95121
for scanner.Scan() {
96122
tmp := scanner.Text()
97123
//todo: more sophisticated OOM context

pkg/checkers/oom/oom_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,12 @@ func TestCheckOOMLogWhenOOM(t *testing.T) {
3333
if err != nil {
3434
t.Errorf("Create tmp file error:%v", err)
3535
}
36-
result, _ := check.Check(&base.CheckContext{
36+
result, err := check.Check(&base.CheckContext{
3737
Environment: environment,
3838
})
39+
if err != nil {
40+
t.Errorf("Expect no error but got: %s", err)
41+
}
3942
if len(result) != 1 {
4043
t.Errorf("Get unexpected OOM result length %v", len(result))
4144
}

0 commit comments

Comments
 (0)