diff --git a/internal/metadata/actioner/reserved_ipv6_actioner.go b/internal/metadata/actioner/reserved_ipv6_actioner.go index 9edb911..123b217 100644 --- a/internal/metadata/actioner/reserved_ipv6_actioner.go +++ b/internal/metadata/actioner/reserved_ipv6_actioner.go @@ -11,29 +11,32 @@ import ( ) const ( - rip6LogPrefix string = "[Reserved IPv6 Actioner]" + logPrefix string = "[Reserved IPv6 Actioner]" ) // NewReservedIPv6Actioner returns a new DigitalOcean Reserved IPv6 actioner func NewReservedIPv6Actioner(mgr reservedipv6.Manager) MetadataActioner { return &reservedIPv6Actioner{ - mgr: mgr, - allDone: make(chan struct{}, 1), + mgr: mgr, + activeActions: &atomic.Uint32{}, + closing: &atomic.Bool{}, + allDone: make(chan struct{}, 1), } } type reservedIPv6Actioner struct { mgr reservedipv6.Manager - activeActions int32 - closing uint32 + activeActions *atomic.Uint32 + closing *atomic.Bool allDone chan struct{} } func (da *reservedIPv6Actioner) Do(md *metadata.Metadata) { - atomic.AddInt32(&da.activeActions, 1) + da.activeActions.Add(1) defer func() { - ret := atomic.AddInt32(&da.activeActions, -1) - if ret == 0 && atomic.LoadUint32(&da.closing) == 1 { + // decrement active counter, then check shutdown state + ret := da.activeActions.Add(^uint32(0)) + if ret == 0 && da.closing.Load() { close(da.allDone) } }() @@ -41,27 +44,48 @@ func (da *reservedIPv6Actioner) Do(md *metadata.Metadata) { ipv6 := md.ReservedIP.IPv6 if ipv6.Active { - log.Info("%s Attempting to assign Reserved IPv6 address '%s'", rip6LogPrefix, ipv6.IPAddress) + logDebug("Attempting to assign Reserved IPv6 address '%s'", ipv6.IPAddress) if err := da.mgr.Assign(ipv6.IPAddress); err != nil { - log.Error("%s failed to assign Reserved IPv6 address '%s': %v", rip6LogPrefix, ipv6.IPAddress, err) + logError("failed to assign Reserved IPv6 address '%s': %v", ipv6.IPAddress, err) + return } - log.Info("%s Assigned Reserved IPv6 address '%s'", rip6LogPrefix, ipv6.IPAddress) + logInfo("Assigned Reserved IPv6 address '%s'", ipv6.IPAddress) } else { - log.Info("%s Attempting to unassign all Reserved IPv6 addresses", rip6LogPrefix) + logDebug("Attempting to unassign all Reserved IPv6 addresses") if err := da.mgr.Unassign(); err != nil { - log.Error("%s failed to unassign all Reserved IPv6 addresses: %v", rip6LogPrefix, err) + logError("failed to unassign all Reserved IPv6 addresses: %v", err) + return } - log.Info("%s Unassigned all Reserved IPv6 addresses", rip6LogPrefix) + logInfo("Unassigned all Reserved IPv6 addresses") } } func (da *reservedIPv6Actioner) Shutdown() { - log.Info("%s Shutting down", rip6LogPrefix) - atomic.StoreUint32(&da.closing, 1) - if atomic.LoadInt32(&da.activeActions) != 0 { - // if there are still jobs in progress, wait for them to finish - log.Debug("%s Waiting for jobs in progress", rip6LogPrefix) + logInfo("Shutting down") + da.closing.Store(true) + + // if there are still jobs in progress, wait for them to finish + if da.activeActions.Load() > 0 { + logDebug("Waiting for jobs in progress") <-da.allDone } - log.Info("%s Bye-bye", rip6LogPrefix) + logInfo("Bye-bye") +} + +// logInfo wraps log.Info with rip6LogPrefix +func logInfo(format string, params ...any) { + msg := logPrefix + " " + format + log.Info(msg, params) +} + +// logDebug wraps log.Debug with rip6LogPrefix +func logDebug(format string, params ...any) { + msg := logPrefix + " " + format + log.Debug(msg, params) +} + +// logError wraps log.Error with rip6LogPrefix +func logError(format string, params ...any) { + msg := logPrefix + " " + format + log.Error(msg, params) } diff --git a/internal/reservedipv6/reserved_ipv6.go b/internal/reservedipv6/reserved_ipv6.go index 040766b..faf9b53 100644 --- a/internal/reservedipv6/reserved_ipv6.go +++ b/internal/reservedipv6/reserved_ipv6.go @@ -11,8 +11,6 @@ import ( ) const ( - logPrefix string = "[Reserved IPv6 Manager]" - loIface string = "lo" eth0Iface string = "eth0" prefixLen uint8 = 128 @@ -75,7 +73,7 @@ func (m *mgr) Assign(ip string) error { func (m *mgr) Unassign() error { addrs, err := m.nlConn.Address.List() if err != nil { - fmt.Errorf("failed to list addreses: %w", err) + return fmt.Errorf("failed to list addreses: %w", err) } for _, a := range addrs {