Skip to content

Commit 819db1c

Browse files
Process updating user in batches
Signed-off-by: Masudur Rahman <[email protected]>
1 parent e39cf68 commit 819db1c

File tree

1 file changed

+52
-47
lines changed

1 file changed

+52
-47
lines changed

models/migrations/v115.go

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os"
1212
"path/filepath"
1313

14+
"code.gitea.io/gitea/modules/log"
1415
"code.gitea.io/gitea/modules/setting"
1516

1617
"xorm.io/xorm"
@@ -19,71 +20,75 @@ import (
1920
func renameExistingUserAvatarName(x *xorm.Engine) error {
2021
sess := x.NewSession()
2122
defer sess.Close()
22-
if err := sess.Begin(); err != nil {
23-
return err
24-
}
2523

2624
type User struct {
2725
ID int64 `xorm:"pk autoincr"`
2826
Avatar string
2927
}
30-
31-
users := make([]User, 0)
32-
if err := sess.Find(&users); err != nil {
33-
return err
34-
}
35-
3628
deleteList := make(map[string]struct{})
37-
sessionOpCount := 0
38-
for _, user := range users {
39-
oldAvatar := user.Avatar
40-
newAvatar := fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d-%s", user.ID, user.Avatar))))
41-
if _, err := os.Stat(filepath.Join(setting.AvatarUploadPath, oldAvatar)); err != nil {
42-
continue
29+
start := 0
30+
for {
31+
if err := sess.Begin(); err != nil {
32+
return fmt.Errorf("session.Begin: %v", err)
4333
}
44-
45-
fr, err := os.Open(filepath.Join(setting.AvatarUploadPath, oldAvatar))
46-
if err != nil {
47-
_ = commitSession(sess)
48-
return fmt.Errorf("os.Open: %v", err)
34+
users := make([]User, 0, 50)
35+
if err := sess.Table("user").Asc("id").Limit(50, start).Find(&users); err != nil {
36+
return fmt.Errorf("select users from id [%d]: %v", start, err)
4937
}
50-
defer fr.Close()
51-
52-
fw, err := os.Create(filepath.Join(setting.AvatarUploadPath, newAvatar))
53-
if err != nil {
54-
_ = commitSession(sess)
55-
return fmt.Errorf("os.Create: %v", err)
38+
if len(users) == 0 {
39+
break
5640
}
57-
defer fw.Close()
41+
log.Info("select users [%d - %d]", start, start+len(users))
42+
start += 50
5843

59-
if _, err := io.Copy(fw, fr); err != nil {
60-
_ = commitSession(sess)
61-
return fmt.Errorf("io.Copy: %v", err)
62-
}
44+
for _, user := range users {
45+
oldAvatar := user.Avatar
46+
newAvatar := fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d-%s", user.ID, user.Avatar))))
47+
if _, err := os.Stat(filepath.Join(setting.AvatarUploadPath, oldAvatar)); err != nil {
48+
log.Warn("os.Stat: %v", err)
49+
continue
50+
}
6351

64-
user.Avatar = newAvatar
65-
if _, err := sess.ID(user.ID).Update(&user); err != nil {
66-
return fmt.Errorf("user table update: %v", err)
67-
}
52+
fr, err := os.Open(filepath.Join(setting.AvatarUploadPath, oldAvatar))
53+
if err != nil {
54+
if err := commitSession(sess); err != nil {
55+
return fmt.Errorf("commit session: %v", err)
56+
}
57+
return fmt.Errorf("os.Open: %v", err)
58+
}
59+
defer fr.Close()
6860

69-
deleteList[filepath.Join(setting.AvatarUploadPath, oldAvatar)] = struct{}{}
61+
fw, err := os.Create(filepath.Join(setting.AvatarUploadPath, newAvatar))
62+
if err != nil {
63+
if err := commitSession(sess); err != nil {
64+
return fmt.Errorf("commit session: %v", err)
65+
}
66+
return fmt.Errorf("os.Create: %v", err)
67+
}
68+
defer fw.Close()
7069

71-
if sessionOpCount++; sessionOpCount >= 100 {
72-
if err := commitSession(sess); err != nil {
73-
return err
70+
if _, err := io.Copy(fw, fr); err != nil {
71+
if err := commitSession(sess); err != nil {
72+
return fmt.Errorf("commit session: %v", err)
73+
}
74+
return fmt.Errorf("io.Copy: %v", err)
7475
}
75-
sessionOpCount = 0
76-
if err := sess.Begin(); err != nil {
77-
return err
76+
77+
user.Avatar = newAvatar
78+
if _, err := sess.ID(user.ID).Update(&user); err != nil {
79+
return fmt.Errorf("user table update: %v", err)
7880
}
81+
82+
deleteList[filepath.Join(setting.AvatarUploadPath, oldAvatar)] = struct{}{}
83+
}
84+
if err := commitSession(sess); err != nil {
85+
return fmt.Errorf("commit session: %v", err)
7986
}
8087
}
81-
if err := commitSession(sess); err != nil {
82-
return err
83-
}
88+
8489
for file := range deleteList {
8590
if err := os.Remove(file); err != nil {
86-
return fmt.Errorf("os.Remove: %v", err)
91+
log.Warn("os.Remove: %v", err)
8792
}
8893
}
8994
return nil
@@ -92,7 +97,7 @@ func renameExistingUserAvatarName(x *xorm.Engine) error {
9297
func commitSession(sess *xorm.Session) error {
9398
if err := sess.Commit(); err != nil {
9499
_ = sess.Rollback()
95-
return fmt.Errorf("db update: %v", err)
100+
return err
96101
}
97102
return nil
98103
}

0 commit comments

Comments
 (0)