mirror of
https://github.com/containers/podman.git
synced 2025-06-30 15:49:03 +08:00
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:
@ -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)
|
||||||
|
Reference in New Issue
Block a user