With THP 'always' journald's mmapped journal files sit in 2 MiB folios, so each small journal write dirties and writes back 2 MiB; on the control node that saturated the root mirror holding the bus store and the store, and the controller lost its lease. The module sets the mode from a per-machine setting (default always, the kernel's own, so assigning it changes nothing until a machine sets madvise), verifies it took, rotates the journal once so new files are mapped under the new mode, gives back what it found when stopped, and serves kernel_huge_pages to measure file_thp per unit.
80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
type resource map[string]any
|
|
|
|
type manifestShape struct {
|
|
Module string `json:"module"`
|
|
Capabilities []string `json:"capabilities"`
|
|
Settings map[string]map[string]any `json:"settings"`
|
|
Tools []string `json:"tools"`
|
|
Resources []resource `json:"resources"`
|
|
Build struct {
|
|
Artifacts []map[string]any `json:"artifacts"`
|
|
} `json:"build"`
|
|
}
|
|
|
|
func manifest(t *testing.T) manifestShape {
|
|
t.Helper()
|
|
raw, err := os.ReadFile("../../module.json")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var m manifestShape
|
|
if err := json.Unmarshal(raw, &m); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return m
|
|
}
|
|
|
|
func (m manifestShape) resource(t *testing.T, id string) resource {
|
|
t.Helper()
|
|
for _, r := range m.Resources {
|
|
if r["id"] == id {
|
|
return r
|
|
}
|
|
}
|
|
t.Fatalf("no resource %s", id)
|
|
return nil
|
|
}
|
|
|
|
// TestToolsAreTheManifests holds the served tools and the manifest's list to one another, and the
|
|
// bundle to the shape the builder compiles and the runtime loads.
|
|
func TestToolsAreTheManifests(t *testing.T) {
|
|
m := manifest(t)
|
|
names := map[string]bool{}
|
|
for _, tool := range tools(&Machine{Root: t.TempDir()}) {
|
|
if names[tool.Name] {
|
|
t.Errorf("%s is served twice", tool.Name)
|
|
}
|
|
names[tool.Name] = true
|
|
}
|
|
for _, want := range m.Tools {
|
|
if !names[want] {
|
|
t.Errorf("the manifest lists %s and the bundle does not serve it", want)
|
|
}
|
|
delete(names, want)
|
|
}
|
|
if len(names) != 0 {
|
|
t.Errorf("served and not listed: %v", names)
|
|
}
|
|
var tools map[string]any
|
|
for _, a := range m.Build.Artifacts {
|
|
if a["name"] == "tools" {
|
|
tools = a
|
|
}
|
|
}
|
|
if tools == nil || tools["kind"] != "bundle" || tools["language"] != "go" || tools["system"] != "arch" ||
|
|
tools["from"] != "cmd/"+binaryName || tools["binary"] != binaryName {
|
|
t.Fatalf("the tools artifact: %v", tools)
|
|
}
|
|
if loads, _ := tools["loads"].([]any); len(loads) != 1 || loads[0] != binaryName {
|
|
t.Fatalf("loads: %v", tools["loads"])
|
|
}
|
|
}
|