diff --git a/pkg/utils/idutils/id_utils.go b/pkg/utils/idutils/id_utils.go index 42c4a9967..4095ea82a 100644 --- a/pkg/utils/idutils/id_utils.go +++ b/pkg/utils/idutils/id_utils.go @@ -28,7 +28,6 @@ import ( ) var sf *sonyflake.Sonyflake -var upperMachineID uint16 func init() { var st sonyflake.Settings @@ -37,11 +36,18 @@ func init() { sf = sonyflake.NewSonyflake(sonyflake.Settings{ MachineID: lower16BitIP, }) - upperMachineID, _ = upper16BitIP() + } + if sf == nil { + sf = sonyflake.NewSonyflake(sonyflake.Settings{ + MachineID: lower16BitIPv6, + }) } } func GetIntId() uint64 { + if sf == nil { + panic(errors.New("invalid snowflake instance")) + } id, err := sf.NextID() if err != nil { panic(err) @@ -93,15 +99,6 @@ func lower16BitIP() (uint16, error) { return uint16(ip[2])<<8 + uint16(ip[3]), nil } -func upper16BitIP() (uint16, error) { - ip, err := IPv4() - if err != nil { - return 0, err - } - - return uint16(ip[0])<<8 + uint16(ip[1]), nil -} - func IPv4() (net.IP, error) { as, err := net.InterfaceAddrs() if err != nil { @@ -123,3 +120,34 @@ func IPv4() (net.IP, error) { } return nil, errors.New("no ip address") } + +func lower16BitIPv6() (uint16, error) { + ip, err := IPv6() + if err != nil { + return 0, err + } + return uint16(ip[14])<<8 + uint16(ip[15]), nil +} +func IPv6() (net.IP, error) { + as, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + + for _, a := range as { + ipnet, ok := a.(*net.IPNet) + if !ok || ipnet.IP.IsLoopback() { + continue + } + if ipnet.IP.To4() != nil { + continue + } + ip := ipnet.IP.To16() + if ip == nil { + continue + } + return ip, nil + + } + return nil, errors.New("no ip address") +}