优化:实现配置写时复制(CoW),修复并发读写风险与全局状态同步问题(by AI)
This commit is contained in:
parent
ae0cd90904
commit
0ae27f613a
21
Discover.go
21
Discover.go
@ -380,16 +380,29 @@ var numberMatcher = regexp.MustCompile(`^\d+(s|ms|us|µs|ns?)?$`)
|
|||||||
func (d *Discoverer) addApp(app, callConf string, fetch bool) bool {
|
func (d *Discoverer) addApp(app, callConf string, fetch bool) bool {
|
||||||
d.appLock.Lock()
|
d.appLock.Lock()
|
||||||
conf := d.GetConfig()
|
conf := d.GetConfig()
|
||||||
if conf.Calls == nil {
|
|
||||||
conf.Calls = make(map[string]string)
|
// 1. 写时复制(Copy-on-Write):创建一个全新的 Map 避免影响读操作
|
||||||
|
newCalls := make(map[string]string)
|
||||||
|
for k, v := range conf.Calls {
|
||||||
|
newCalls[k] = v
|
||||||
}
|
}
|
||||||
if conf.Calls[app] == callConf && d.appNodes[app] != nil {
|
|
||||||
|
if newCalls[app] == callConf && d.appNodes[app] != nil {
|
||||||
d.appLock.Unlock()
|
d.appLock.Unlock()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
conf.Calls[app] = callConf
|
|
||||||
|
newCalls[app] = callConf
|
||||||
|
conf.Calls = newCalls // 将新的 Map 赋值给 ConfigStruct
|
||||||
|
|
||||||
|
// 2. 更新实例配置
|
||||||
d.SetConfig(conf)
|
d.SetConfig(conf)
|
||||||
|
|
||||||
|
// 3. 如果是默认的全局实例,保持包级全局配置同步
|
||||||
|
if d == DefaultDiscoverer {
|
||||||
|
SetConfig(conf)
|
||||||
|
}
|
||||||
|
|
||||||
callInfo := &callInfoType{
|
callInfo := &callInfoType{
|
||||||
Timeout: 10 * time.Second,
|
Timeout: 10 * time.Second,
|
||||||
HttpVersion: 2,
|
HttpVersion: 2,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user