forked from mirror/gorm
try to fix fatal error: concurrent map read and map write
This commit is contained in:
parent
3b6a7c8aec
commit
6c94b07e98
|
@ -119,20 +119,13 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
|
||||||
// When the schema initialization is completed, the channel will be closed
|
// When the schema initialization is completed, the channel will be closed
|
||||||
defer close(schema.initialized)
|
defer close(schema.initialized)
|
||||||
|
|
||||||
if v, loaded := cacheStore.LoadOrStore(modelType, schema); loaded {
|
if v, loaded := cacheStore.Load(modelType); loaded {
|
||||||
s := v.(*Schema)
|
s := v.(*Schema)
|
||||||
// Wait for the initialization of other goroutines to complete
|
// Wait for the initialization of other goroutines to complete
|
||||||
<-s.initialized
|
<-s.initialized
|
||||||
return s, s.err
|
return s, s.err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if schema.err != nil {
|
|
||||||
logger.Default.Error(context.Background(), schema.err.Error())
|
|
||||||
cacheStore.Delete(modelType)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
for i := 0; i < modelType.NumField(); i++ {
|
for i := 0; i < modelType.NumField(); i++ {
|
||||||
if fieldStruct := modelType.Field(i); ast.IsExported(fieldStruct.Name) {
|
if fieldStruct := modelType.Field(i); ast.IsExported(fieldStruct.Name) {
|
||||||
if field := schema.ParseField(fieldStruct); field.EmbeddedSchema != nil {
|
if field := schema.ParseField(fieldStruct); field.EmbeddedSchema != nil {
|
||||||
|
@ -233,6 +226,20 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v, loaded := cacheStore.LoadOrStore(modelType, schema); loaded {
|
||||||
|
s := v.(*Schema)
|
||||||
|
// Wait for the initialization of other goroutines to complete
|
||||||
|
<-s.initialized
|
||||||
|
return s, s.err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if schema.err != nil {
|
||||||
|
logger.Default.Error(context.Background(), schema.err.Error())
|
||||||
|
cacheStore.Delete(modelType)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded {
|
if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded {
|
||||||
for _, field := range schema.Fields {
|
for _, field := range schema.Fields {
|
||||||
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
||||||
|
|
Loading…
Reference in New Issue