Your Question
Eventually I am having the following error, but I have not been able to reproduce it in a case, what am I doing wrong? , Thank you very much in advance :
fatal error: concurrent map writes
goroutine 146 [running]:
runtime.throw(0x17046ac, 0x15)
/opt/go/sdk/src/runtime/panic.go:1112 +0x72 fp=0xc0008b0f70 sp=0xc0008b0f40 pc=0x440c82
runtime.mapassign_faststr(0x1537d40, 0xc00053d620, 0xc0003d50e0, 0x17, 0xf)
/opt/go/sdk/src/runtime/map_faststr.go:291 +0x510 fp=0xc0008b0ff0 sp=0xc0008b0f70 pc=0x41dd40
gorm.io/gorm/schema.(*Schema).parseRelation(0xc0008c2700, 0xc0008cad80)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/relationship.go:89 +0x794 fp=0xc0008b1290 sp=0xc0008b0ff0 pc=0xd87fc4
gorm.io/gorm/schema.Parse(0x15cab60, 0xc00056c500, 0xc00048ade0, 0x1a9cd40, 0xc00059c9a0, 0x0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/schema.go:212 +0x2856 fp=0xc0008b1e60 sp=0xc0008b1290 pc=0xd92bd6
gorm.io/gorm/schema.(*Schema).parseRelation(0xc0008c21c0, 0xc0008c7500)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/relationship.go:69 +0x3eb fp=0xc0008b2100 sp=0xc0008b1e60 pc=0xd87c1b
gorm.io/gorm/schema.Parse(0x15fccc0, 0xc0006ba600, 0xc00048ade0, 0x1a9cd40, 0xc00059c9a0, 0x0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/schema.go:212 +0x2856 fp=0xc0008b2cd0 sp=0xc0008b2100 pc=0xd92bd6
gorm.io/gorm/schema.(*Schema).parseRelation(0xc0004dfc00, 0xc0008c4a80)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/relationship.go:69 +0x3eb fp=0xc0008b2f70 sp=0xc0008b2cd0 pc=0xd87c1b
gorm.io/gorm/schema.Parse(0x15fc9c0, 0xc000572f00, 0xc00048ade0, 0x1a9cd40, 0xc00059c9a0, 0x0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/schema.go:212 +0x2856 fp=0xc0008b3b40 sp=0xc0008b2f70 pc=0xd92bd6
gorm.io/gorm/schema.(*Schema).parseRelation(0xc0004df880, 0xc0008bef00)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/relationship.go:69 +0x3eb fp=0xc0008b3de0 sp=0xc0008b3b40 pc=0xd87c1b
gorm.io/gorm/schema.Parse(0xc0001e7500, 0xc0006aba40, 0xc00048ade0, 0x1a9cd40, 0xc00059c9a0, 0x0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/schema.go:212 +0x2856 fp=0xc0008b49b0 sp=0xc0008b3de0 pc=0xd92bd6
gorm.io/gorm/schema.(*Schema).parseRelation(0xc0004b6e00, 0xc000535e00)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/relationship.go:69 +0x3eb fp=0xc0008b4c50 sp=0xc0008b49b0 pc=0xd87c1b
gorm.io/gorm/schema.Parse(0x1484100, 0xc0004888a0, 0xc00048ade0, 0x1a9cd40, 0xc00059c9a0, 0x0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/schema/schema.go:212 +0x2856 fp=0xc0008b5820 sp=0xc0008b4c50 pc=0xd92bd6
gorm.io/gorm.(*Statement).Parse(0xc0004b4340, 0x1484100, 0xc0004888a0, 0x0, 0x0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/statement.go:332 +0xb7 fp=0xc0008b58a8 sp=0xc0008b5820 pc=0xdc2a77
gorm.io/gorm.(*processor).Execute(0xc000486bc0, 0xc00048a4e0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/callbacks.go:84 +0xe1 fp=0xc0008b5a48 sp=0xc0008b58a8 pc=0xda9791
gorm.io/gorm.(*DB).Count(0xc00048a4e0, 0xc00042b608, 0xc00048a4e0)
/usr/opt/jtrack/jetrows-go/vendor/gorm.io/gorm/finisher_api.go:287 +0x221 fp=0xc0008b5f80 sp=0xc0008b5a48 pc=0xdb2d41
github.com/efrengarcial/framework/internal/platform/database.countRecords(0xc000457b90, 0x1484100, 0xc0004888a0, 0xc000284fc0, 0xc00042b608)
/usr/opt/jtrack/jetrows-go/internal/platform/database/pagging.go:76 +0x5c fp=0xc0008b5fb8 sp=0xc0008b5f80 pc=0x117305c
runtime.goexit()
/opt/go/sdk/src/runtime/asm_amd64.s:1373 +0x1 fp=0xc0008b5fc0 sp=0xc0008b5fb8 pc=0x4747c1
created by github.com/efrengarcial/framework/internal/platform/database.Pagging
/usr/opt/jtrack/jetrows-go/internal/platform/database/pagging.go:33 +0x263
I enclose part of the code where it is failing:
func Pagging(p *Param, data interface{}) (*domain.Pagination, error) {
db := p.DB
if p.ShowSQL {
db = db.Debug()
}
if p.Page < 1 {
p.Page = 1
} else {
p.Page = p.Page + 1
}
if p.Limit == 0 {
p.Limit = 30
}
done := make(chan bool, 1)
var pagination domain.Pagination
var count int64
var offset int
db = db.Session(&gorm.Session{WithConditions: true})
go countRecords(db, data, done, &count)
if len(p.OrderBy) > 0 {
for _, order := range p.OrderBy {
db = db.Order(order)
}
}
if p.Page == 1 {
offset = 0
} else {
offset = (p.Page - 1) * p.Limit
}
if err := db.Limit(p.Limit).Offset(offset).Find(data).Error; err != nil {
<-done
return nil, errors.WithStack(err)
}
<-done
pagination.Count = count
pagination.Records = data
pagination.Page = p.Page
pagination.Offset = offset
pagination.Limit = p.Limit
pagination.Pages = int(math.Ceil(float64(count) / float64(p.Limit)))
if p.Page > 1 {
pagination.PrevPage = p.Page - 1
} else {
pagination.PrevPage = p.Page
}
if p.Page >= pagination.Pages {
pagination.NextPage = p.Page
} else {
pagination.NextPage = p.Page + 1
}
return &pagination, nil
}
func countRecords(db *gorm.DB, data interface{}, done chan bool, count *int64) {
db.Model(data).Count(count)
done <- true
}
Expected answer
Comment From: zhwei820
reacurred in v1.23.1 @jinzhu can not reproduce either.
fatal error: concurrent map writes
goroutine 225 [running]:
runtime.throw({0x1511824, 0x4})
/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc002278028 sp=0xc002277ff8 pc=0x437491
runtime.mapassign_faststr(0xc001ba65a0, 0x1829e88, {0xc00225da50, 0x10})
/usr/local/go/src/runtime/map_faststr.go:211 +0x39c fp=0xc002278090 sp=0xc002278028 pc=0x414c3c
gorm.io/gorm/schema.(*Schema).parseRelation(0xc001ba65a0, 0xc0022410e0)
/go/pkg/mod/gorm.io/gorm@v1.23.1/schema/relationship.go:97 +0x592 fp=0xc002278168 sp=0xc002278090 pc=0xbf0eb2
gorm.io/gorm/schema.ParseWithSpecialTableName({0x124fe60, 0xc0021e7de8}, 0xc001861a10, {0x187a9a0, 0xc0018619b0}, {0x0, 0x0})
/go/pkg/mod/gorm.io/gorm@v1.23.1/schema/schema.go:275 +0x2105 fp=0xc0022789c8 sp=0xc002278168 pc=0xbf8de5
gorm.io/gorm.(*Statement).ParseWithSpecialTableName(0xc001bfbc00, {0x124fe60, 0xc0021e7de8}, {0x0, 0x0})
/go/pkg/mod/gorm.io/gorm@v1.23.1/statement.go:474 +0x67 fp=0xc002278a50 sp=0xc0022789c8 pc=0xc1f787
gorm.io/gorm.(*Statement).Parse(...)
/go/pkg/mod/gorm.io/gorm@v1.23.1/statement.go:470
gorm.io/gorm.(*processor).Execute(0xc00050eb90, 0xc001bfbc00)
/go/pkg/mod/gorm.io/gorm@v1.23.1/callbacks.go:105 +0x1bb fp=0xc002278b40 sp=0xc002278a50 pc=0xc05a7b
gorm.io/gorm.(*DB).Find(0x62307dea, {0x124fe60, 0xc0021e7de8}, {0x0, 0x0, 0x0})
/go/pkg/mod/gorm.io/gorm@v1.23.1/finisher_api.go:166 +0x13c fp=0xc002278ba8 sp=0xc002278b40 pc=0xc0cc9c