11package util
22
33import (
4+ "errors"
45 "fmt"
56 "github.com/sony/sonyflake"
7+ "go.uber.org/zap"
68 "net"
79 "os"
810 "strconv"
@@ -11,28 +13,64 @@ import (
1113)
1214
1315var (
14- sf * sonyflake. Sonyflake
16+ sf provider
1517 sfOnce sync.Once
1618)
1719
1820func NextID () uint64 {
19- ensureProvider ()
20- id , _ := sf .NextID ()
21+ EnsureIDProvider ()
22+ id , err := sf .NextID ()
23+ if err != nil {
24+ panic (err )
25+ }
2126 return id
2227}
2328
24- func ensureProvider () {
29+ type provider interface {
30+ NextID () (uint64 , error )
31+ }
32+
33+ type errorProvider struct {
34+ err error
35+ }
36+
37+ func (e errorProvider ) NextID () (uint64 , error ) {
38+ return 0 , fmt .Errorf ("unable to generate ID, sonyflake not configured properly: %w" , e .err )
39+ }
40+
41+ func EnsureIDProvider () {
2542 sfOnce .Do (func () {
26- sfInstance , err := sonyflake .New (sonyflake.Settings {
27- MachineID : machineID (),
28- StartTime : time .Date (2022 , 05 , 01 , 00 , 0 , 0 , 0 , time .UTC ),
43+ sf = createIDProvider ()
44+ })
45+ }
46+
47+ func createIDProvider () provider {
48+ startTime := time .Date (2022 , 05 , 01 , 00 , 0 , 0 , 0 , time .UTC )
49+
50+ sfInstance , err := sonyflake .New (sonyflake.Settings {
51+ MachineID : machineID (),
52+ StartTime : startTime ,
53+ })
54+
55+ if err != nil && errors .Is (err , sonyflake .ErrNoPrivateAddress ) {
56+ id := RandUint16 ()
57+ zap .L ().Warn ("failed to generate sonyflake machine id from private ip address, using a random machine id" , zap .Uint16 ("id" , id ))
58+
59+ sfInstance , err = sonyflake .New (sonyflake.Settings {
60+ MachineID : func () (uint16 , error ) { return id , nil },
61+ StartTime : startTime ,
2962 })
63+
3064 if err != nil {
31- panic ( "unable to initialize sonyflake: " + err . Error ())
65+ return errorProvider { err }
3266 }
67+ }
3368
34- sf = sfInstance
35- })
69+ if err != nil {
70+ return errorProvider {err }
71+ }
72+
73+ return sfInstance
3674}
3775
3876func machineID () func () (uint16 , error ) {
0 commit comments