@@ -24,6 +24,12 @@ import (
2424 "time"
2525)
2626
27+ // nodeIP represents an IP address acquired by a node.
28+ type nodeIP struct {
29+ addr netip.Addr
30+ creationTimestamp time.Time
31+ }
32+
2733// node represents a node in the binary tree.
2834type node struct {
2935 lastUpdate time.Time
@@ -33,7 +39,7 @@ type node struct {
3339 left * node
3440 right * node
3541
36- ips []netip. Addr
42+ ips []nodeIP
3743 lastip netip.Addr
3844}
3945
@@ -149,7 +155,7 @@ func listNetworks(node *node) []netip.Prefix {
149155
150156func (n * node ) isAllocatedIP (ip netip.Addr ) bool {
151157 for i := range n .ips {
152- if n .ips [i ].Compare (ip ) == 0 {
158+ if n .ips [i ].addr . Compare (ip ) == 0 {
153159 return true
154160 }
155161 }
@@ -181,7 +187,7 @@ func (n *node) ipAcquire() *netip.Addr {
181187 addr = n .prefix .Addr ()
182188 }
183189 if ! n .isAllocatedIP (addr ) {
184- n .ips = append (n .ips , addr )
190+ n .ips = append (n .ips , nodeIP { addr : addr , creationTimestamp : time . Now ()} )
185191 n .lastip = addr
186192 n .lastUpdate = time .Now ()
187193 return & addr
@@ -201,31 +207,30 @@ func (n *node) allocateIPWithAddr(addr netip.Addr) *netip.Addr {
201207 }
202208
203209 for i := range n .ips {
204- if n .ips [i ].Compare (addr ) == 0 {
210+ if n .ips [i ].addr . Compare (addr ) == 0 {
205211 return nil
206212 }
207213 }
208214
209- n .ips = append (n .ips , addr )
215+ n .ips = append (n .ips , nodeIP { addr : addr , creationTimestamp : time . Now ()} )
210216 n .lastUpdate = time .Now ()
211217
212- return & n .ips [len (n .ips )- 1 ]
218+ return & n .ips [len (n .ips )- 1 ]. addr
213219}
214220
215221func (n * node ) ipRelease (ip netip.Addr , gracePeriod time.Duration ) * netip.Addr {
216222 if ! n .acquired {
217223 return nil
218224 }
219225
220- if ! n .lastUpdate .Add (gracePeriod ).Before (time .Now ()) {
221- return nil
222- }
223-
224- for i , addr := range n .ips {
225- if addr .Compare (ip ) == 0 {
226+ for i , nodeIP := range n .ips {
227+ if ! nodeIP .creationTimestamp .Add (gracePeriod ).Before (time .Now ()) {
228+ continue
229+ }
230+ if nodeIP .addr .Compare (ip ) == 0 {
226231 n .ips = append (n .ips [:i ], n .ips [i + 1 :]... )
227232 n .lastUpdate = time .Now ()
228- return & addr
233+ return & nodeIP . addr
229234 }
230235 }
231236 return nil
@@ -351,12 +356,11 @@ func (n *node) toGraphvizRecursive(sb *strings.Builder) {
351356 if n == nil {
352357 return
353358 }
354- label := n .lastUpdate .Format (time .TimeOnly )
355- label += "\\ n" + n .prefix .String ()
359+ label := n .prefix .String ()
356360 if len (n .ips ) > 0 {
357361 ipsString := []string {}
358362 for i := range n .ips {
359- ipsString = append (ipsString , n .ips [i ].String ())
363+ ipsString = append (ipsString , n .ips [i ].addr . String ())
360364 }
361365 label += "\\ n" + strings .Join (ipsString , "\\ n" )
362366 }
0 commit comments