diff --git a/backend/utils/id/logid.go b/backend/utils/id/logid.go index d49053df..9e090a6d 100644 --- a/backend/utils/id/logid.go +++ b/backend/utils/id/logid.go @@ -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 { diff --git a/backend/utils/id/logid_test.go b/backend/utils/id/logid_test.go new file mode 100644 index 00000000..9f576a91 --- /dev/null +++ b/backend/utils/id/logid_test.go @@ -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() +}