Worker pool can be full while retrieving tags

This commit is contained in:
CrazyMax
2019-07-01 01:56:49 +02:00
parent d741ae3371
commit e9e528222f
3 changed files with 45 additions and 47 deletions

View File

@@ -1,5 +1,9 @@
# Changelog
## 1.0.2 (2019/07/01)
* Worker pool can be full while retrieving tags
## 1.0.1 (2019/07/01)
* Fix runtime error

View File

@@ -94,10 +94,6 @@ func (di *Diun) Run() {
if err != nil {
log.Error().Err(err).Msg("Job image error")
}
err = di.imageRepoJob(t)
if err != nil {
log.Error().Err(err).Msg("Job image repo error")
}
}
di.wg.Done()
})

View File

@@ -12,7 +12,6 @@ import (
)
type imageJob struct {
origin bool
image model.Image
registry *docker.RegistryClient
}
@@ -33,15 +32,55 @@ func (di *Diun) procImages() {
continue
}
image, err := registry.ParseImage(img.Name)
if err != nil {
log.Error().Err(err).Str("image", img.Name).Msg("Cannot parse image")
continue
}
di.wg.Add(1)
err = di.pool.Invoke(imageJob{
origin: true,
image: img,
registry: reg,
})
if err != nil {
log.Error().Err(err).Msgf("Invoking image job")
}
if !img.WatchRepo || image.Domain == "" {
continue
}
tags, err := reg.Tags(docker.TagsOptions{
Image: image,
Max: img.MaxTags,
Include: img.IncludeTags,
Exclude: img.ExcludeTags,
})
if err != nil {
log.Error().Err(err).Str("image", image.String()).Msg("Cannot retrieve tags")
continue
}
log.Debug().Str("image", image.String()).Msgf("%d tag(s) found in repository. %d will be analyzed (%d max, %d not included, %d excluded).",
tags.Total,
len(tags.List),
img.MaxTags,
tags.NotIncluded,
tags.Excluded,
)
for _, tag := range tags.List {
img.Name = fmt.Sprintf("%s/%s:%s", image.Domain, image.Path, tag)
di.wg.Add(1)
err = di.pool.Invoke(imageJob{
image: img,
registry: reg,
})
if err != nil {
log.Error().Err(err).Msgf("Invoking image job (tag)")
}
}
}
}
@@ -96,44 +135,3 @@ func (di *Diun) imageJob(job imageJob) error {
return nil
}
func (di *Diun) imageRepoJob(job imageJob) error {
image, err := registry.ParseImage(job.image.Name)
if err != nil {
return err
}
if !job.origin || image.Domain == "" || !job.image.WatchRepo {
return nil
}
tags, err := job.registry.Tags(docker.TagsOptions{
Image: image,
Max: job.image.MaxTags,
Include: job.image.IncludeTags,
Exclude: job.image.ExcludeTags,
})
if err != nil {
return err
}
log.Debug().Str("image", image.String()).Msgf("%d tag(s) found in repository. %d will be analyzed (%d max, %d not included, %d excluded).",
tags.Total,
len(tags.List),
job.image.MaxTags,
tags.NotIncluded,
tags.Excluded,
)
job.origin = false
for _, tag := range tags.List {
job.image.Name = fmt.Sprintf("%s/%s:%s", image.Domain, image.Path, tag)
di.wg.Add(1)
err = di.pool.Invoke(job)
if err != nil {
log.Error().Err(err).Msgf("Invoking repo image job")
}
}
return nil
}