Skip to content

Commit

Permalink
Merge pull request #4212 from xigang/fix_watch_api_hang
Browse files Browse the repository at this point in the history
karmada-search: Fix lock race affects watch RestChan not close, causing client watch api to hang.
  • Loading branch information
karmada-bot authored Nov 13, 2023
2 parents 1b2c6ed + 9c9c52c commit 67e45cd
Showing 1 changed file with 15 additions and 15 deletions.
30 changes: 15 additions & 15 deletions pkg/search/proxy/store/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,21 @@ func (w *watchMux) AddSource(watcher watch.Interface, decorator func(watch.Event

// Start run the watcher
func (w *watchMux) Start() {
for _, source := range w.sources {
go w.startWatchSource(source.watcher, source.decorator)
wg := sync.WaitGroup{}
for i := range w.sources {
source := w.sources[i]
wg.Add(1)
go func() {
defer wg.Done()
w.startWatchSource(source.watcher, source.decorator)
}()
}

go func() {
// close result chan after all goroutines exit, avoiding data race.
defer close(w.result)
wg.Wait()
}()
}

// ResultChan implements watch.Interface
Expand All @@ -220,7 +232,6 @@ func (w *watchMux) Stop() {
case <-w.done:
default:
close(w.done)
close(w.result)
}
}

Expand All @@ -246,19 +257,8 @@ func (w *watchMux) startWatchSource(source watch.Interface, decorator func(watch
select {
case <-w.done:
return
default:
case w.result <- copyEvent:
}

func() {
w.lock.RLock()
defer w.lock.RUnlock()
select {
case <-w.done:
return
default:
w.result <- copyEvent
}
}()
}
}

Expand Down

0 comments on commit 67e45cd

Please sign in to comment.