Merge pull request #551 from noxiouz/fix_eventsHandler

[eventsHandler] Use Lock/Unlock to sync a write access
This commit is contained in:
Victor Vieux 2015-05-13 17:58:52 -07:00
commit 4da6b2b093
1 changed files with 21 additions and 3 deletions

View File

@ -54,11 +54,12 @@ func (eh *eventsHandler) Handle(e *cluster.Event) error {
"Addr", e.Engine.Addr,
"Ip", e.Engine.IP)
var failed []string
for key, w := range eh.ws {
if _, err := fmt.Fprintf(w, str); err != nil {
close(eh.cs[key])
delete(eh.ws, key)
delete(eh.cs, key)
// collect them to handle later under Lock
failed = append(failed, key)
continue
}
@ -67,7 +68,24 @@ func (eh *eventsHandler) Handle(e *cluster.Event) error {
}
}
eh.RUnlock()
if len(failed) > 0 {
eh.Lock()
for _, key := range failed {
if ch, ok := eh.cs[key]; ok {
close(ch)
// the maps are expected to have the same keys
delete(eh.cs, key)
delete(eh.ws, key)
}
}
eh.Unlock()
}
return nil
}