Skip to content

Commit

Permalink
chore: Refactor LoadBalancer struct and related code to use LoadBalan…
Browse files Browse the repository at this point in the history
…cerNode instead of BackendNode
  • Loading branch information
ksysoev committed Jun 22, 2024
1 parent 470261e commit e6d21e1
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
14 changes: 8 additions & 6 deletions backend/loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,28 @@ import (

var ErrNotEnoughBackends = fmt.Errorf("load balancer requires at least 2 backends")

type BackendNode struct {
const minRequiredBackends = 2

type LoadBalancerNode struct {
backend wasabi.RequestHandler
counter atomic.Int32
}

type LoadBalancer struct {
backends []*BackendNode
backends []*LoadBalancerNode
}

// NewLoadBalancer creates a new instance of LoadBalancer with the given backends.
// It takes a slice of RequestHandler as a parameter and returns a new instance of LoadBalancer.
func NewLoadBalancer(backends []wasabi.RequestHandler) (*LoadBalancer, error) {
if len(backends) < 2 {
if len(backends) < minRequiredBackends {
return nil, ErrNotEnoughBackends
}

nodes := make([]*BackendNode, len(backends))
nodes := make([]*LoadBalancerNode, len(backends))

for i, backend := range backends {
nodes[i] = &BackendNode{
nodes[i] = &LoadBalancerNode{
backend: backend,
counter: atomic.Int32{},
}
Expand All @@ -52,7 +54,7 @@ func (lb *LoadBalancer) Handle(conn wasabi.Connection, r wasabi.Request) error {

// getLeastBusyNode returns the least busy backend node.
// It returns the least busy backend node.
func (lb *LoadBalancer) getLeastBusyNode() *BackendNode {
func (lb *LoadBalancer) getLeastBusyNode() *LoadBalancerNode {
minRequests := lb.backends[0].counter.Load()
minBackend := lb.backends[0]

Expand Down
3 changes: 3 additions & 0 deletions backend/loadbalancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ func TestNewLoadBalancer(t *testing.T) {
}

backends = append(backends, mocks.NewMockBackend(t))

lb, err := NewLoadBalancer(backends)
if err != nil {
t.Fatalf("Failed to create load balancer: %v", err)
Expand All @@ -31,6 +32,7 @@ func TestNewLoadBalancer(t *testing.T) {
if backend.backend != backends[i] {
t.Errorf("Expected backend at index %d to be %v, but got %v", i, backends[i], backend.backend)
}

if backend.counter.Load() != 0 {
t.Errorf("Expected backend counter at index %d to be 0, but got %d", i, backend.counter.Load())
}
Expand Down Expand Up @@ -68,6 +70,7 @@ func TestLoadBalancer_Handle(t *testing.T) {
mocks.NewMockBackend(t),
mocks.NewMockBackend(t),
}

lb, err := NewLoadBalancer(backends)
if err != nil {
t.Fatalf("Failed to create load balancer: %v", err)
Expand Down

0 comments on commit e6d21e1

Please sign in to comment.