mirror of
https://github.com/project-zot/zot.git
synced 2026-06-19 05:57:57 +08:00
fix: GetNextRepository to use a list already scanned repositories as input (#3230)
Using just the last repository is not enough as in the case when it is deleted (either by GC or some other way), GetNextRepository returns empty string causing the generator to be marked completed without any errors. An alternative would have been to start over from the first repository, but this can take hours if multiple repositories need to be deleted, not to mention the processing power and I/O and S3 load this could take. Signed-off-by: Andrei Aaron <aaaron@luxoft.com>
This commit is contained in:
@@ -988,15 +988,28 @@ func (dt *dedupeTask) Name() string {
|
||||
return "DedupeTask"
|
||||
}
|
||||
|
||||
func NewStorageMetricsInitGenerator(imgStore storageTypes.ImageStore, metrics monitoring.MetricServer, log zlog.Logger,
|
||||
) *StorageMetricsInitGenerator {
|
||||
processedRepos := make(map[string]struct{})
|
||||
|
||||
return &StorageMetricsInitGenerator{
|
||||
ImgStore: imgStore,
|
||||
Metrics: metrics,
|
||||
Log: log,
|
||||
processedRepos: processedRepos,
|
||||
MaxDelay: 15, //nolint:mnd
|
||||
}
|
||||
}
|
||||
|
||||
type StorageMetricsInitGenerator struct {
|
||||
ImgStore storageTypes.ImageStore
|
||||
done bool
|
||||
Metrics monitoring.MetricServer
|
||||
lastRepo string
|
||||
nextRun time.Time
|
||||
rand *rand.Rand
|
||||
Log zlog.Logger
|
||||
MaxDelay int
|
||||
ImgStore storageTypes.ImageStore
|
||||
done bool
|
||||
Metrics monitoring.MetricServer
|
||||
processedRepos map[string]struct{}
|
||||
nextRun time.Time
|
||||
rand *rand.Rand
|
||||
Log zlog.Logger
|
||||
MaxDelay int
|
||||
}
|
||||
|
||||
func (gen *StorageMetricsInitGenerator) Name() string {
|
||||
@@ -1004,7 +1017,7 @@ func (gen *StorageMetricsInitGenerator) Name() string {
|
||||
}
|
||||
|
||||
func (gen *StorageMetricsInitGenerator) Next() (scheduler.Task, error) {
|
||||
if gen.lastRepo == "" && gen.nextRun.IsZero() {
|
||||
if len(gen.processedRepos) == 0 && gen.nextRun.IsZero() {
|
||||
gen.rand = rand.New(rand.NewSource(time.Now().UTC().UnixNano())) //nolint: gosec
|
||||
}
|
||||
|
||||
@@ -1012,7 +1025,7 @@ func (gen *StorageMetricsInitGenerator) Next() (scheduler.Task, error) {
|
||||
|
||||
gen.nextRun = time.Now().Add(time.Duration(delay) * time.Second)
|
||||
|
||||
repo, err := gen.ImgStore.GetNextRepository(gen.lastRepo)
|
||||
repo, err := gen.ImgStore.GetNextRepository(gen.processedRepos)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1025,7 +1038,7 @@ func (gen *StorageMetricsInitGenerator) Next() (scheduler.Task, error) {
|
||||
return nil, nil //nolint:nilnil
|
||||
}
|
||||
|
||||
gen.lastRepo = repo
|
||||
gen.processedRepos[repo] = struct{}{}
|
||||
|
||||
return NewStorageMetricsTask(gen.ImgStore, gen.Metrics, repo, gen.Log), nil
|
||||
}
|
||||
@@ -1039,7 +1052,7 @@ func (gen *StorageMetricsInitGenerator) IsReady() bool {
|
||||
}
|
||||
|
||||
func (gen *StorageMetricsInitGenerator) Reset() {
|
||||
gen.lastRepo = ""
|
||||
gen.processedRepos = make(map[string]struct{})
|
||||
gen.done = false
|
||||
gen.nextRun = time.Time{}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user