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 'mysql: faster user deletion (hook_task query) for mariadb 10' (#3865) from oliverpool/forgejo:join_delete_hook_task into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3865
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>

+46 -4
+6
models/fixtures/hook_task.yml
··· 35 35 "X-Head": "42" 36 36 } 37 37 } 38 + 39 + - 40 + id: 4 41 + hook_id: 3 42 + uuid: uuid4 43 + is_delivered: false
+1
release-notes/8.0.0/perf/3865.md
··· 1 + Attempt to speed up user deletion when using mariadb 10 (the subquery took advantage of the available index starting with mariadb 11).
+20 -3
services/repository/delete.go
··· 26 26 actions_module "code.gitea.io/gitea/modules/actions" 27 27 "code.gitea.io/gitea/modules/lfs" 28 28 "code.gitea.io/gitea/modules/log" 29 + "code.gitea.io/gitea/modules/setting" 29 30 "code.gitea.io/gitea/modules/storage" 30 31 31 32 "xorm.io/builder" ··· 125 126 return err 126 127 } 127 128 128 - if _, err := db.GetEngine(ctx).In("hook_id", builder.Select("id").From("webhook").Where(builder.Eq{"webhook.repo_id": repo.ID})). 129 - Delete(&webhook.HookTask{}); err != nil { 130 - return err 129 + if setting.Database.Type.IsMySQL() { 130 + // mariadb:10 does not use the hook_task KEY when using IN. 131 + // https://codeberg.org/forgejo/forgejo/issues/3678 132 + // 133 + // Version 11 does support it, but is not available in debian yet. 134 + // Version 11.4 LTS is not available yet (stable should be released mid 2024 https://mariadb.org/mariadb/all-releases/) 135 + 136 + // Sqlite does not support the DELETE *** FROM *** syntax 137 + // https://stackoverflow.com/q/24511153/3207406 138 + 139 + // in the meantime, use a dedicated query for mysql... 140 + if _, err := db.Exec(ctx, "DELETE `hook_task` FROM `hook_task` INNER JOIN `webhook` ON `webhook`.id = `hook_task`.hook_id WHERE `webhook`.repo_id = ?", repo.ID); err != nil { 141 + return err 142 + } 143 + } else { 144 + if _, err := db.GetEngine(ctx).In("hook_id", builder.Select("id").From("webhook").Where(builder.Eq{"webhook.repo_id": repo.ID})). 145 + Delete(&webhook.HookTask{}); err != nil { 146 + return err 147 + } 131 148 } 132 149 133 150 if err := db.DeleteBeans(ctx,
+19 -1
services/repository/delete_test.go tests/integration/repo_delete_test.go
··· 1 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 2 // SPDX-License-Identifier: MIT 3 3 4 - package repository_test 4 + package integration 5 5 6 6 import ( 7 7 "testing" ··· 11 11 repo_model "code.gitea.io/gitea/models/repo" 12 12 "code.gitea.io/gitea/models/unittest" 13 13 user_model "code.gitea.io/gitea/models/user" 14 + webhook_model "code.gitea.io/gitea/models/webhook" 14 15 repo_service "code.gitea.io/gitea/services/repository" 15 16 16 17 "github.com/stretchr/testify/assert" ··· 51 52 52 53 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 53 54 55 + deletedHookID := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{RepoID: 1}).ID 56 + unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{ 57 + HookID: deletedHookID, 58 + }) 59 + 60 + preservedHookID := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{RepoID: 3}).ID 61 + unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{ 62 + HookID: preservedHookID, 63 + }) 64 + 54 65 assert.NoError(t, repo_service.DeleteOwnerRepositoriesDirectly(db.DefaultContext, user)) 66 + 67 + unittest.AssertNotExistsBean(t, &webhook_model.HookTask{ 68 + HookID: deletedHookID, 69 + }) 70 + unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{ 71 + HookID: preservedHookID, 72 + }) 55 73 }