@@ -42,6 +42,7 @@ import (
4242 "github.com/containerd/containerd/plugin"
4343 "github.com/containerd/containerd/runtime/linux/runctypes"
4444 "github.com/containerd/containerd/runtime/v2/runc/options"
45+ "github.com/containerd/containerd/sys"
4546 specs "github.com/opencontainers/runtime-spec/specs-go"
4647 "github.com/pkg/errors"
4748 "golang.org/x/sys/unix"
@@ -1731,3 +1732,75 @@ func TestContainerNoSTDIN(t *testing.T) {
17311732 t .Errorf ("expected status 0 from wait but received %d" , code )
17321733 }
17331734}
1735+
1736+ func TestShimOOMScore (t * testing.T ) {
1737+ containerdPid := ctrd .cmd .Process .Pid
1738+ containerdScore , err := sys .GetOOMScoreAdj (containerdPid )
1739+ if err != nil {
1740+ t .Fatal (err )
1741+ }
1742+
1743+ client , err := newClient (t , address )
1744+ if err != nil {
1745+ t .Fatal (err )
1746+ }
1747+ defer client .Close ()
1748+
1749+ var (
1750+ image Image
1751+ ctx , cancel = testContext ()
1752+ id = t .Name ()
1753+ )
1754+ defer cancel ()
1755+
1756+ path := "/containerd/oomshim"
1757+ cg , err := cgroups .New (cgroups .V1 , cgroups .StaticPath (path ), & specs.LinuxResources {})
1758+ if err != nil {
1759+ t .Fatal (err )
1760+ }
1761+ defer cg .Delete ()
1762+
1763+ image , err = client .GetImage (ctx , testImage )
1764+ if err != nil {
1765+ t .Fatal (err )
1766+ }
1767+
1768+ container , err := client .NewContainer (ctx , id , WithNewSnapshot (id , image ), WithNewSpec (oci .WithImageConfig (image ), withProcessArgs ("sleep" , "30" )))
1769+ if err != nil {
1770+ t .Fatal (err )
1771+ }
1772+ defer container .Delete (ctx , WithSnapshotCleanup )
1773+
1774+ task , err := container .NewTask (ctx , empty (), WithShimCgroup (path ))
1775+ if err != nil {
1776+ t .Fatal (err )
1777+ }
1778+ defer task .Delete (ctx )
1779+
1780+ statusC , err := task .Wait (ctx )
1781+ if err != nil {
1782+ t .Fatal (err )
1783+ }
1784+
1785+ processes , err := cg .Processes (cgroups .Devices , false )
1786+ if err != nil {
1787+ t .Fatal (err )
1788+ }
1789+ expectedScore := containerdScore + 1
1790+ // find the shim's pid
1791+ for _ , p := range processes {
1792+ score , err := sys .GetOOMScoreAdj (p .Pid )
1793+ if err != nil {
1794+ t .Fatal (err )
1795+ }
1796+ if score != expectedScore {
1797+ t .Errorf ("expected score %d but got %d for shim process" , expectedScore , score )
1798+ }
1799+ }
1800+
1801+ if err := task .Kill (ctx , unix .SIGKILL ); err != nil {
1802+ t .Fatal (err )
1803+ }
1804+
1805+ <- statusC
1806+ }
0 commit comments