Abstract the cleanup logic and add helper for cache valid.

This commit is contained in:
2025-02-24 12:02:12 +00:00
parent 2743b0e024
commit 0f8b7f7ab1
3 changed files with 25 additions and 23 deletions
+18
View File
@@ -0,0 +1,18 @@
package traefikoidc
import "time"
// autoCleanupRoutine runs a ticker that calls the provided cleanup function at the specified interval.
// It stops when a value is received on the stop channel.
func autoCleanupRoutine(interval time.Duration, stop <-chan struct{}, cleanup func()) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
cleanup()
case <-stop:
return
}
}
}
+1 -10
View File
@@ -178,16 +178,7 @@ func (c *Cache) removeItem(key string) {
// startAutoCleanup initiates a goroutine that periodically cleans up expired cache items.
func (c *Cache) startAutoCleanup() {
ticker := time.NewTicker(c.autoCleanupInterval)
for {
select {
case <-ticker.C:
c.Cleanup()
case <-c.stopCleanup:
ticker.Stop()
return
}
}
autoCleanupRoutine(c.autoCleanupInterval, c.stopCleanup, c.Cleanup)
}
// Close terminates the auto cleanup goroutine.
+6 -13
View File
@@ -34,11 +34,13 @@ func (c *MetadataCache) Cleanup() {
c.metadata = nil
}
}
func (c *MetadataCache) isCacheValid() bool {
return c.metadata != nil && time.Now().Before(c.expiresAt)
}
// GetMetadata retrieves the metadata from cache or fetches it if expired
func (c *MetadataCache) GetMetadata(providerURL string, httpClient *http.Client, logger *Logger) (*ProviderMetadata, error) {
c.mutex.RLock()
if c.metadata != nil && time.Now().Before(c.expiresAt) {
if c.isCacheValid() {
defer c.mutex.RUnlock()
return c.metadata, nil
}
@@ -48,7 +50,7 @@ func (c *MetadataCache) GetMetadata(providerURL string, httpClient *http.Client,
defer c.mutex.Unlock()
// Double-check after acquiring write lock
if c.metadata != nil && time.Now().Before(c.expiresAt) {
if c.isCacheValid() {
return c.metadata, nil
}
@@ -79,16 +81,7 @@ func (c *MetadataCache) GetMetadata(providerURL string, httpClient *http.Client,
}
func (c *MetadataCache) startAutoCleanup() {
ticker := time.NewTicker(c.autoCleanupInterval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
c.Cleanup()
case <-c.stopCleanup:
return
}
}
autoCleanupRoutine(c.autoCleanupInterval, c.stopCleanup, c.Cleanup)
}
func (c *MetadataCache) Close() {