Lock the targetList properly in go-routines (#6838)

Fixes #6483
master
Harshavardhana 6 years ago committed by Nitish Tiwari
parent b0d04b9a81
commit eddf468aef
  1. 18
      pkg/event/targetlist.go

@ -66,9 +66,6 @@ type TargetIDErr struct {
// Remove - closes and removes targets by given target IDs. // Remove - closes and removes targets by given target IDs.
func (list *TargetList) Remove(targetids ...TargetID) <-chan TargetIDErr { func (list *TargetList) Remove(targetids ...TargetID) <-chan TargetIDErr {
list.Lock()
defer list.Unlock()
errCh := make(chan TargetIDErr) errCh := make(chan TargetIDErr)
go func() { go func() {
@ -76,7 +73,10 @@ func (list *TargetList) Remove(targetids ...TargetID) <-chan TargetIDErr {
var wg sync.WaitGroup var wg sync.WaitGroup
for _, id := range targetids { for _, id := range targetids {
if target, ok := list.targets[id]; ok { list.RLock()
target, ok := list.targets[id]
list.RUnlock()
if ok {
wg.Add(1) wg.Add(1)
go func(id TargetID, target Target) { go func(id TargetID, target Target) {
defer wg.Done() defer wg.Done()
@ -91,9 +91,11 @@ func (list *TargetList) Remove(targetids ...TargetID) <-chan TargetIDErr {
} }
wg.Wait() wg.Wait()
list.Lock()
for _, id := range targetids { for _, id := range targetids {
delete(list.targets, id) delete(list.targets, id)
} }
list.Unlock()
}() }()
return errCh return errCh
@ -114,9 +116,6 @@ func (list *TargetList) List() []TargetID {
// Send - sends events to targets identified by target IDs. // Send - sends events to targets identified by target IDs.
func (list *TargetList) Send(event Event, targetIDs ...TargetID) <-chan TargetIDErr { func (list *TargetList) Send(event Event, targetIDs ...TargetID) <-chan TargetIDErr {
list.Lock()
defer list.Unlock()
errCh := make(chan TargetIDErr) errCh := make(chan TargetIDErr)
go func() { go func() {
@ -124,7 +123,10 @@ func (list *TargetList) Send(event Event, targetIDs ...TargetID) <-chan TargetID
var wg sync.WaitGroup var wg sync.WaitGroup
for _, id := range targetIDs { for _, id := range targetIDs {
if target, ok := list.targets[id]; ok { list.RLock()
target, ok := list.targets[id]
list.RUnlock()
if ok {
wg.Add(1) wg.Add(1)
go func(id TargetID, target Target) { go func(id TargetID, target Target) {
defer wg.Done() defer wg.Done()

Loading…
Cancel
Save