| 43 | } |
| 44 | |
| 45 | func (l *roundRobinLoadBalancer) OnEvent(event Event) { |
| 46 | l.mu.Lock() |
| 47 | defer l.mu.Unlock() |
| 48 | |
| 49 | switch evt := event.(type) { |
| 50 | case *BootstrapEvent: |
| 51 | l.hosts.Store(evt.Hosts) |
| 52 | case *AddEvent: |
| 53 | l.hosts.Store(append(l.copy(), evt.Host)) |
| 54 | case *RemoveEvent: |
| 55 | cpy := l.copy() |
| 56 | for i, h := range cpy { |
| 57 | if h.Key() == evt.Host.Key() { |
| 58 | l.hosts.Store(append(cpy[:i], cpy[i+1:]...)) |
| 59 | break |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | func (l *roundRobinLoadBalancer) copy() []*Host { |
| 66 | hosts := l.hosts.Load().([]*Host) |