mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2024-12-14 11:57:51 +00:00
nfd-master: implement ratelimiter for nfd api updates
Implement a naive ratelimiter for node update events originating from the nfd API. We might get a ton of events in short interval. The simplest example is startup when we get a separate Add event for every NodeFeature and NodeFeatureRule object. Without rate limiting we run "update all nodes" separately for each NodeFeatureRule object, plus, we would run "update node X" separately for each NodeFeature object targeting node X. This is a huge amount of wasted work because in principle just running "update all nodes" once should be enough.
This commit is contained in:
parent
ee0807da66
commit
740e3af681
1 changed files with 23 additions and 5 deletions
|
@ -259,16 +259,34 @@ func (m *nfdMaster) runGrpcServer(errChan chan<- error) {
|
|||
|
||||
// nfdAPIUpdateHandler handles events from the nfd API controller.
|
||||
func (m *nfdMaster) nfdAPIUpdateHandler() {
|
||||
updateAll := false
|
||||
updateNodes := make(map[string]struct{})
|
||||
rateLimit := time.After(time.Second)
|
||||
for {
|
||||
select {
|
||||
case <-m.nfdController.updateAllNodesChan:
|
||||
if err := m.nfdAPIUpdateAllNodes(); err != nil {
|
||||
klog.Error(err)
|
||||
}
|
||||
updateAll = true
|
||||
case nodeName := <-m.nfdController.updateOneNodeChan:
|
||||
if err := m.nfdAPIUpdateOneNode(nodeName); err != nil {
|
||||
klog.Error(err)
|
||||
updateNodes[nodeName] = struct{}{}
|
||||
case <-rateLimit:
|
||||
// Check what we need to do
|
||||
// TODO: we might want to update multiple nodes in parallel
|
||||
if updateAll {
|
||||
if err := m.nfdAPIUpdateAllNodes(); err != nil {
|
||||
klog.Error(err)
|
||||
}
|
||||
} else {
|
||||
for nodeName := range updateNodes {
|
||||
if err := m.nfdAPIUpdateOneNode(nodeName); err != nil {
|
||||
klog.Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reset "work queue" and timer
|
||||
updateAll = false
|
||||
updateNodes = make(map[string]struct{})
|
||||
rateLimit = time.After(time.Second)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue