loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'feat: optimize the FindUnreferencedPackages package query' (#4711) from earl-warren/forgejo:wip-container-simplify into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4711
Reviewed-by: thefox <thefox@noreply.codeberg.org>

+18 -16
+10 -12
models/packages/package.go
··· 280 280 } 281 281 282 282 // FindUnreferencedPackages gets all packages without associated versions 283 - func FindUnreferencedPackages(ctx context.Context) ([]*Package, error) { 284 - in := builder. 283 + func FindUnreferencedPackages(ctx context.Context) ([]int64, error) { 284 + var pIDs []int64 285 + if err := db.GetEngine(ctx). 285 286 Select("package.id"). 286 - From("package"). 287 - LeftJoin("package_version", "package_version.package_id = package.id"). 288 - Where(builder.Expr("package_version.id IS NULL")) 289 - 290 - ps := make([]*Package, 0, 10) 291 - return ps, db.GetEngine(ctx). 292 - // double select workaround for MySQL 293 - // https://stackoverflow.com/questions/4471277/mysql-delete-from-with-subquery-as-condition 294 - Where(builder.In("package.id", builder.Select("id").From(in, "temp"))). 295 - Find(&ps) 287 + Table("package"). 288 + Join("LEFT", "package_version", "package_version.package_id = package.id"). 289 + Where("package_version.id IS NULL"). 290 + Find(&pIDs); err != nil { 291 + return nil, err 292 + } 293 + return pIDs, nil 296 294 } 297 295 298 296 // HasOwnerPackages tests if a user/org has accessible packages
+4 -4
services/packages/cleanup/cleanup.go
··· 154 154 return err 155 155 } 156 156 157 - ps, err := packages_model.FindUnreferencedPackages(ctx) 157 + pIDs, err := packages_model.FindUnreferencedPackages(ctx) 158 158 if err != nil { 159 159 return err 160 160 } 161 - for _, p := range ps { 162 - if err := packages_model.DeleteAllProperties(ctx, packages_model.PropertyTypePackage, p.ID); err != nil { 161 + for _, pID := range pIDs { 162 + if err := packages_model.DeleteAllProperties(ctx, packages_model.PropertyTypePackage, pID); err != nil { 163 163 return err 164 164 } 165 - if err := packages_model.DeletePackageByID(ctx, p.ID); err != nil { 165 + if err := packages_model.DeletePackageByID(ctx, pID); err != nil { 166 166 return err 167 167 } 168 168 }
+4
tests/integration/api_packages_test.go
··· 479 479 AddBasicAuth(user.Name) 480 480 MakeRequest(t, req, http.StatusCreated) 481 481 482 + unittest.AssertExistsAndLoadBean(t, &packages_model.Package{Name: "cleanup-test"}) 483 + 482 484 pbs, err := packages_model.FindExpiredUnreferencedBlobs(db.DefaultContext, duration) 483 485 assert.NoError(t, err) 484 486 assert.NotEmpty(t, pbs) ··· 492 494 pbs, err = packages_model.FindExpiredUnreferencedBlobs(db.DefaultContext, duration) 493 495 assert.NoError(t, err) 494 496 assert.Empty(t, pbs) 497 + 498 + unittest.AssertNotExistsBean(t, &packages_model.Package{Name: "cleanup-test"}) 495 499 496 500 _, err = packages_model.GetInternalVersionByNameAndVersion(db.DefaultContext, user.ID, packages_model.TypeContainer, "cleanup-test", container_model.UploadVersion) 497 501 assert.ErrorIs(t, err, packages_model.ErrPackageNotExist)