From dcf4b9e3146db7bb8359538acb7c5fbd6fce9e6f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 17 Sep 2023 11:15:04 +0800 Subject: [PATCH] Fix wrong migration for email address (#27106) On Iterate, `sess` should not be used in the closure function body. Caused by #26952 --- models/migrations/v1_21/v276.go | 88 ++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 18 deletions(-) diff --git a/models/migrations/v1_21/v276.go b/models/migrations/v1_21/v276.go index 8933f186dc..8746c8851e 100644 --- a/models/migrations/v1_21/v276.go +++ b/models/migrations/v1_21/v276.go @@ -50,19 +50,45 @@ func migratePullMirrors(x *xorm.Engine) error { return err } - if err := sess.Iterate(new(Mirror), func(_ int, bean any) error { - m := bean.(*Mirror) - remoteAddress, err := getRemoteAddress(sess, m.RepoID, "origin") - if err != nil { + limit := setting.Database.IterateBufferSize + if limit <= 0 { + limit = 50 + } + + start := 0 + + for { + var mirrors []Mirror + if err := sess.Limit(limit, start).Find(&mirrors); err != nil { return err } - m.RemoteAddress = remoteAddress + if len(mirrors) == 0 { + break + } + start += len(mirrors) - _, err = sess.ID(m.ID).Cols("remote_address").Update(m) - return err - }); err != nil { - return err + for _, m := range mirrors { + remoteAddress, err := getRemoteAddress(sess, m.RepoID, "origin") + if err != nil { + return err + } + + m.RemoteAddress = remoteAddress + + if _, err = sess.ID(m.ID).Cols("remote_address").Update(m); err != nil { + return err + } + } + + if start%1000 == 0 { // avoid a too big transaction + if err := sess.Commit(); err != nil { + return err + } + if err := sess.Begin(); err != nil { + return err + } + } } return sess.Commit() @@ -83,19 +109,45 @@ func migratePushMirrors(x *xorm.Engine) error { return err } - if err := sess.Iterate(new(PushMirror), func(_ int, bean any) error { - m := bean.(*PushMirror) - remoteAddress, err := getRemoteAddress(sess, m.RepoID, m.RemoteName) - if err != nil { + limit := setting.Database.IterateBufferSize + if limit <= 0 { + limit = 50 + } + + start := 0 + + for { + var mirrors []PushMirror + if err := sess.Limit(limit, start).Find(&mirrors); err != nil { return err } - m.RemoteAddress = remoteAddress + if len(mirrors) == 0 { + break + } + start += len(mirrors) - _, err = sess.ID(m.ID).Cols("remote_address").Update(m) - return err - }); err != nil { - return err + for _, m := range mirrors { + remoteAddress, err := getRemoteAddress(sess, m.RepoID, m.RemoteName) + if err != nil { + return err + } + + m.RemoteAddress = remoteAddress + + if _, err = sess.ID(m.ID).Cols("remote_address").Update(m); err != nil { + return err + } + } + + if start%1000 == 0 { // avoid a too big transaction + if err := sess.Commit(); err != nil { + return err + } + if err := sess.Begin(); err != nil { + return err + } + } } return sess.Commit()