Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 52 additions & 6 deletions gotests/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,25 @@ func parseOSRelease(content string) int {
return -1
}

func IsDebianFlavor() bool {
data, err := os.ReadFile("/etc/os-release")
if err != nil {
return false
}

for _, line := range strings.Split(string(data), "\n") {
if !strings.HasPrefix(line, "ID=") {
continue
}

value := strings.TrimSpace(strings.TrimPrefix(line, "ID="))
value = strings.Trim(value, "\"'")
return value == "debian"
}

return false
}

func parseRedHatRelease(release string) int {
major := 0
minor := -1
Expand Down Expand Up @@ -724,6 +743,30 @@ func modeSuffix(bufferMode bool, arenaMode bool) string {
return ""
}

func effectiveModeFlags(moduleName string, kernelVersion int, isDebian bool, bufferMode bool, arenaMode bool) (bool, bool) {
if bufferMode || arenaMode {
return bufferMode, arenaMode
}

if moduleName == "cachestat" {
if kernelVersion >= netdataEBPFKernel510 {
return true, false
}

return false, false
}

if moduleHasArena(moduleName) && kernelVersion >= netdataEBPFKernel612 && !isDebian {
return false, true
}

if moduleHasBuffer(moduleName) && kernelVersion >= netdataEBPFKernel510 {
return true, false
}

return false, false
}

func candidateMatches(filename string, moduleName string, isReturn bool, version string, rhfVersion int, bufferMode bool, arenaMode bool) bool {
prefix := fmt.Sprintf("%cnetdata_ebpf_%s%s.", map[bool]rune{true: 'r', false: 'p'}[isReturn], moduleName, modeSuffix(bufferMode, arenaMode))
if !strings.HasPrefix(filename, prefix) || !strings.HasSuffix(filename, ".o") {
Expand Down Expand Up @@ -1050,29 +1093,32 @@ func moduleHasArena(name string) bool {

func runNetdataTests(w io.Writer, rhfVersion int, kernelVersion int, isReturn bool, opts options, nprocesses int) {
supportedMapTypes := detectSupportedMapTypes(rhfVersion, kernelVersion)
isDebian := IsDebianFlavor()

for _, mod := range ebpfModules {
bufferMode, arenaMode := effectiveModeFlags(mod.name, kernelVersion, isDebian, opts.bufferMode, opts.arenaMode)

if opts.flags&mod.flags == 0 {
continue
}

if opts.arenaMode && !moduleHasArena(mod.name) {
if arenaMode && !moduleHasArena(mod.name) {
continue
}

if opts.bufferMode && !moduleHasBuffer(mod.name) {
if bufferMode && !moduleHasBuffer(mod.name) {
continue
}

kernels := mod.kernels
if opts.arenaMode && mod.arenaKernels != 0 {
if arenaMode && mod.arenaKernels != 0 {
kernels = mod.arenaKernels
} else if opts.bufferMode && mod.bufferKernels != 0 {
} else if bufferMode && mod.bufferKernels != 0 {
kernels = mod.bufferKernels
}
maxIndex := selectMaxIndex(rhfVersion, kernelVersion)
idx := selectIndex(kernels, rhfVersion, kernelVersion)
candidates := discoverCandidates(mod.name, isReturn, rhfVersion, kernels, maxIndex, opts.netdataPath, opts.bufferMode, opts.arenaMode)
candidates := discoverCandidates(mod.name, isReturn, rhfVersion, kernels, maxIndex, opts.netdataPath, bufferMode, arenaMode)
compatible, incompatible, unsupportedType := filterCompatibleCandidates(candidates, supportedMapTypes)

if len(compatible) == 0 {
Expand All @@ -1083,7 +1129,7 @@ func runNetdataTests(w io.Writer, rhfVersion int, kernelVersion int, isReturn bo
continue
}

compatible = []string{mountName(idx, mod.name, isReturn, rhfVersion, opts.netdataPath, opts.bufferMode, opts.arenaMode)}
compatible = []string{mountName(idx, mod.name, isReturn, rhfVersion, opts.netdataPath, bufferMode, arenaMode)}
}

for _, filename := range compatible {
Expand Down
98 changes: 83 additions & 15 deletions gotests/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ VERSION_ID="12"
want: -1,
},
{
name: "empty content",
name: "empty content",
content: ``,
want: -1,
},
Expand Down Expand Up @@ -763,6 +763,74 @@ func TestModeSuffix(t *testing.T) {
}
}

func TestEffectiveModeFlags(t *testing.T) {
tests := map[string]struct {
module string
kernelVersion int
isDebian bool
bufferMode bool
arenaMode bool
wantBuffer bool
wantArena bool
}{
"cachestat-defaults-to-buffer-on-supported-kernel": {
module: "cachestat",
kernelVersion: netdataEBPFKernel510,
wantBuffer: true,
wantArena: false,
},
"process-defaults-to-arena-on-6-12-nondebian": {
module: "process",
kernelVersion: netdataEBPFKernel612,
wantBuffer: false,
wantArena: true,
},
"process-stays-buffer-on-debian": {
module: "process",
kernelVersion: netdataEBPFKernel612,
isDebian: true,
wantBuffer: true,
wantArena: false,
},
"cachestat-keeps-tracing-before-buffer-support": {
module: "cachestat",
kernelVersion: netdataEBPFKernel414,
wantBuffer: false,
wantArena: false,
},
"explicit-buffer-stays-buffer": {
module: "cachestat",
kernelVersion: netdataEBPFKernel612,
bufferMode: true,
wantBuffer: true,
wantArena: false,
},
"explicit-arena-wins": {
module: "cachestat",
kernelVersion: netdataEBPFKernel612,
bufferMode: true,
arenaMode: true,
wantBuffer: true,
wantArena: true,
},
"other-modules-unaffected": {
module: "swap",
kernelVersion: netdataEBPFKernel612,
wantBuffer: false,
wantArena: true,
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
gotBuffer, gotArena := effectiveModeFlags(tc.module, tc.kernelVersion, tc.isDebian, tc.bufferMode, tc.arenaMode)
if gotBuffer != tc.wantBuffer || gotArena != tc.wantArena {
t.Fatalf("effectiveModeFlags() = (%v, %v), want (%v, %v)", gotBuffer, gotArena, tc.wantBuffer, tc.wantArena)
}
})
}
}

func TestModuleModeLookup(t *testing.T) {
bufferArenaModules := []string{"cachestat", "dc", "fd", "oomkill", "process", "shm", "swap", "vfs", "dns", "socket"}
for _, name := range bufferArenaModules {
Expand Down Expand Up @@ -896,45 +964,45 @@ func TestCandidateVersionIndex(t *testing.T) {
wantIndex int
}{
{
name: "rhf 5.14 matches at index 7",
name: "rhf 5.14 matches at index 7",
filename: "pnetdata_ebpf_swap.5.14.rhf.o",
module: "swap", rhf: 1, kernels: netdataV514, maxIndex: 7,
module: "swap", rhf: 1, kernels: netdataV514, maxIndex: 7,
wantIndex: 7,
},
{
name: "non-rhf masks out V514",
name: "non-rhf masks out V514",
filename: "pnetdata_ebpf_swap.5.14.rhf.o",
module: "swap", rhf: -1, kernels: netdataV514, maxIndex: 10,
module: "swap", rhf: -1, kernels: netdataV514, maxIndex: 10,
wantIndex: -1,
},
{
name: "non-rhf 6.8 matches at index 10",
name: "non-rhf 6.8 matches at index 10",
filename: "pnetdata_ebpf_swap.6.8.o",
module: "swap", rhf: -1, kernels: netdataV68, maxIndex: 10,
module: "swap", rhf: -1, kernels: netdataV68, maxIndex: 10,
wantIndex: 10,
},
{
name: "picks file version from multi-version kernel set",
name: "picks file version from multi-version kernel set",
filename: "pnetdata_ebpf_swap.5.4.o",
module: "swap", rhf: -1, kernels: netdataV54 | netdataV68, maxIndex: 10,
module: "swap", rhf: -1, kernels: netdataV54 | netdataV68, maxIndex: 10,
wantIndex: 4,
},
{
name: "wrong module name returns -1",
name: "wrong module name returns -1",
filename: "pnetdata_ebpf_process.6.8.o",
module: "swap", rhf: -1, kernels: netdataV68, maxIndex: 10,
module: "swap", rhf: -1, kernels: netdataV68, maxIndex: 10,
wantIndex: -1,
},
{
name: "arena file matches with arenaMode enabled",
name: "arena file matches with arenaMode enabled",
filename: "pnetdata_ebpf_swap_arena.6.12.o",
module: "swap", rhf: -1, kernels: netdataV612, maxIndex: 11, arenaMode: true,
module: "swap", rhf: -1, kernels: netdataV612, maxIndex: 11, arenaMode: true,
wantIndex: 11,
},
{
name: "arena file rejected without arenaMode",
name: "arena file rejected without arenaMode",
filename: "pnetdata_ebpf_swap_arena.6.12.o",
module: "swap", rhf: -1, kernels: netdataV612, maxIndex: 11, arenaMode: false,
module: "swap", rhf: -1, kernels: netdataV612, maxIndex: 11, arenaMode: false,
wantIndex: -1,
},
}
Expand Down
Loading