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