mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
inspect: Ignore character devices for IO limits
Cgroup block I/O limits cannot be applied to character devices. Ignore character devices in the inspect output. Update the API tests to use the null block device `/dev/nullb0` (if available) instead of `/dev/zero` for testing I/O limits. Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:

committed by
openshift-cherrypick-robot

parent
52eb2dcca2
commit
6bc2393df0
@ -653,7 +653,7 @@ func (c *Container) GetDevices(priv bool, ctrSpec spec.Spec, deviceNodes map[str
|
||||
for _, dev := range ctrSpec.Linux.Devices {
|
||||
key := fmt.Sprintf("%d:%d", dev.Major, dev.Minor)
|
||||
if deviceNodes == nil {
|
||||
nodes, err := util.FindDeviceNodes()
|
||||
nodes, err := util.FindDeviceNodes(false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -678,7 +678,7 @@ func blkioDeviceThrottle(deviceNodes map[string]string, devs []spec.LinuxThrottl
|
||||
for _, dev := range devs {
|
||||
key := fmt.Sprintf("%d:%d", dev.Major, dev.Minor)
|
||||
if deviceNodes == nil {
|
||||
nodes, err := util.FindDeviceNodes()
|
||||
nodes, err := util.FindDeviceNodes(true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ func (c *Container) platformInspectContainerHostConfig(ctrSpec *spec.Spec, hostC
|
||||
continue
|
||||
}
|
||||
if deviceNodes == nil {
|
||||
nodes, err := util.FindDeviceNodes()
|
||||
nodes, err := util.FindDeviceNodes(true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -33,7 +33,8 @@ func GetContainerPidInformationDescriptors() ([]string, error) {
|
||||
// [major:minor] is the device's major and minor numbers formatted as, for
|
||||
// example, 2:0 and path is the path to the device node.
|
||||
// Symlinks to nodes are ignored.
|
||||
func FindDeviceNodes() (map[string]string, error) {
|
||||
// If onlyBlockDevices is specified, character devices are ignored.
|
||||
func FindDeviceNodes(onlyBlockDevices bool) (map[string]string, error) {
|
||||
nodes := make(map[string]string)
|
||||
err := filepath.WalkDir("/dev", func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
@ -44,7 +45,13 @@ func FindDeviceNodes() (map[string]string, error) {
|
||||
}
|
||||
|
||||
// If we aren't a device node, do nothing.
|
||||
if d.Type()&(os.ModeDevice|os.ModeCharDevice) == 0 {
|
||||
if d.Type()&os.ModeDevice == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Ignore character devices, because it is not possible to set limits on them.
|
||||
// os.ModeCharDevice is usable only when os.ModeDevice is set.
|
||||
if onlyBlockDevices && d.Type()&os.ModeCharDevice != 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,6 @@ package util
|
||||
import "errors"
|
||||
|
||||
// FindDeviceNodes is not implemented anywhere except Linux.
|
||||
func FindDeviceNodes() (map[string]string, error) {
|
||||
func FindDeviceNodes(onlyBlockDevices bool) (map[string]string, error) {
|
||||
return nil, errors.New("not supported on non-Linux OSes")
|
||||
}
|
||||
|
@ -710,15 +710,15 @@ t GET libpod/containers/$cname/json 200 \
|
||||
.ImageName=$IMAGE \
|
||||
.Name=$cname
|
||||
|
||||
if root; then
|
||||
if root && test -e /dev/nullb0; then
|
||||
podman run -dt --name=updateCtr alpine
|
||||
echo '{
|
||||
"Memory":{"Limit":500000},
|
||||
"CPU":{"Shares":123},
|
||||
"DeviceReadBPs": [{ "Path": "/dev/zero", "Rate": 10485760 }],
|
||||
"DeviceWriteBPs": [{ "Path": "/dev/zero", "Rate": 31457280 }],
|
||||
"DeviceReadIOPs": [{ "Path": "/dev/zero", "Rate": 2000 }],
|
||||
"DeviceWriteIOPs": [{ "Path": "/dev/zero", "Rate": 4000 }]
|
||||
"DeviceReadBPs": [{ "Path": "/dev/nullb0", "Rate": 10485760 }],
|
||||
"DeviceWriteBPs": [{ "Path": "/dev/nullb0", "Rate": 31457280 }],
|
||||
"DeviceReadIOPs": [{ "Path": "/dev/nullb0", "Rate": 2000 }],
|
||||
"DeviceWriteIOPs": [{ "Path": "/dev/nullb0", "Rate": 4000 }]
|
||||
}' >${TMPD}/update.json
|
||||
t POST libpod/containers/updateCtr/update ${TMPD}/update.json 201
|
||||
|
||||
@ -734,25 +734,25 @@ if root; then
|
||||
|
||||
BlkioDeviceReadBps_expected='[
|
||||
{
|
||||
"Path": "/dev/zero",
|
||||
"Path": "/dev/nullb0",
|
||||
"Rate": 10485760
|
||||
}
|
||||
]'
|
||||
BlkioDeviceWriteBPs_expected='[
|
||||
{
|
||||
"Path": "/dev/zero",
|
||||
"Path": "/dev/nullb0",
|
||||
"Rate": 31457280
|
||||
}
|
||||
]'
|
||||
BlkioDeviceReadIOPs_expected='[
|
||||
{
|
||||
"Path": "/dev/zero",
|
||||
"Path": "/dev/nullb0",
|
||||
"Rate": 2000
|
||||
}
|
||||
]'
|
||||
BlkioDeviceWriteIOPs_expected='[
|
||||
{
|
||||
"Path": "/dev/zero",
|
||||
"Path": "/dev/nullb0",
|
||||
"Rate": 4000
|
||||
}
|
||||
]'
|
||||
|
Reference in New Issue
Block a user