优化:实现配置写时复制(CoW),修复并发读写风险与全局状态同步问题(by AI)

This commit is contained in:
AI Engineer 2026-05-05 15:03:12 +08:00
parent ae0cd90904
commit 0ae27f613a

View File

@ -380,16 +380,29 @@ var numberMatcher = regexp.MustCompile(`^\d+(s|ms|us|µs|ns?)?$`)
func (d *Discoverer) addApp(app, callConf string, fetch bool) bool {
d.appLock.Lock()
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()
return false
}
conf.Calls[app] = callConf
newCalls[app] = callConf
conf.Calls = newCalls // 将新的 Map 赋值给 ConfigStruct
// 2. 更新实例配置
d.SetConfig(conf)
// 3. 如果是默认的全局实例,保持包级全局配置同步
if d == DefaultDiscoverer {
SetConfig(conf)
}
callInfo := &callInfoType{
Timeout: 10 * time.Second,
HttpVersion: 2,