@@ -34,17 +34,21 @@ type (
34
34
35
35
TailWriter struct {
36
36
io.Writer
37
- n int
38
-
39
- i int
40
- buf [][]byte
37
+ RingWriter
41
38
}
42
39
43
40
HeadWriter struct {
44
41
io.Writer
45
42
N int
46
43
}
47
44
45
+ RingWriter struct {
46
+ n int
47
+
48
+ i int
49
+ buf [][]byte
50
+ }
51
+
48
52
// CountingIODiscard discards data but counts writes and bytes.
49
53
// It's safe to use simultaneously (atomic operations are used).
50
54
CountingIODiscard struct {
@@ -288,13 +292,38 @@ func (w *DeLabels) Unwrap() interface{} {
288
292
289
293
func NewTailWriter (w io.Writer , n int ) * TailWriter {
290
294
return & TailWriter {
291
- Writer : w ,
292
- n : n ,
293
- buf : make ([][]byte , n ),
295
+ Writer : w ,
296
+ RingWriter : RingWriter {},
294
297
}
295
298
}
296
299
297
- func (w * TailWriter ) Write (p []byte ) (n int , err error ) {
300
+ func (w * TailWriter ) Flush () (err error ) {
301
+ _ , err = w .RingWriter .WriteTo (w .Writer )
302
+ if err != nil {
303
+ return err
304
+ }
305
+
306
+ w .RingWriter .Reset ()
307
+
308
+ if f , ok := w .Writer .(Flusher ); ok {
309
+ return f .Flush ()
310
+ }
311
+
312
+ return nil
313
+ }
314
+
315
+ func (w * TailWriter ) Unwrap () interface {} {
316
+ return w .Writer
317
+ }
318
+
319
+ func NewRingWriter (n int ) * RingWriter {
320
+ return & RingWriter {
321
+ n : n ,
322
+ buf : make ([][]byte , n ),
323
+ }
324
+ }
325
+
326
+ func (w * RingWriter ) Write (p []byte ) (n int , err error ) {
298
327
i := w .i % w .n
299
328
w .buf [i ] = append (w .buf [i ][:0 ], p ... )
300
329
@@ -303,31 +332,28 @@ func (w *TailWriter) Write(p []byte) (n int, err error) {
303
332
return len (p ), nil
304
333
}
305
334
306
- func (w * TailWriter ) Flush ( ) (err error ) {
335
+ func (w * RingWriter ) WriteTo ( wr io. Writer ) (n int64 , err error ) {
307
336
for i := w .i ; i < w .i + w .n ; i ++ {
308
337
b := w .buf [i % w .n ]
309
338
310
339
if len (b ) == 0 {
311
340
continue
312
341
}
313
342
314
- _ , err = w .Writer .Write (b )
343
+ m , err := wr .Write (b )
344
+ n += int64 (m )
315
345
if err != nil {
316
- return err
346
+ return n , err
317
347
}
318
-
319
- w .buf [i % w .n ] = b [:0 ]
320
- }
321
-
322
- if f , ok := w .Writer .(Flusher ); ok {
323
- return f .Flush ()
324
348
}
325
349
326
- return nil
350
+ return n , nil
327
351
}
328
352
329
- func (w * TailWriter ) Unwrap () interface {} {
330
- return w .Writer
353
+ func (w * RingWriter ) Reset () {
354
+ for i := range w .buf {
355
+ w .buf [i ] = w .buf [i ][:0 ]
356
+ }
331
357
}
332
358
333
359
func NewHeadWriter (w io.Writer , n int ) * HeadWriter {
0 commit comments