From 03c5f9d02f9301923f103ead740e6a009b4879c0 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 12 Oct 2022 10:28:09 +0200 Subject: [PATCH] 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 --- pkg/domain/filters/containers.go | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/pkg/domain/filters/containers.go b/pkg/domain/filters/containers.go index de62b65824..917f5d61bf 100644 --- a/pkg/domain/filters/containers.go +++ b/pkg/domain/filters/containers.go @@ -84,19 +84,19 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo // - ancestor=([:tag]|| ⟨image@digest⟩) - containers created from an image or a descendant. return func(c *libpod.Container) bool { for _, filterValue := range filterValues { - containerConfig := c.Config() + rootfsImageID, rootfsImageName := c.Image() var imageTag string var imageNameWithoutTag string // Compare with ImageID, ImageName // 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 { imageNameWithoutTag = imageNameSlice[0] imageTag = imageNameSlice[1] } - if (containerConfig.RootfsImageID == filterValue) || - (containerConfig.RootfsImageName == filterValue) || + if (rootfsImageID == filterValue) || + (rootfsImageName == filterValue) || (imageNameWithoutTag == filterValue && imageTag == "latest") { return true } @@ -110,14 +110,12 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo if err != nil { return nil, err } - containerConfig := ctr.Config() - if createTime.IsZero() || createTime.After(containerConfig.CreatedTime) { - createTime = containerConfig.CreatedTime + if createTime.IsZero() || createTime.After(ctr.CreatedTime()) { + createTime = ctr.CreatedTime() } } return func(c *libpod.Container) bool { - cc := c.Config() - return createTime.After(cc.CreatedTime) + return createTime.After(c.CreatedTime()) }, nil case "since": var createTime time.Time @@ -126,19 +124,17 @@ func GenerateContainerFilterFuncs(filter string, filterValues []string, r *libpo if err != nil { return nil, err } - containerConfig := ctr.Config() - if createTime.IsZero() || createTime.After(containerConfig.CreatedTime) { - createTime = containerConfig.CreatedTime + if createTime.IsZero() || createTime.After(ctr.CreatedTime()) { + createTime = ctr.CreatedTime() } } return func(c *libpod.Container) bool { - cc := c.Config() - return createTime.Before(cc.CreatedTime) + return createTime.Before(c.CreatedTime()) }, nil case "volume": //- volume=(|) return func(c *libpod.Container) bool { - containerConfig := c.Config() + containerConfig := c.ConfigNoCopy() var dest string for _, filterValue := range filterValues { arr := strings.SplitN(filterValue, ":", 2)