diff --git a/models/migrations/v96.go b/models/migrations/v96.go index b8eb20159139..7a1684354aed 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 + } + } }