@@ -37,7 +37,7 @@ type partitionProcessor struct {
37
37
builderOnce sync.Once
38
38
builderCfg dataobj.BuilderConfig
39
39
bucket objstore.Bucket
40
- flushBuffer * bytes. Buffer
40
+ bufPool * sync. Pool
41
41
42
42
// Metrics
43
43
metrics * partitionOffsetMetrics
@@ -50,7 +50,7 @@ type partitionProcessor struct {
50
50
logger log.Logger
51
51
}
52
52
53
- func newPartitionProcessor (ctx context.Context , client * kgo.Client , builderCfg dataobj.BuilderConfig , uploaderCfg uploader.Config , bucket objstore.Bucket , tenantID string , virtualShard int32 , topic string , partition int32 , logger log.Logger , reg prometheus.Registerer ) * partitionProcessor {
53
+ func newPartitionProcessor (ctx context.Context , client * kgo.Client , builderCfg dataobj.BuilderConfig , uploaderCfg uploader.Config , bucket objstore.Bucket , tenantID string , virtualShard int32 , topic string , partition int32 , logger log.Logger , reg prometheus.Registerer , bufPool * sync. Pool ) * partitionProcessor {
54
54
ctx , cancel := context .WithCancel (ctx )
55
55
decoder , err := kafka .NewDecoder ()
56
56
if err != nil {
@@ -94,6 +94,7 @@ func newPartitionProcessor(ctx context.Context, client *kgo.Client, builderCfg d
94
94
metrics : metrics ,
95
95
uploader : uploader ,
96
96
metastoreManager : metastoreManager ,
97
+ bufPool : bufPool ,
97
98
}
98
99
}
99
100
@@ -158,7 +159,6 @@ func (p *partitionProcessor) initBuilder() error {
158
159
return
159
160
}
160
161
p .builder = builder
161
- p .flushBuffer = bytes .NewBuffer (make ([]byte , 0 , p .builderCfg .TargetObjectSize ))
162
162
})
163
163
return initErr
164
164
}
@@ -194,22 +194,29 @@ func (p *partitionProcessor) processRecord(record *kgo.Record) {
194
194
return
195
195
}
196
196
197
- flushedDataobjStats , err := p .builder .Flush (p .flushBuffer )
198
- if err != nil {
199
- level .Error (p .logger ).Log ("msg" , "failed to flush builder" , "err" , err )
200
- return
201
- }
197
+ func () {
198
+ flushBuffer := p .bufPool .Get ().(* bytes.Buffer )
199
+ defer p .bufPool .Put (flushBuffer )
202
200
203
- objectPath , err := p .uploader .Upload (p .ctx , p .flushBuffer )
204
- if err != nil {
205
- level .Error (p .logger ).Log ("msg" , "failed to upload object" , "err" , err )
206
- return
207
- }
201
+ flushBuffer .Reset ()
208
202
209
- if err := p .metastoreManager .UpdateMetastore (p .ctx , objectPath , flushedDataobjStats ); err != nil {
210
- level .Error (p .logger ).Log ("msg" , "failed to update metastore" , "err" , err )
211
- return
212
- }
203
+ flushedDataobjStats , err := p .builder .Flush (flushBuffer )
204
+ if err != nil {
205
+ level .Error (p .logger ).Log ("msg" , "failed to flush builder" , "err" , err )
206
+ return
207
+ }
208
+
209
+ objectPath , err := p .uploader .Upload (p .ctx , flushBuffer )
210
+ if err != nil {
211
+ level .Error (p .logger ).Log ("msg" , "failed to upload object" , "err" , err )
212
+ return
213
+ }
214
+
215
+ if err := p .metastoreManager .UpdateMetastore (p .ctx , objectPath , flushedDataobjStats ); err != nil {
216
+ level .Error (p .logger ).Log ("msg" , "failed to update metastore" , "err" , err )
217
+ return
218
+ }
219
+ }()
213
220
214
221
if err := p .commitRecords (record ); err != nil {
215
222
level .Error (p .logger ).Log ("msg" , "failed to commit records" , "err" , err )
0 commit comments