fix mirrorWriter write
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Jun 17, 2015 at 14:06 UTC
89cb430326137ba89745c948eb765163e1f8590f
1 file changed
+20
-5
thirdparty/eventlog/writer.go
+20
-5
@@ -12,14 +12,29 @@ type MirrorWriter struct {
12
13
func (mw *MirrorWriter) Write(b []byte) (int, error) {
14
mw.lk.Lock()
15
- var filter []io.Writer
16
- for _, w := range mw.writers {
15
+ // write to all writers, and nil out the broken ones.
16
+ for i, w := range mw.writers {
17
_, err := w.Write(b)
18
- if err == nil {
19
- filter = append(filter, w)
18
+ if err != nil {
19
+ mw.writers[i] = nil
20
}
21
}
22
- mw.writers = filter
22
+
23
+ // consolidate the slice
24
+ for i := 0; i < len(mw.writers); i++ {
25
+ if mw.writers[i] != nil {
26
+ continue
27
+ }
28
+
29
+ j := len(mw.writers)
30
+ for ; j > i; j-- {
31
+ if mw.writers[j] != nil {
32
+ mw.writers[i], mw.writers[j] = mw.writers[j], nil // swap
33
+ break
34
+ }
35
+ }
36
+ mw.writers = mw.writers[:j]
37
+ }
38
mw.lk.Unlock()
39
return len(b), nil
40
}