1
1
package ingesterrf1
2
2
3
3
import (
4
+ "bytes"
4
5
"crypto/rand"
5
6
"errors"
6
7
"fmt"
@@ -12,12 +13,10 @@ import (
12
13
"github.com/go-kit/log/level"
13
14
"github.com/grafana/dskit/backoff"
14
15
"github.com/grafana/dskit/ring"
15
- "github.com/grafana/dskit/runutil"
16
16
"github.com/oklog/ulid"
17
17
"golang.org/x/net/context"
18
18
19
19
"github.com/grafana/loki/v3/pkg/storage/wal"
20
- util_log "github.com/grafana/loki/v3/pkg/util/log"
21
20
)
22
21
23
22
const (
@@ -40,6 +39,7 @@ const (
40
39
func (i * Ingester ) InitFlushWorkers () {
41
40
i .flushWorkersDone .Add (i .cfg .ConcurrentFlushes )
42
41
for j := 0 ; j < i .cfg .ConcurrentFlushes ; j ++ {
42
+ i .flushBuffers [j ] = new (bytes.Buffer )
43
43
go i .flushWorker (j )
44
44
}
45
45
}
@@ -90,7 +90,7 @@ func (i *Ingester) flushWorker(j int) {
90
90
n := it .Writer .InputSize ()
91
91
humanized := humanize .Bytes (uint64 (n ))
92
92
93
- err = i .flushItem (l , it )
93
+ err = i .flushItem (l , j , it )
94
94
d := time .Since (start )
95
95
if err != nil {
96
96
level .Error (l ).Log ("msg" , "failed to flush" , "size" , humanized , "duration" , d , "err" , err )
@@ -103,13 +103,13 @@ func (i *Ingester) flushWorker(j int) {
103
103
}
104
104
}
105
105
106
- func (i * Ingester ) flushItem (l log.Logger , it * wal.PendingItem ) error {
106
+ func (i * Ingester ) flushItem (l log.Logger , j int , it * wal.PendingItem ) error {
107
107
ctx , cancelFunc := context .WithCancel (context .Background ())
108
108
defer cancelFunc ()
109
109
110
110
b := backoff .New (ctx , i .cfg .FlushOpBackoff )
111
111
for b .Ongoing () {
112
- err := i .flushSegment (ctx , it .Writer )
112
+ err := i .flushSegment (ctx , j , it .Writer )
113
113
if err == nil {
114
114
break
115
115
}
@@ -124,19 +124,23 @@ func (i *Ingester) flushItem(l log.Logger, it *wal.PendingItem) error {
124
124
// If the flush is successful, metrics for this flush are to be reported.
125
125
// If the flush isn't successful, the operation for this userID is requeued allowing this and all other unflushed
126
126
// segments to have another opportunity to be flushed.
127
- func (i * Ingester ) flushSegment (ctx context.Context , ch * wal.SegmentWriter ) error {
127
+ func (i * Ingester ) flushSegment (ctx context.Context , j int , w * wal.SegmentWriter ) error {
128
128
id := ulid .MustNew (ulid .Timestamp (time .Now ()), rand .Reader )
129
- r := ch .Reader ()
130
129
131
130
start := time .Now ()
132
131
defer func () {
133
- runutil .CloseWithLogOnErr (util_log .Logger , r , "flushSegment" )
134
132
i .metrics .flushDuration .Observe (time .Since (start ).Seconds ())
135
- ch .Observe ()
133
+ w .Observe ()
136
134
}()
137
135
136
+ buf := i .flushBuffers [j ]
137
+ defer buf .Reset ()
138
+ if _ , err := w .WriteTo (buf ); err != nil {
139
+ return err
140
+ }
141
+
138
142
i .metrics .flushesTotal .Add (1 )
139
- if err := i .store .PutObject (ctx , fmt .Sprintf ("loki-v2/wal/anon/" + id .String ()), r ); err != nil {
143
+ if err := i .store .PutObject (ctx , fmt .Sprintf ("loki-v2/wal/anon/" + id .String ()), buf ); err != nil {
140
144
i .metrics .flushFailuresTotal .Inc ()
141
145
return fmt .Errorf ("store put chunk: %w" , err )
142
146
}
0 commit comments