diff --git a/nameserver/zone.go b/nameserver/zone.go index b0c6c82e..7021bb47 100644 --- a/nameserver/zone.go +++ b/nameserver/zone.go @@ -19,8 +19,8 @@ const ( DefaultLocalDomain = "weave.local." // The default name used for the local domain DefaultRefreshInterval = int(localTTL) // Period for background updates with mDNS DefaultRelevantTime = 60 // When to forget info about remote info if nobody asks... + DefaultNumUpdaters = 4 // Default number of background updaters - defaultNumUpdaters = 1 // Number of background updaters defaultRefreshMailbox = 1000 // Number of on-the-fly background queries defaultRemoteIdent = "weave:remote" // Ident used for info obtained from mDNS ) @@ -423,6 +423,8 @@ type ZoneConfig struct { Iface *net.Interface // Refresh interval for local names in the zone database (disabled by default) (in seconds) RefreshInterval int + // Number of background updaters for names + RefreshWorkers int // Forget about remote info if nobody asks for it in this time (in seconds) RelevantTime int // Max pending refresh requests @@ -455,6 +457,7 @@ type zoneDb struct { refreshCloseChan chan bool refreshWg sync.WaitGroup refreshInterval time.Duration + refreshWorkers int } // Create a new zone database @@ -475,6 +478,7 @@ func NewZoneDb(config ZoneConfig) (zone *zoneDb, err error) { refreshChan: make(chan refreshRequest, maxRefreshRequests), refreshSchedChan: make(chan refreshRequest, maxRefreshRequests), refreshCloseChan: make(chan bool), + refreshWorkers: DefaultNumUpdaters, } // fix the default configuration parameters @@ -490,6 +494,9 @@ func NewZoneDb(config ZoneConfig) (zone *zoneDb, err error) { if config.RelevantTime > 0 { zone.relevantLimit = time.Duration(config.RelevantTime) * time.Second } + if config.RefreshWorkers > 0 { + zone.refreshWorkers = config.RefreshWorkers + } // Create the mDNS client and server if zone.mdnsCli == nil { @@ -523,8 +530,8 @@ func (zone *zoneDb) Start() (err error) { // Start some name refreshers... if zone.refreshInterval > 0 { - Info.Printf("[zonedb] Starting %d background name updaters", defaultNumUpdaters) - for i := 0; i < defaultNumUpdaters; i++ { + Info.Printf("[zonedb] Starting %d background name updaters", zone.refreshWorkers) + for i := 0; i < zone.refreshWorkers; i++ { zone.refreshWg.Add(1) go zone.updater(i) } diff --git a/weavedns/main.go b/weavedns/main.go index 46d0acf2..2199d204 100644 --- a/weavedns/main.go +++ b/weavedns/main.go @@ -25,6 +25,7 @@ func main() { timeout int udpbuf int refreshInterval int + refreshWorkers int relevantTime int cacheLen int cacheDisabled bool @@ -45,6 +46,7 @@ func main() { flag.BoolVar(&debug, "debug", false, "output debugging info to stderr") // advanced options flag.IntVar(&refreshInterval, "refresh", weavedns.DefaultRefreshInterval, "refresh interval (in secs) for local names (0=disable)") + flag.IntVar(&refreshWorkers, "refresh-workers", weavedns.DefaultNumUpdaters, "default number of background updaters") flag.IntVar(&relevantTime, "relevant", weavedns.DefaultRelevantTime, "life time for info in the absence of queries (in secs)") flag.IntVar(&udpbuf, "udpbuf", weavedns.DefaultUDPBuflen, "UDP buffer length") flag.IntVar(&timeout, "timeout", weavedns.DefaultTimeout, "timeout for resolutions (in millisecs)") @@ -76,6 +78,7 @@ func main() { Domain: domain, Iface: iface, RefreshInterval: refreshInterval, + RefreshWorkers: refreshWorkers, RelevantTime: relevantTime, } zone, err := weavedns.NewZoneDb(zoneConfig)