fix(loadbalance): 添加 hostnameOnce 确保并发安全
Target 结构体添加 sync.Once 字段,确保 hostname 初始化的并发安全 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d0396a3854
commit
bdf615c585
@ -20,6 +20,7 @@ import (
|
|||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -42,6 +43,7 @@ type Target struct {
|
|||||||
resolvedIPs atomic.Pointer[[]string]
|
resolvedIPs atomic.Pointer[[]string]
|
||||||
URL string
|
URL string
|
||||||
hostname string
|
hostname string
|
||||||
|
hostnameOnce sync.Once
|
||||||
VirtualHashes []uint64
|
VirtualHashes []uint64
|
||||||
Weight int
|
Weight int
|
||||||
Connections int64
|
Connections int64
|
||||||
@ -373,11 +375,9 @@ func (i *IPHash) SelectExcludingByIP(targets []*Target, excluded []*Target, clie
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Hostname 返回目标主机名(从 URL 提取)。
|
// Hostname 返回目标主机名(从 URL 提取)。
|
||||||
// 如果 hostname 未初始化,会自动调用 initHostname。
|
// 使用 sync.Once 确保线程安全,只初始化一次。
|
||||||
func (t *Target) Hostname() string {
|
func (t *Target) Hostname() string {
|
||||||
if t.hostname == "" {
|
t.hostnameOnce.Do(t.initHostname)
|
||||||
t.initHostname()
|
|
||||||
}
|
|
||||||
return t.hostname
|
return t.hostname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user