@@ -4,11 +4,13 @@ package sarama
4
4
5
5
import (
6
6
"errors"
7
+ "github.com/stretchr/testify/assert"
7
8
"log"
8
9
"math"
9
10
"os"
10
11
"os/signal"
11
12
"strconv"
13
+ "strings"
12
14
"sync"
13
15
"sync/atomic"
14
16
"testing"
@@ -2176,7 +2178,7 @@ func TestTxnCanAbort(t *testing.T) {
2176
2178
require .NoError (t , err )
2177
2179
}
2178
2180
2179
- func TestPreventRetryBufferOverflow (t * testing.T ) {
2181
+ func TestProducerRetryBufferLimits (t * testing.T ) {
2180
2182
broker := NewMockBroker (t , 1 )
2181
2183
defer broker .Close ()
2182
2184
topic := "test-topic"
@@ -2199,57 +2201,86 @@ func TestPreventRetryBufferOverflow(t *testing.T) {
2199
2201
"MetadataRequest" : metadataRequestHandlerFunc ,
2200
2202
})
2201
2203
2202
- config := NewTestConfig ()
2203
- config .Producer .Flush .MaxMessages = 1
2204
- config .Producer .Retry .MaxBufferLength = minFunctionalRetryBufferLength
2205
- config .Producer .Return .Successes = true
2206
-
2207
- producer , err := NewAsyncProducer ([]string {broker .Addr ()}, config )
2208
- if err != nil {
2209
- t .Fatal (err )
2204
+ tests := []struct {
2205
+ name string
2206
+ configureBuffer func (* Config )
2207
+ messageSize int
2208
+ numMessages int
2209
+ }{
2210
+ {
2211
+ name : "MaxBufferLength" ,
2212
+ configureBuffer : func (config * Config ) {
2213
+ config .Producer .Flush .MaxMessages = 1
2214
+ config .Producer .Retry .MaxBufferLength = minFunctionalRetryBufferLength
2215
+ },
2216
+ messageSize : 1 , // Small message size
2217
+ numMessages : 10000 ,
2218
+ },
2219
+ {
2220
+ name : "MaxBufferBytes" ,
2221
+ configureBuffer : func (config * Config ) {
2222
+ config .Producer .Flush .MaxMessages = 1
2223
+ config .Producer .Retry .MaxBufferBytes = minFunctionalRetryBufferBytes
2224
+ },
2225
+ messageSize : 950 * 1024 , // 950 KB
2226
+ numMessages : 1000 ,
2227
+ },
2210
2228
}
2211
2229
2212
- var (
2213
- wg sync.WaitGroup
2214
- successes , producerErrors int
2215
- errorFound bool
2216
- )
2217
-
2218
- wg .Add (1 )
2219
- go func () {
2220
- defer wg .Done ()
2221
- for range producer .Successes () {
2222
- successes ++
2223
- }
2224
- }()
2230
+ for _ , tt := range tests {
2231
+ t .Run (tt .name , func (t * testing.T ) {
2232
+ config := NewTestConfig ()
2233
+ config .Producer .Return .Successes = true
2234
+ tt .configureBuffer (config )
2225
2235
2226
- wg .Add (1 )
2227
- go func () {
2228
- defer wg .Done ()
2229
- for errMsg := range producer .Errors () {
2230
- if errors .Is (errMsg .Err , ErrProducerRetryBufferOverflow ) {
2231
- errorFound = true
2236
+ producer , err := NewAsyncProducer ([]string {broker .Addr ()}, config )
2237
+ if err != nil {
2238
+ t .Fatal (err )
2232
2239
}
2233
- producerErrors ++
2234
- }
2235
- }()
2236
2240
2237
- numMessages := 100000
2238
- for i := 0 ; i < numMessages ; i ++ {
2239
- kv := StringEncoder (strconv .Itoa (i ))
2240
- producer .Input () <- & ProducerMessage {
2241
- Topic : topic ,
2242
- Key : kv ,
2243
- Value : kv ,
2244
- Metadata : i ,
2245
- }
2246
- }
2241
+ var (
2242
+ wg sync.WaitGroup
2243
+ successes , producerErrors int
2244
+ errorFound bool
2245
+ )
2246
+
2247
+ wg .Add (1 )
2248
+ go func () {
2249
+ defer wg .Done ()
2250
+ for range producer .Successes () {
2251
+ successes ++
2252
+ }
2253
+ }()
2254
+
2255
+ wg .Add (1 )
2256
+ go func () {
2257
+ defer wg .Done ()
2258
+ for errMsg := range producer .Errors () {
2259
+ if errors .Is (errMsg .Err , ErrProducerRetryBufferOverflow ) {
2260
+ errorFound = true
2261
+ }
2262
+ producerErrors ++
2263
+ }
2264
+ }()
2247
2265
2248
- producer . AsyncClose ( )
2249
- wg . Wait ( )
2266
+ longString := strings . Repeat ( "a" , tt . messageSize )
2267
+ val := StringEncoder ( longString )
2250
2268
2251
- require .Equal (t , successes + producerErrors , numMessages , "Expected all messages to be processed" )
2252
- require .True (t , errorFound , "Expected at least one error matching ErrProducerRetryBufferOverflow" )
2269
+ for i := 0 ; i < tt .numMessages ; i ++ {
2270
+ msg := & ProducerMessage {
2271
+ Topic : topic ,
2272
+ Value : val ,
2273
+ }
2274
+ producer .Input () <- msg
2275
+ }
2276
+
2277
+ producer .AsyncClose ()
2278
+ wg .Wait ()
2279
+
2280
+ assert .Equal (t , successes + producerErrors , tt .numMessages , "Expected all messages to be processed" )
2281
+ assert .True (t , errorFound , "Expected at least one error matching ErrProducerRetryBufferOverflow" )
2282
+ })
2283
+ }
2253
2284
}
2254
2285
2255
2286
// This example shows how to use the producer while simultaneously
0 commit comments