Skip to content

Commit c8229fa

Browse files
author
Dorian Stoll
committedApr 29, 2017
Fix explosions when concurrently accessing a map
1 parent 92fa80b commit c8229fa

15 files changed

+132
-19
lines changed
 

‎src/SpaceDock/database.go

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
_ "github.com/jinzhu/gorm/dialects/mysql"
1515
_ "github.com/jinzhu/gorm/dialects/postgres"
1616
"log"
17+
"sync"
1718
)
1819

1920
/*
@@ -26,6 +27,7 @@ var Database *gorm.DB
2627
*/
2728
var DBRecursion map[uint64]int = map[uint64]int{}
2829
var DBRecursionMax int = 2
30+
var DBRecursionLock sync.RWMutex = sync.RWMutex{}
2931

3032
/*
3133
Establishes the connection to the database

‎src/SpaceDock/objects/ability.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,24 @@ type Ability struct {
2121
}
2222

2323
func (s *Ability) AfterFind() {
24+
SpaceDock.DBRecursionLock.Lock()
2425
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2526
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2627
}
27-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
28+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
29+
SpaceDock.DBRecursionLock.Unlock()
2830
return
2931
}
3032
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3133
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
34+
SpaceDock.DBRecursionLock.Unlock()
35+
3236
SpaceDock.Database.Model(s).Related(&(s.Roles), "Roles")
37+
38+
SpaceDock.DBRecursionLock.Lock()
3339
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3440
if isRoot {
3541
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
3642
}
43+
SpaceDock.DBRecursionLock.Unlock()
3744
}

‎src/SpaceDock/objects/events.go

+24-3
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ type DownloadEvent struct {
2424
}
2525

2626
func (s *DownloadEvent) AfterFind() {
27+
SpaceDock.DBRecursionLock.Lock()
2728
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2829
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2930
}
30-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
31+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
32+
SpaceDock.DBRecursionLock.Unlock()
3133
return
3234
}
3335
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3436
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
37+
SpaceDock.DBRecursionLock.Unlock()
38+
3539
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
3640
SpaceDock.Database.Related(&(s.Version), "Version")
41+
42+
SpaceDock.DBRecursionLock.Lock()
3743
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3844
if isRoot {
3945
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4046
}
47+
SpaceDock.DBRecursionLock.Unlock()
4148
}
4249

4350
func NewDownloadEvent(mod Mod, version ModVersion) *DownloadEvent {
@@ -64,19 +71,26 @@ type FollowEvent struct {
6471
}
6572

6673
func (s *FollowEvent) AfterFind() {
74+
SpaceDock.DBRecursionLock.Lock()
6775
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
6876
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
6977
}
70-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
78+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
79+
SpaceDock.DBRecursionLock.Unlock()
7180
return
7281
}
7382
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
7483
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
84+
SpaceDock.DBRecursionLock.Unlock()
85+
7586
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
87+
88+
SpaceDock.DBRecursionLock.Lock()
7689
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
7790
if isRoot {
7891
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
7992
}
93+
SpaceDock.DBRecursionLock.Unlock()
8094
}
8195

8296
func NewFollowEvent(mod Mod) *FollowEvent {
@@ -102,19 +116,26 @@ type ReferralEvent struct {
102116
}
103117

104118
func (s *ReferralEvent) AfterFind() {
119+
SpaceDock.DBRecursionLock.Lock()
105120
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
106121
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
107122
}
108-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
123+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
124+
SpaceDock.DBRecursionLock.Unlock()
109125
return
110126
}
111127
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
112128
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
129+
SpaceDock.DBRecursionLock.Unlock()
130+
113131
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
132+
133+
SpaceDock.DBRecursionLock.Lock()
114134
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
115135
if isRoot {
116136
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
117137
}
138+
SpaceDock.DBRecursionLock.Unlock()
118139
}
119140

120141
func NewReferralEvent(mod Mod, host string) *ReferralEvent {

‎src/SpaceDock/objects/featured.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,25 @@ type Featured struct {
2121
}
2222

2323
func (s *Featured) AfterFind() {
24+
SpaceDock.DBRecursionLock.Lock()
2425
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2526
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2627
}
27-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
28+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
2829
return
2930
}
3031
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3132
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
33+
SpaceDock.DBRecursionLock.Unlock()
34+
3235
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
36+
37+
SpaceDock.DBRecursionLock.Lock()
3338
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3439
if isRoot {
3540
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
3641
}
42+
SpaceDock.DBRecursionLock.Unlock()
3743
}
3844

3945
func NewFeatured(mod Mod) *Featured {

‎src/SpaceDock/objects/game.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ package objects
1010

1111
import (
1212
"SpaceDock"
13-
"time"
1413
"SpaceDock/utils"
14+
"time"
1515
)
1616

1717
type Game struct {
@@ -33,22 +33,29 @@ type Game struct {
3333
}
3434

3535
func (s *Game) AfterFind() {
36+
SpaceDock.DBRecursionLock.Lock()
3637
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
3738
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
3839
}
39-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
40+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
41+
SpaceDock.DBRecursionLock.Unlock()
4042
return
4143
}
4244
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
4345
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
46+
SpaceDock.DBRecursionLock.Unlock()
47+
4448
SpaceDock.Database.Model(s).Related(&(s.Publisher))
4549
SpaceDock.Database.Model(s).Related(&(s.Mods))
4650
SpaceDock.Database.Model(s).Related(&(s.Modlists))
4751
SpaceDock.Database.Model(s).Related(&(s.Versions))
52+
53+
SpaceDock.DBRecursionLock.Lock()
4854
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
4955
if isRoot {
5056
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
5157
}
58+
SpaceDock.DBRecursionLock.Unlock()
5259
}
5360

5461
func NewGame(name string, publisher Publisher, short string) *Game {

‎src/SpaceDock/objects/gameversion.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,26 @@ type GameVersion struct {
2323
}
2424

2525
func (s *GameVersion) AfterFind() {
26+
SpaceDock.DBRecursionLock.Lock()
2627
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2728
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2829
}
29-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
30+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
31+
SpaceDock.DBRecursionLock.Unlock()
3032
return
3133
}
3234
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3335
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
36+
SpaceDock.DBRecursionLock.Unlock()
37+
3438
SpaceDock.Database.Model(s).Related(&(s.Game), "Game")
39+
40+
SpaceDock.DBRecursionLock.Lock()
3541
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3642
if isRoot {
3743
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
3844
}
45+
SpaceDock.DBRecursionLock.Unlock()
3946
}
4047

4148
func NewGameVersion(friendly_version string, game Game, beta bool) *GameVersion {

‎src/SpaceDock/objects/mod.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,32 @@ type Mod struct {
4040
}
4141

4242
func (s *Mod) AfterFind() {
43+
SpaceDock.DBRecursionLock.Lock()
4344
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
4445
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
4546
}
46-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
47+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
48+
SpaceDock.DBRecursionLock.Unlock()
4749
return
4850
}
4951
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
5052
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
53+
SpaceDock.DBRecursionLock.Unlock()
54+
5155
SpaceDock.Database.Model(s).Related(&(s.User), "User")
5256
SpaceDock.Database.Model(s).Related(&(s.Game), "Game")
5357
SpaceDock.Database.Model(s).Related(&(s.DefaultVersion), "DefaultVersion")
5458
SpaceDock.Database.Model(s).Related(&(s.Versions), "Versions")
5559
SpaceDock.Database.Model(s).Related(&(s.Followers), "Followers")
5660
SpaceDock.Database.Model(s).Related(&(s.Ratings), "Ratings")
5761
SpaceDock.Database.Model(s).Related(&(s.SharedAuthors), "SharedAuthors")
62+
63+
SpaceDock.DBRecursionLock.Lock()
5864
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
5965
if isRoot {
6066
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
6167
}
68+
SpaceDock.DBRecursionLock.Unlock()
6269
}
6370

6471
func (mod *Mod) CalculateScore() {

‎src/SpaceDock/objects/modlist.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,28 @@ type ModList struct {
2727
}
2828

2929
func (s *ModList) AfterFind() {
30+
SpaceDock.DBRecursionLock.Lock()
3031
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
3132
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
3233
}
33-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
34+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
35+
SpaceDock.DBRecursionLock.Unlock()
3436
return
3537
}
3638
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3739
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
40+
SpaceDock.DBRecursionLock.Unlock()
41+
3842
SpaceDock.Database.Model(s).Related(&(s.User), "User")
3943
SpaceDock.Database.Model(s).Related(&(s.Game), "Game")
4044
SpaceDock.Database.Model(s).Related(&(s.Mods), "Mods")
45+
46+
SpaceDock.DBRecursionLock.Lock()
4147
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
4248
if isRoot {
4349
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4450
}
51+
SpaceDock.DBRecursionLock.Unlock()
4552
}
4653

4754
func NewModList(name string, user User, game Game) *ModList {

‎src/SpaceDock/objects/modlistitem.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ type ModListItem struct {
2424
}
2525

2626
func (s *ModListItem) AfterFind() {
27+
SpaceDock.DBRecursionLock.Lock()
2728
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2829
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2930
}
30-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
31+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
32+
SpaceDock.DBRecursionLock.Unlock()
3133
return
3234
}
3335
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3436
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
37+
SpaceDock.DBRecursionLock.Unlock()
38+
3539
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
3640
SpaceDock.Database.Model(s).Related(&(s.ModList), "ModList")
41+
42+
SpaceDock.DBRecursionLock.Lock()
3743
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3844
if isRoot {
3945
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4046
}
47+
SpaceDock.DBRecursionLock.Unlock()
4148
}
4249

4350
func NewModListItem(mod Mod, list ModList) *ModListItem {

‎src/SpaceDock/objects/modversion.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ package objects
1010

1111
import (
1212
"SpaceDock"
13+
"SpaceDock/utils"
1314
"os"
1415
"path/filepath"
15-
"SpaceDock/utils"
1616
)
1717

1818
type ModVersion struct {
@@ -30,19 +30,26 @@ type ModVersion struct {
3030
}
3131

3232
func (s *ModVersion) AfterFind() {
33+
SpaceDock.DBRecursionLock.Lock()
3334
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
3435
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
3536
}
36-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
37+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
38+
SpaceDock.DBRecursionLock.Unlock()
3739
return
3840
}
3941
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
4042
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
43+
SpaceDock.DBRecursionLock.Unlock()
44+
4145
SpaceDock.Database.Model(s).Related(&(s.GameVersion), "GameVersion")
46+
47+
SpaceDock.DBRecursionLock.Lock()
4248
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
4349
if isRoot {
4450
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4551
}
52+
SpaceDock.DBRecursionLock.Unlock()
4653
}
4754

4855
func NewModVersion(mod Mod, friendly_version string, gameversion GameVersion, download_path string, beta bool) *ModVersion {

‎src/SpaceDock/objects/publisher.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,26 @@ type Publisher struct {
2323
}
2424

2525
func (s *Publisher) AfterFind() {
26+
SpaceDock.DBRecursionLock.Lock()
2627
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2728
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2829
}
29-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
30+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
31+
SpaceDock.DBRecursionLock.Unlock()
3032
return
3133
}
3234
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3335
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
36+
SpaceDock.DBRecursionLock.Unlock()
37+
3438
SpaceDock.Database.Model(s).Related(&(s.Games), "Games")
39+
40+
SpaceDock.DBRecursionLock.Lock()
3541
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3642
if isRoot {
3743
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
3844
}
45+
SpaceDock.DBRecursionLock.Unlock()
3946
}
4047

4148
func NewPublisher(name string) *Publisher {

‎src/SpaceDock/objects/rating.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ package objects
1010

1111
import (
1212
"SpaceDock"
13-
"math"
1413
"SpaceDock/utils"
14+
"math"
1515
)
1616

1717
type Rating struct {
@@ -25,20 +25,27 @@ type Rating struct {
2525
}
2626

2727
func (s *Rating) AfterFind() {
28+
SpaceDock.DBRecursionLock.Lock()
2829
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2930
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
3031
}
31-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
32+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
33+
SpaceDock.DBRecursionLock.Unlock()
3234
return
3335
}
3436
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3537
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
38+
SpaceDock.DBRecursionLock.Unlock()
39+
3640
SpaceDock.Database.Model(s).Related(&(s.User), "User")
3741
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
42+
43+
SpaceDock.DBRecursionLock.Lock()
3844
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3945
if isRoot {
4046
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4147
}
48+
SpaceDock.DBRecursionLock.Unlock()
4249
}
4350

4451
func NewRating(user User, mod Mod, score float64) *Rating {

‎src/SpaceDock/objects/role.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ type Role struct {
2424
}
2525

2626
func (s *Role) AfterFind() {
27+
SpaceDock.DBRecursionLock.Lock()
2728
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2829
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2930
}
30-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
31+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
32+
SpaceDock.DBRecursionLock.Unlock()
3133
return
3234
}
3335
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3436
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
37+
SpaceDock.DBRecursionLock.Unlock()
38+
3539
SpaceDock.Database.Model(s).Related(&(s.Abilities), "Abilities")
3640
SpaceDock.Database.Model(s).Related(&(s.Users), "Users")
41+
42+
SpaceDock.DBRecursionLock.Lock()
3743
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3844
if isRoot {
3945
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4046
}
47+
SpaceDock.DBRecursionLock.Unlock()
4148
}
4249

4350
func (role *Role) AddAbility(name string) *Ability {

‎src/SpaceDock/objects/sharedauthor.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ type SharedAuthor struct {
2424
}
2525

2626
func (s *SharedAuthor) AfterFind() {
27+
SpaceDock.DBRecursionLock.Lock()
2728
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
2829
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
2930
}
30-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
31+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
32+
SpaceDock.DBRecursionLock.Unlock()
3133
return
3234
}
3335
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
3436
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
37+
SpaceDock.DBRecursionLock.Unlock()
38+
3539
SpaceDock.Database.Model(s).Related(&(s.User), "User")
3640
SpaceDock.Database.Model(s).Related(&(s.Mod), "Mod")
41+
42+
SpaceDock.DBRecursionLock.Lock()
3743
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
3844
if isRoot {
3945
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
4046
}
47+
SpaceDock.DBRecursionLock.Unlock()
4148
}
4249

4350
func NewSharedAuthor(user User, mod Mod) *SharedAuthor {

‎src/SpaceDock/objects/user.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,28 @@ type User struct {
3535
}
3636

3737
func (s *User) AfterFind() {
38+
SpaceDock.DBRecursionLock.Lock()
3839
if _, ok := SpaceDock.DBRecursion[utils.CurrentGoroutineID()]; !ok {
3940
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] = 0
4041
}
41-
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == SpaceDock.DBRecursionMax {
42+
if SpaceDock.DBRecursion[utils.CurrentGoroutineID()] >= SpaceDock.DBRecursionMax {
43+
SpaceDock.DBRecursionLock.Unlock()
4244
return
4345
}
4446
isRoot := SpaceDock.DBRecursion[utils.CurrentGoroutineID()] == 0
4547
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] += 1
48+
SpaceDock.DBRecursionLock.Unlock()
49+
4650
SpaceDock.Database.Model(s).Related(&(s.Roles), "Roles")
4751
SpaceDock.Database.Model(s).Related(&(s.SharedAuthors), "SharedAuthors")
4852
SpaceDock.Database.Model(s).Related(&(s.Following), "Following")
53+
54+
SpaceDock.DBRecursionLock.Lock()
4955
SpaceDock.DBRecursion[utils.CurrentGoroutineID()] -= 1
5056
if isRoot {
5157
delete(SpaceDock.DBRecursion, utils.CurrentGoroutineID())
5258
}
59+
SpaceDock.DBRecursionLock.Unlock()
5360
}
5461

5562
func NewUser(name string, email string, password string) *User {

0 commit comments

Comments
 (0)
Please sign in to comment.