Skip to content

Commit d5da0e6

Browse files
GiteaBotJakobDev
andauthored
Don't use subselect in DeleteIssuesByRepoID (#27332) (#27408)
Backport #27332 by @JakobDev Part of https://codeberg.org/forgejo/discussions/issues/61 This is workaround for a bug in MariaDB Co-authored-by: JakobDev <[email protected]>
1 parent 8c6464e commit d5da0e6

File tree

1 file changed

+79
-64
lines changed

1 file changed

+79
-64
lines changed

models/issues/issue_update.go

Lines changed: 79 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -696,85 +696,100 @@ func UpdateReactionsMigrationsByType(ctx context.Context, gitServiceType api.Git
696696

697697
// DeleteIssuesByRepoID deletes issues by repositories id
698698
func DeleteIssuesByRepoID(ctx context.Context, repoID int64) (attachmentPaths []string, err error) {
699-
deleteCond := builder.Select("id").From("issue").Where(builder.Eq{"issue.repo_id": repoID})
700-
699+
// MariaDB has a performance bug: https://jira.mariadb.org/browse/MDEV-16289
700+
// so here it uses "DELETE ... WHERE IN" with pre-queried IDs.
701701
sess := db.GetEngine(ctx)
702-
// Delete content histories
703-
if _, err = sess.In("issue_id", deleteCond).
704-
Delete(&ContentHistory{}); err != nil {
705-
return nil, err
706-
}
707702

708-
// Delete comments and attachments
709-
if _, err = sess.In("issue_id", deleteCond).
710-
Delete(&Comment{}); err != nil {
711-
return nil, err
712-
}
703+
for {
704+
issueIDs := make([]int64, 0, db.DefaultMaxInSize)
713705

714-
// Dependencies for issues in this repository
715-
if _, err = sess.In("issue_id", deleteCond).
716-
Delete(&IssueDependency{}); err != nil {
717-
return nil, err
718-
}
706+
err := sess.Table(&Issue{}).Where("repo_id = ?", repoID).OrderBy("id").Limit(db.DefaultMaxInSize).Cols("id").Find(&issueIDs)
707+
if err != nil {
708+
return nil, err
709+
}
719710

720-
// Delete dependencies for issues in other repositories
721-
if _, err = sess.In("dependency_id", deleteCond).
722-
Delete(&IssueDependency{}); err != nil {
723-
return nil, err
724-
}
711+
if len(issueIDs) == 0 {
712+
break
713+
}
725714

726-
if _, err = sess.In("issue_id", deleteCond).
727-
Delete(&IssueUser{}); err != nil {
728-
return nil, err
729-
}
715+
// Delete content histories
716+
_, err = sess.In("issue_id", issueIDs).Delete(&ContentHistory{})
717+
if err != nil {
718+
return nil, err
719+
}
730720

731-
if _, err = sess.In("issue_id", deleteCond).
732-
Delete(&Reaction{}); err != nil {
733-
return nil, err
734-
}
721+
// Delete comments and attachments
722+
_, err = sess.In("issue_id", issueIDs).Delete(&Comment{})
723+
if err != nil {
724+
return nil, err
725+
}
735726

736-
if _, err = sess.In("issue_id", deleteCond).
737-
Delete(&IssueWatch{}); err != nil {
738-
return nil, err
739-
}
727+
// Dependencies for issues in this repository
728+
_, err = sess.In("issue_id", issueIDs).Delete(&IssueDependency{})
729+
if err != nil {
730+
return nil, err
731+
}
740732

741-
if _, err = sess.In("issue_id", deleteCond).
742-
Delete(&Stopwatch{}); err != nil {
743-
return nil, err
744-
}
733+
// Delete dependencies for issues in other repositories
734+
_, err = sess.In("dependency_id", issueIDs).Delete(&IssueDependency{})
735+
if err != nil {
736+
return nil, err
737+
}
745738

746-
if _, err = sess.In("issue_id", deleteCond).
747-
Delete(&TrackedTime{}); err != nil {
748-
return nil, err
749-
}
739+
_, err = sess.In("issue_id", issueIDs).Delete(&IssueUser{})
740+
if err != nil {
741+
return nil, err
742+
}
750743

751-
if _, err = sess.In("issue_id", deleteCond).
752-
Delete(&project_model.ProjectIssue{}); err != nil {
753-
return nil, err
754-
}
744+
_, err = sess.In("issue_id", issueIDs).Delete(&Reaction{})
745+
if err != nil {
746+
return nil, err
747+
}
755748

756-
if _, err = sess.In("dependent_issue_id", deleteCond).
757-
Delete(&Comment{}); err != nil {
758-
return nil, err
759-
}
749+
_, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{})
750+
if err != nil {
751+
return nil, err
752+
}
760753

761-
var attachments []*repo_model.Attachment
762-
if err = sess.In("issue_id", deleteCond).
763-
Find(&attachments); err != nil {
764-
return nil, err
765-
}
754+
_, err = sess.In("issue_id", issueIDs).Delete(&Stopwatch{})
755+
if err != nil {
756+
return nil, err
757+
}
766758

767-
for j := range attachments {
768-
attachmentPaths = append(attachmentPaths, attachments[j].RelativePath())
769-
}
759+
_, err = sess.In("issue_id", issueIDs).Delete(&TrackedTime{})
760+
if err != nil {
761+
return nil, err
762+
}
770763

771-
if _, err = sess.In("issue_id", deleteCond).
772-
Delete(&repo_model.Attachment{}); err != nil {
773-
return nil, err
774-
}
764+
_, err = sess.In("issue_id", issueIDs).Delete(&project_model.ProjectIssue{})
765+
if err != nil {
766+
return nil, err
767+
}
775768

776-
if _, err = db.DeleteByBean(ctx, &Issue{RepoID: repoID}); err != nil {
777-
return nil, err
769+
_, err = sess.In("dependent_issue_id", issueIDs).Delete(&Comment{})
770+
if err != nil {
771+
return nil, err
772+
}
773+
774+
var attachments []*repo_model.Attachment
775+
err = sess.In("issue_id", issueIDs).Find(&attachments)
776+
if err != nil {
777+
return nil, err
778+
}
779+
780+
for j := range attachments {
781+
attachmentPaths = append(attachmentPaths, attachments[j].RelativePath())
782+
}
783+
784+
_, err = sess.In("issue_id", issueIDs).Delete(&repo_model.Attachment{})
785+
if err != nil {
786+
return nil, err
787+
}
788+
789+
_, err = sess.In("id", issueIDs).Delete(&Issue{})
790+
if err != nil {
791+
return nil, err
792+
}
778793
}
779794

780795
return attachmentPaths, err

0 commit comments

Comments
 (0)