2
2
package logsobj
3
3
4
4
import (
5
- "bytes"
6
5
"context"
7
6
"errors"
8
7
"flag"
9
8
"fmt"
9
+ "io"
10
10
"time"
11
11
12
12
"github.com/grafana/dskit/flagext"
@@ -293,27 +293,24 @@ func (b *Builder) estimatedSize() int {
293
293
return size
294
294
}
295
295
296
- type FlushStats struct {
297
- MinTimestamp time.Time
298
- MaxTimestamp time. Time
296
+ // TimeRange returns the current time range of the builder.
297
+ func ( b * Builder ) TimeRange () ( time.Time , time. Time ) {
298
+ return b . streams . TimeRange ()
299
299
}
300
300
301
301
// Flush flushes all buffered data to the buffer provided. Calling Flush can result
302
302
// in a no-op if there is no buffered data to flush.
303
303
//
304
- // [Builder.Reset] is called after a successful Flush to discard any pending data and allow new data to be appended.
305
- func (b * Builder ) Flush (output * bytes.Buffer ) (FlushStats , error ) {
304
+ // [Builder.Reset] is called after a successful Flush to discard any pending
305
+ // data and allow new data to be appended.
306
+ func (b * Builder ) Flush () (* dataobj.Object , io.Closer , error ) {
306
307
if b .state == builderStateEmpty {
307
- return FlushStats {} , ErrBuilderEmpty
308
+ return nil , nil , ErrBuilderEmpty
308
309
}
309
310
310
311
timer := prometheus .NewTimer (b .metrics .buildTime )
311
312
defer timer .ObserveDuration ()
312
313
313
- // Appending sections resets them, so we need to load the time range before
314
- // appending.
315
- minTime , maxTime := b .streams .TimeRange ()
316
-
317
314
// Flush sections one more time in case they have data.
318
315
var flushErrors []error
319
316
@@ -322,34 +319,21 @@ func (b *Builder) Flush(output *bytes.Buffer) (FlushStats, error) {
322
319
323
320
if err := errors .Join (flushErrors ... ); err != nil {
324
321
b .metrics .flushFailures .Inc ()
325
- return FlushStats {} , fmt .Errorf ("building object: %w" , err )
322
+ return nil , nil , fmt .Errorf ("building object: %w" , err )
326
323
}
327
324
328
- sz , err := b .builder .Flush (output )
325
+ obj , closer , err := b .builder .Flush ()
329
326
if err != nil {
330
327
b .metrics .flushFailures .Inc ()
331
- return FlushStats {} , fmt .Errorf ("building object: %w" , err )
328
+ return nil , nil , fmt .Errorf ("building object: %w" , err )
332
329
}
333
330
334
- b .metrics .builtSize .Observe (float64 (sz ))
335
-
336
- var (
337
- // We don't know if output was empty before calling Flush, so we only start
338
- // reading from where we know writing began.
339
-
340
- objReader = bytes .NewReader (output .Bytes ()[output .Len ()- int (sz ):])
341
- objLength = sz
342
- )
343
- obj , err := dataobj .FromReaderAt (objReader , objLength )
344
- if err != nil {
345
- b .metrics .flushFailures .Inc ()
346
- return FlushStats {}, fmt .Errorf ("failed to create readable object: %w" , err )
347
- }
331
+ b .metrics .builtSize .Observe (float64 (obj .Size ()))
348
332
349
333
err = b .observeObject (context .Background (), obj )
350
334
351
335
b .Reset ()
352
- return FlushStats { MinTimestamp : minTime , MaxTimestamp : maxTime } , err
336
+ return obj , closer , err
353
337
}
354
338
355
339
func (b * Builder ) observeObject (ctx context.Context , obj * dataobj.Object ) error {
0 commit comments