Skip to content

Commit f25315b

Browse files
committed
Do not collect repositories before pruning
Signed-off-by: Gladkov Alexey <[email protected]>
1 parent a85c7b0 commit f25315b

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

pkg/dockerregistry/server/prune/prune.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,29 @@ func (l *repoLayersPruner) Prune(ctx context.Context) error {
5858
return nil
5959
}
6060

61+
type repoPruner struct {
62+
storageDriver driver.StorageDriver
63+
name string
64+
}
65+
66+
func (r *repoPruner) Prune(ctx context.Context) error {
67+
if len(r.name) == 0 {
68+
return nil
69+
}
70+
71+
logger := context.GetLogger(ctx)
72+
vacuum := storage.NewVacuum(ctx, r.storageDriver)
73+
74+
logger.Debugln("Removing %s repository", r.name)
75+
if err := vacuum.RemoveRepository(r.name); err != nil {
76+
return fmt.Errorf("unable to remove the repository %s: %v", r.name, err)
77+
}
78+
79+
r.name = ""
80+
81+
return nil
82+
}
83+
6184
// Prune removes blobs which are not used by Images in OpenShift.
6285
//
6386
// On error, the Summary will contain what was deleted so far.
@@ -107,13 +130,18 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
107130
var stats Summary
108131

109132
layersPruner := &repoLayersPruner{}
133+
repoPruner := &repoPruner{
134+
storageDriver: storageDriver,
135+
}
110136

111-
var reposToDelete []string
112137
err = repositoryEnumerator.Enumerate(ctx, func(repoName string) error {
113138
if !dryRun {
114139
if err := layersPruner.Prune(ctx); err != nil {
115140
return err
116141
}
142+
if err := repoPruner.Prune(ctx); err != nil {
143+
return err
144+
}
117145
}
118146

119147
logger.Debugln("Processing repository", repoName)
@@ -132,8 +160,12 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
132160
if kerrors.IsNotFound(err) {
133161
logger.Printf("The image stream %s/%s is not found, will remove the whole repository", ref.Namespace, ref.Name)
134162

135-
// We cannot delete the repository at this point, because it would break Enumerate.
136-
reposToDelete = append(reposToDelete, repoName)
163+
if !dryRun {
164+
// We cannot delete the repository at this point, because it would break Enumerate.
165+
repoPruner.name = repoName
166+
} else {
167+
logger.Printf("Would delete repository: %s", repoName)
168+
}
137169

138170
return nil
139171
} else if err != nil {
@@ -190,21 +222,12 @@ func Prune(ctx context.Context, storageDriver driver.StorageDriver, registry dis
190222
if err := layersPruner.Prune(ctx); err != nil {
191223
return stats, err
192224
}
225+
if err := repoPruner.Prune(ctx); err != nil {
226+
return stats, err
227+
}
193228

194229
vacuum := storage.NewVacuum(ctx, storageDriver)
195230

196-
logger.Debugln("Removing repositories")
197-
for _, repoName := range reposToDelete {
198-
if dryRun {
199-
logger.Printf("Would delete repository: %s", repoName)
200-
continue
201-
}
202-
203-
if err = vacuum.RemoveRepository(repoName); err != nil {
204-
return stats, fmt.Errorf("unable to remove the repository %s: %v", repoName, err)
205-
}
206-
}
207-
208231
logger.Debugln("Processing blobs")
209232
blobStatter := registry.BlobStatter()
210233
err = registry.Blobs().Enumerate(ctx, func(dgst digest.Digest) error {

0 commit comments

Comments
 (0)