Container filters: Avoid use of ctr.Config()

This is a very expensive function as it does a deep copy. Instead
use pre-existing accessors like ctr.CreatedTime() where they exist
and ctr.ConfigNoCopy() where not.

[NO NEW TESTS NEEDED] Just minor performance effects

Signed-off-by: Alexander Larsson <alexl@redhat.com>
This commit is contained in:
Alexander Larsson
2022-10-12 10:28:09 +02:00
parent af38c79e36
commit 03c5f9d02f

View File

@ -84,19 +84,19 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo
// - ancestor=(<image-name>[:tag]|<image-id>| ⟨image@digest⟩) - containers created from an image or a descendant. // - ancestor=(<image-name>[:tag]|<image-id>| ⟨image@digest⟩) - containers created from an image or a descendant.
return func(c *libpod.Container) bool { return func(c *libpod.Container) bool {
for _, filterValue := range filterValues { for _, filterValue := range filterValues {
containerConfig := c.Config() rootfsImageID, rootfsImageName := c.Image()
var imageTag string var imageTag string
var imageNameWithoutTag string var imageNameWithoutTag string
// Compare with ImageID, ImageName // Compare with ImageID, ImageName
// Will match ImageName if running image has tag latest for other tags exact complete filter must be given // Will match ImageName if running image has tag latest for other tags exact complete filter must be given
imageNameSlice := strings.SplitN(containerConfig.RootfsImageName, ":", 2) imageNameSlice := strings.SplitN(rootfsImageName, ":", 2)
if len(imageNameSlice) == 2 { if len(imageNameSlice) == 2 {
imageNameWithoutTag = imageNameSlice[0] imageNameWithoutTag = imageNameSlice[0]
imageTag = imageNameSlice[1] imageTag = imageNameSlice[1]
} }
if (containerConfig.RootfsImageID == filterValue) || if (rootfsImageID == filterValue) ||
(containerConfig.RootfsImageName == filterValue) || (rootfsImageName == filterValue) ||
(imageNameWithoutTag == filterValue && imageTag == "latest") { (imageNameWithoutTag == filterValue && imageTag == "latest") {
return true return true
} }
@ -110,14 +110,12 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo
if err != nil { if err != nil {
return nil, err return nil, err
} }
containerConfig := ctr.Config() if createTime.IsZero() || createTime.After(ctr.CreatedTime()) {
if createTime.IsZero() || createTime.After(containerConfig.CreatedTime) { createTime = ctr.CreatedTime()
createTime = containerConfig.CreatedTime
} }
} }
return func(c *libpod.Container) bool { return func(c *libpod.Container) bool {
cc := c.Config() return createTime.After(c.CreatedTime())
return createTime.After(cc.CreatedTime)
}, nil }, nil
case "since": case "since":
var createTime time.Time var createTime time.Time
@ -126,19 +124,17 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo
if err != nil { if err != nil {
return nil, err return nil, err
} }
containerConfig := ctr.Config() if createTime.IsZero() || createTime.After(ctr.CreatedTime()) {
if createTime.IsZero() || createTime.After(containerConfig.CreatedTime) { createTime = ctr.CreatedTime()
createTime = containerConfig.CreatedTime
} }
} }
return func(c *libpod.Container) bool { return func(c *libpod.Container) bool {
cc := c.Config() return createTime.Before(c.CreatedTime())
return createTime.Before(cc.CreatedTime)
}, nil }, nil
case "volume": case "volume":
//- volume=(<volume-name>|<mount-point-destination>) //- volume=(<volume-name>|<mount-point-destination>)
return func(c *libpod.Container) bool { return func(c *libpod.Container) bool {
containerConfig := c.Config() containerConfig := c.ConfigNoCopy()
var dest string var dest string
for _, filterValue := range filterValues { for _, filterValue := range filterValues {
arr := strings.SplitN(filterValue, ":", 2) arr := strings.SplitN(filterValue, ":", 2)