feat: concurrently check and update all domains #24

Merged
t.behrendt merged 2 commits from feat-concurrency into main 2024-12-30 17:37:50 +01:00

View File

@@ -3,6 +3,7 @@ package realDynDns
import ( import (
"fmt" "fmt"
"log/slog" "log/slog"
"sync"
"time" "time"
"realdnydns/pkg/config" "realdnydns/pkg/config"
@@ -70,10 +71,17 @@ func (c *ChangeDetector) detectAndApplyChanges() (int, error) {
return 0, err return 0, err
} }
var numberUpdated int var wg sync.WaitGroup
numberUpdatedChannel := make(chan int)
for _, domain := range c.domains { for _, domain := range c.domains {
for _, subdomain := range domain.Subdomains { for _, subdomain := range domain.Subdomains {
wg.Add(1)
go func(domain config.DomainConfig, subdomain string) {
defer wg.Done()
c.logger.Info("Checking record", c.logger.Info("Checking record",
slog.String("tld", domain.TLD), slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain), slog.String("subdomain", subdomain),
@@ -85,7 +93,7 @@ func (c *ChangeDetector) detectAndApplyChanges() (int, error) {
slog.String("tld", domain.TLD), slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain), slog.String("subdomain", subdomain),
) )
continue return
} }
if currentRecord.IP != externalIp.String() { if currentRecord.IP != externalIp.String() {
@@ -104,7 +112,7 @@ func (c *ChangeDetector) detectAndApplyChanges() (int, error) {
c.logger.Warn("Failed to send notification", c.logger.Warn("Failed to send notification",
slog.String("error", err.Error()), slog.String("error", err.Error()),
) )
continue return
} }
c.logger.Info("Updating record", c.logger.Info("Updating record",
@@ -120,11 +128,23 @@ func (c *ChangeDetector) detectAndApplyChanges() (int, error) {
slog.String("tld", domain.TLD), slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain), slog.String("subdomain", subdomain),
) )
continue return
} }
numberUpdated++
numberUpdatedChannel <- 1
}
}(domain, subdomain)
} }
} }
go func() {
wg.Wait()
close(numberUpdatedChannel)
}()
numberUpdated := 0
for v := range numberUpdatedChannel {
numberUpdated += v
} }
c.logger.Info("Run completed", slog.Int("number_of_changes", numberUpdated)) c.logger.Info("Run completed", slog.Int("number_of_changes", numberUpdated))