diff --git a/pkg/routing/selector/cpuload.go b/pkg/routing/selector/cpuload.go index f84b4a3ce..3c31236f1 100644 --- a/pkg/routing/selector/cpuload.go +++ b/pkg/routing/selector/cpuload.go @@ -27,21 +27,13 @@ type CPULoadSelector struct { } func (s *CPULoadSelector) filterNodes(nodes []*livekit.Node) ([]*livekit.Node, error) { - nodes = GetAvailableNodes(nodes) - if len(nodes) == 0 { - return nil, ErrNoAvailableNodes + nodes, err := FilterNodesByCriteria(nodes, s.CPULoadLimit, func(node *livekit.Node) float32 { + return node.Stats.CpuLoad + }) + if err != nil { + return nil, err } - nodesLowLoad := make([]*livekit.Node, 0) - for _, node := range nodes { - stats := node.Stats - if stats.CpuLoad < s.CPULoadLimit { - nodesLowLoad = append(nodesLowLoad, node) - } - } - if len(nodesLowLoad) > 0 { - nodes = nodesLowLoad - } return nodes, nil } diff --git a/pkg/routing/selector/nodesfilter.go b/pkg/routing/selector/nodesfilter.go new file mode 100644 index 000000000..3dd49d3b5 --- /dev/null +++ b/pkg/routing/selector/nodesfilter.go @@ -0,0 +1,21 @@ +package selector + +import "github.com/livekit/protocol/livekit" + +func FilterNodesByCriteria(nodes []*livekit.Node, criteriaThreshold float32, calculateCriteriaFunc func(*livekit.Node) float32) ([]*livekit.Node, error) { + nodes = GetAvailableNodes(nodes) + if len(nodes) == 0 { + return nil, ErrNoAvailableNodes + } + + filteredNodes := make([]*livekit.Node, 0) + for _, node := range nodes { + if calculateCriteriaFunc(node) < criteriaThreshold { + filteredNodes = append(filteredNodes, node) + } + } + if len(filteredNodes) > 0 { + nodes = filteredNodes + } + return nodes, nil +} diff --git a/pkg/routing/selector/sysload.go b/pkg/routing/selector/sysload.go index 285fca493..88af4a19c 100644 --- a/pkg/routing/selector/sysload.go +++ b/pkg/routing/selector/sysload.go @@ -27,20 +27,11 @@ type SystemLoadSelector struct { } func (s *SystemLoadSelector) filterNodes(nodes []*livekit.Node) ([]*livekit.Node, error) { - nodes = GetAvailableNodes(nodes) - if len(nodes) == 0 { - return nil, ErrNoAvailableNodes + nodes, err := FilterNodesByCriteria(nodes, s.SysloadLimit, GetNodeSysload) + if err != nil { + return nil, err } - nodesLowLoad := make([]*livekit.Node, 0) - for _, node := range nodes { - if GetNodeSysload(node) < s.SysloadLimit { - nodesLowLoad = append(nodesLowLoad, node) - } - } - if len(nodesLowLoad) > 0 { - nodes = nodesLowLoad - } return nodes, nil }