From abb534ba7afd721a8f8765a5d99ee37da7620219 Mon Sep 17 00:00:00 2001 From: guillep2k <18600385+guillep2k@users.noreply.github.com> Date: Mon, 2 Mar 2020 13:32:20 -0300 Subject: [PATCH] Fix migration bug on v96.go (#10572) (#10573) Co-authored-by: Lunny Xiao --- models/migrations/v96.go | 49 ++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/models/migrations/v96.go b/models/migrations/v96.go index b8eb201591..7a1684354a 100644 --- a/models/migrations/v96.go +++ b/models/migrations/v96.go @@ -26,23 +26,38 @@ func deleteOrphanedAttachments(x *xorm.Engine) error { sess := x.NewSession() defer sess.Close() - err := sess.BufferSize(setting.Database.IterateBufferSize). - Where("`issue_id` = 0 and (`release_id` = 0 or `release_id` not in (select `id` from `release`))").Cols("uuid"). - Iterate(new(Attachment), - func(idx int, bean interface{}) error { - attachment := bean.(*Attachment) - - if err := os.RemoveAll(models.AttachmentLocalPath(attachment.UUID)); err != nil { - return err - } - - _, err := sess.ID(attachment.ID).NoAutoCondition().Delete(attachment) - return err - }) - - if err != nil { - return err + var limit = setting.Database.IterateBufferSize + if limit <= 0 { + limit = 50 } - return sess.Commit() + for { + attachements := make([]Attachment, 0, limit) + if err := sess.Where("`issue_id` = 0 and (`release_id` = 0 or `release_id` not in (select `id` from `release`))"). + Cols("id, uuid").Limit(limit). + Asc("id"). + Find(&attachements); err != nil { + return err + } + if len(attachements) == 0 { + return nil + } + + var ids = make([]int64, 0, limit) + for _, attachment := range attachements { + ids = append(ids, attachment.ID) + } + if _, err := sess.In("id", ids).Delete(new(Attachment)); err != nil { + return err + } + + for _, attachment := range attachements { + if err := os.RemoveAll(models.AttachmentLocalPath(attachment.UUID)); err != nil { + return err + } + } + if len(attachements) < limit { + return nil + } + } }