fix(id): 使用sync.Once与sync.RWMutex消除getLocalIP并发数据竞争
Some checks are pending
Security Checks / security (push) Waiting to run
Some checks are pending
Security Checks / security (push) Waiting to run
This commit is contained in:
parent
9a6751ef2d
commit
44111ae659
@ -7,32 +7,38 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var ip_instance string
|
||||
var (
|
||||
ipInstance string
|
||||
ipOnce sync.Once
|
||||
ipMu sync.RWMutex
|
||||
)
|
||||
|
||||
func getLocalIP() string {
|
||||
if ip_instance != "" {
|
||||
return ip_instance
|
||||
}
|
||||
|
||||
ip := "127.0.0.1"
|
||||
addrs, err := net.InterfaceAddrs()
|
||||
if err != nil {
|
||||
ip_instance = ip
|
||||
return ip
|
||||
}
|
||||
for _, a := range addrs {
|
||||
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
||||
if ipnet.IP.To4() != nil {
|
||||
ip = ipnet.IP.String()
|
||||
break
|
||||
ipOnce.Do(func() {
|
||||
ip := "127.0.0.1"
|
||||
addrs, err := net.InterfaceAddrs()
|
||||
if err == nil {
|
||||
for _, a := range addrs {
|
||||
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
||||
if ipnet.IP.To4() != nil {
|
||||
ip = ipnet.IP.String()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ip_instance = ip
|
||||
return ip
|
||||
ipMu.Lock()
|
||||
ipInstance = ip
|
||||
ipMu.Unlock()
|
||||
})
|
||||
|
||||
ipMu.RLock()
|
||||
defer ipMu.RUnlock()
|
||||
return ipInstance
|
||||
}
|
||||
|
||||
func GenLogID() string {
|
||||
|
||||
31
backend/utils/id/logid_test.go
Normal file
31
backend/utils/id/logid_test.go
Normal file
@ -0,0 +1,31 @@
|
||||
package id
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGetLocalIPConcurrent(t *testing.T) {
|
||||
const goroutines = 50
|
||||
const iterations = 100
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(goroutines)
|
||||
|
||||
for i := 0; i < goroutines; i++ {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for j := 0; j < iterations; j++ {
|
||||
ip := getLocalIP()
|
||||
if ip == "" {
|
||||
t.Errorf("getLocalIP returned empty")
|
||||
}
|
||||
logID := GenLogID()
|
||||
if logID == "" {
|
||||
t.Errorf("GenLogID returned empty")
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user