Use imageStore.Children instead of whole the Map
daemon cache was getting the whole image map and then iterating through it to find children. This information is already stored in the image store. Prior to this change building the docker repo with a full cache took 30 seconds. After it takes between 15 seconds or less (As low as 9 seconds). This is an improvement on docker 1.9.1 which hovered around 17 seconds. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
parent
b04d424bf8
commit
fcad2d9384
1 changed files with 31 additions and 21 deletions
|
@ -1294,29 +1294,22 @@ func (daemon *Daemon) GetRemappedUIDGID() (int, int) {
|
||||||
return uid, gid
|
return uid, gid
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageGetCached returns the earliest created image that is a child
|
// ImageGetCached returns the most recent created image that is a child
|
||||||
// of the image with imgID, that had the same config when it was
|
// of the image with imgID, that had the same config when it was
|
||||||
// created. nil is returned if a child cannot be found. An error is
|
// created. nil is returned if a child cannot be found. An error is
|
||||||
// returned if the parent image cannot be found.
|
// returned if the parent image cannot be found.
|
||||||
func (daemon *Daemon) ImageGetCached(imgID image.ID, config *containertypes.Config) (*image.Image, error) {
|
func (daemon *Daemon) ImageGetCached(imgID image.ID, config *containertypes.Config) (*image.Image, error) {
|
||||||
// Retrieve all images
|
|
||||||
imgs := daemon.Map()
|
|
||||||
|
|
||||||
var siblings []image.ID
|
|
||||||
for id, img := range imgs {
|
|
||||||
if img.Parent == imgID {
|
|
||||||
siblings = append(siblings, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop on the children of the given image and check the config
|
// Loop on the children of the given image and check the config
|
||||||
|
getMatch := func(siblings []image.ID) (*image.Image, error) {
|
||||||
var match *image.Image
|
var match *image.Image
|
||||||
for _, id := range siblings {
|
for _, id := range siblings {
|
||||||
img, ok := imgs[id]
|
img, err := daemon.imageStore.Get(id)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to find image %q", id)
|
return nil, fmt.Errorf("unable to find image %q", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
if runconfig.Compare(&img.ContainerConfig, config) {
|
if runconfig.Compare(&img.ContainerConfig, config) {
|
||||||
|
// check for the most up to date match
|
||||||
if match == nil || match.Created.Before(img.Created) {
|
if match == nil || match.Created.Before(img.Created) {
|
||||||
match = img
|
match = img
|
||||||
}
|
}
|
||||||
|
@ -1325,6 +1318,23 @@ func (daemon *Daemon) ImageGetCached(imgID image.ID, config *containertypes.Conf
|
||||||
return match, nil
|
return match, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In this case, this is `FROM scratch`, which isn't an actual image.
|
||||||
|
if imgID == "" {
|
||||||
|
images := daemon.imageStore.Map()
|
||||||
|
var siblings []image.ID
|
||||||
|
for id, img := range images {
|
||||||
|
if img.Parent == imgID {
|
||||||
|
siblings = append(siblings, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getMatch(siblings)
|
||||||
|
}
|
||||||
|
|
||||||
|
// find match from child images
|
||||||
|
siblings := daemon.imageStore.Children(imgID)
|
||||||
|
return getMatch(siblings)
|
||||||
|
}
|
||||||
|
|
||||||
// tempDir returns the default directory to use for temporary files.
|
// tempDir returns the default directory to use for temporary files.
|
||||||
func tempDir(rootDir string, rootUID, rootGID int) (string, error) {
|
func tempDir(rootDir string, rootUID, rootGID int) (string, error) {
|
||||||
var tmpDir string
|
var tmpDir string
|
||||||
|
|
Loading…
Add table
Reference in a new issue