@@ -33,78 +33,68 @@ func CleanupTask(ctx context.Context, olderThan time.Duration) error {
3333 return CleanupExpiredData (ctx , olderThan )
3434}
3535
36- func ExecuteCleanupRules (outerCtx context.Context ) error {
37- ctx , committer , err := db .TxContext (outerCtx )
38- if err != nil {
39- return err
40- }
41- defer committer .Close ()
42-
43- err = packages_model .IterateEnabledCleanupRules (ctx , func (ctx context.Context , pcr * packages_model.PackageCleanupRule ) error {
44- select {
45- case <- outerCtx .Done ():
46- return db .ErrCancelledf ("While processing package cleanup rules" )
47- default :
48- }
49-
50- versionsToRemove , err := GetCleanupTargets (ctx , pcr , true )
51- if err != nil {
52- return fmt .Errorf ("CleanupRule [%d]: GetCleanupTargets failed: %w" , pcr .ID , err )
53- }
54-
55- anyVersionDeleted := false
56- packageWithVersionDeleted := make (map [int64 ]bool ) // set of Package.ID's where at least one package version was removed
57- for _ , ct := range versionsToRemove {
58- if err := packages_service .DeletePackageVersionAndReferences (ctx , ct .PackageVersion ); err != nil {
59- return fmt .Errorf ("CleanupRule [%d]: DeletePackageVersionAndReferences failed: %w" , pcr .ID , err )
36+ func ExecuteCleanupRules (ctx context.Context ) error {
37+ return packages_model .IterateEnabledCleanupRules (ctx , func (ctx context.Context , pcr * packages_model.PackageCleanupRule ) error {
38+ // We have no errors to retry on, because we have no evidence we need any in
39+ // this area. What we do retry on is when a nested `db.RetryTx` indicates to
40+ // retry the whole transaction.
41+ return db .RetryTx (ctx , db.RetryConfig {
42+ AttemptCount : 3 ,
43+ }, func (ctx context.Context ) error {
44+ versionsToRemove , err := GetCleanupTargets (ctx , pcr , true )
45+ if err != nil {
46+ return fmt .Errorf ("CleanupRule [%d]: GetCleanupTargets failed: %w" , pcr .ID , err )
6047 }
61- packageWithVersionDeleted [ct .Package .ID ] = true
62- anyVersionDeleted = true
63- }
6448
65- if pcr .Type == packages_model .TypeCargo {
66- for packageID := range packageWithVersionDeleted {
67- owner , err := user_model .GetUserByID (ctx , pcr .OwnerID )
68- if err != nil {
69- return fmt .Errorf ("GetUserByID failed: %w" , err )
70- }
71- if err := cargo_service .UpdatePackageIndexIfExists (ctx , owner , owner , packageID ); err != nil {
72- return fmt .Errorf ("CleanupRule [%d]: cargo.UpdatePackageIndexIfExists failed: %w" , pcr .ID , err )
49+ anyVersionDeleted := false
50+ packageWithVersionDeleted := make (map [int64 ]bool ) // set of Package.ID's where at least one package version was removed
51+ for _ , ct := range versionsToRemove {
52+ if err := packages_service .DeletePackageVersionAndReferences (ctx , ct .PackageVersion ); err != nil {
53+ return fmt .Errorf ("CleanupRule [%d]: DeletePackageVersionAndReferences failed: %w" , pcr .ID , err )
7354 }
55+ packageWithVersionDeleted [ct .Package .ID ] = true
56+ anyVersionDeleted = true
7457 }
75- }
7658
77- if anyVersionDeleted {
78- switch pcr .Type {
79- case packages_model .TypeDebian :
80- if err := debian_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
81- return fmt .Errorf ("CleanupRule [%d]: debian.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
82- }
83- case packages_model .TypeAlpine :
84- if err := alpine_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
85- return fmt .Errorf ("CleanupRule [%d]: alpine.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
86- }
87- case packages_model .TypeRpm :
88- if err := rpm_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
89- return fmt .Errorf ("CleanupRule [%d]: rpm.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
59+ if pcr .Type == packages_model .TypeCargo {
60+ for packageID := range packageWithVersionDeleted {
61+ owner , err := user_model .GetUserByID (ctx , pcr .OwnerID )
62+ if err != nil {
63+ return fmt .Errorf ("GetUserByID failed: %w" , err )
64+ }
65+ if err := cargo_service .UpdatePackageIndexIfExists (ctx , owner , owner , packageID ); err != nil {
66+ return fmt .Errorf ("CleanupRule [%d]: cargo.UpdatePackageIndexIfExists failed: %w" , pcr .ID , err )
67+ }
9068 }
91- case packages_model .TypeArch :
92- if err := arch_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
93- return fmt .Errorf ("CleanupRule [%d]: arch.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
94- }
95- case packages_model .TypeAlt :
96- if err := alt_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
97- return fmt .Errorf ("CleanupRule [%d]: alt.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
69+ }
70+
71+ if anyVersionDeleted {
72+ switch pcr .Type {
73+ case packages_model .TypeDebian :
74+ if err := debian_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
75+ return fmt .Errorf ("CleanupRule [%d]: debian.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
76+ }
77+ case packages_model .TypeAlpine :
78+ if err := alpine_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
79+ return fmt .Errorf ("CleanupRule [%d]: alpine.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
80+ }
81+ case packages_model .TypeRpm :
82+ if err := rpm_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
83+ return fmt .Errorf ("CleanupRule [%d]: rpm.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
84+ }
85+ case packages_model .TypeArch :
86+ if err := arch_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
87+ return fmt .Errorf ("CleanupRule [%d]: arch.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
88+ }
89+ case packages_model .TypeAlt :
90+ if err := alt_service .BuildAllRepositoryFiles (ctx , pcr .OwnerID ); err != nil {
91+ return fmt .Errorf ("CleanupRule [%d]: alt.BuildAllRepositoryFiles failed: %w" , pcr .ID , err )
92+ }
9893 }
9994 }
100- }
101- return nil
95+ return nil
96+ })
10297 })
103- if err != nil {
104- return err
105- }
106-
107- return committer .Commit ()
10898}
10999
110100type CleanupTarget struct {
0 commit comments