@@ -228,11 +228,13 @@ func (e *Exporter[T]) exportBatch(batch []T) error {
228228}
229229
230230// prepareAndSendBatch starts a goroutine to export the batch with retry logic.
231+ // The goroutine takes ownership of the batch slice and will return it to the pool when done.
231232func (e * Exporter [T ]) prepareAndSendBatch (batch []T ) {
232233 e .logger .Debug ("Preparing to send batch" , zap .Int ("batch_size" , len (batch )))
233234 e .inflightBatches .Inc ()
234235 go func () {
235236 defer e .inflightBatches .Dec ()
237+ defer e .putBatchBuffer (batch ) // Return buffer to pool after export completes
236238 e .exportBatchWithRetry (batch )
237239 }()
238240}
@@ -328,17 +330,15 @@ func (e *Exporter[T]) start() {
328330 e .logger .Debug ("Tick: flushing buffer" , zap .Int ("buffer_size" , len (buffer )))
329331 if len (buffer ) > 0 {
330332 e .prepareAndSendBatch (buffer )
331- // Return buffer to pool after sending
332- e .putBatchBuffer (buffer )
333+ // Ownership transferred to goroutine, get a new buffer
333334 buffer = nil
334335 }
335336 case item := <- e .queue :
336337 buffer = append (buffer , item )
337338 if len (buffer ) == e .settings .BatchSize {
338339 e .logger .Debug ("Buffer full, sending batch" , zap .Int ("batch_size" , len (buffer )))
339340 e .prepareAndSendBatch (buffer )
340- // Return buffer to pool after sending
341- e .putBatchBuffer (buffer )
341+ // Ownership transferred to goroutine, get a new buffer
342342 buffer = nil
343343 }
344344 case <- e .shutdownSignal :
@@ -360,15 +360,13 @@ func (e *Exporter[T]) drainQueue(buffer []T) {
360360 buffer = append (buffer , item )
361361 if len (buffer ) == e .settings .BatchSize {
362362 e .prepareAndSendBatch (buffer )
363- // Return buffer to pool and get a new one
364- e .putBatchBuffer (buffer )
363+ // Ownership transferred to goroutine, get a new buffer
365364 buffer = e .getBatchBuffer ()
366365 }
367366 default :
368367 if len (buffer ) > 0 {
369368 e .prepareAndSendBatch (buffer )
370- // Return buffer to pool before returning
371- e .putBatchBuffer (buffer )
369+ // Ownership transferred to goroutine
372370 }
373371 e .logger .Debug ("Queue drained" , zap .Int ("drained_items" , drainedItems ))
374372 return
0 commit comments