Resolved Conflict [release-3.3] Fix id generate error in IPv6-only environment. #5459 Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> Co-authored-by: isyes <isyes@foxmail.com>
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user