mirror of https://github.com/docker/docs.git
[eventsHandler] Use Lock/Unlock to sync a write access
Delete keys from internal maps in a lazy way. The heavy Lock is acquired only when we have errors. Signed-off-by: Anton Tiurin <noxiouz@yandex.ru>
This commit is contained in:
parent
1f2bd67555
commit
78f21a8e88
|
|
@ -49,11 +49,12 @@ func (eh *eventsHandler) Handle(e *cluster.Event) error {
|
||||||
"time", e.Time,
|
"time", e.Time,
|
||||||
"node", cluster.SerializeNode(e.Node))
|
"node", cluster.SerializeNode(e.Node))
|
||||||
|
|
||||||
|
var failed []string
|
||||||
|
|
||||||
for key, w := range eh.ws {
|
for key, w := range eh.ws {
|
||||||
if _, err := fmt.Fprintf(w, str); err != nil {
|
if _, err := fmt.Fprintf(w, str); err != nil {
|
||||||
close(eh.cs[key])
|
// collect them to handle later under Lock
|
||||||
delete(eh.ws, key)
|
failed = append(failed, key)
|
||||||
delete(eh.cs, key)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,7 +63,24 @@ func (eh *eventsHandler) Handle(e *cluster.Event) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eh.RUnlock()
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue