@@ -2605,3 +2605,116 @@ func TestSelectConnectionForSameProducer(t *testing.T) {
26052605
26062606 client .Close ()
26072607}
2608+
2609+ func TestSendAsyncCouldTimeoutWhileReconnecting (t * testing.T ) {
2610+ testSendAsyncCouldTimeoutWhileReconnecting (t , false )
2611+ testSendAsyncCouldTimeoutWhileReconnecting (t , true )
2612+ }
2613+
2614+ func testSendAsyncCouldTimeoutWhileReconnecting (t * testing.T , isDisableBatching bool ) {
2615+ t .Helper ()
2616+
2617+ req := testcontainers.ContainerRequest {
2618+ Image : getPulsarTestImage (),
2619+ ExposedPorts : []string {"6650/tcp" , "8080/tcp" },
2620+ WaitingFor : wait .ForExposedPort (),
2621+ Cmd : []string {"bin/pulsar" , "standalone" , "-nfw" },
2622+ }
2623+ c , err := testcontainers .GenericContainer (context .Background (), testcontainers.GenericContainerRequest {
2624+ ContainerRequest : req ,
2625+ Started : true ,
2626+ })
2627+ require .NoError (t , err , "Failed to start the pulsar container" )
2628+ defer func () {
2629+ err := c .Terminate (context .Background ())
2630+ if err != nil {
2631+ t .Fatal ("Failed to terminate the pulsar container" , err )
2632+ }
2633+ }()
2634+
2635+ endpoint , err := c .PortEndpoint (context .Background (), "6650" , "pulsar" )
2636+ require .NoError (t , err , "Failed to get the pulsar endpoint" )
2637+
2638+ client , err := NewClient (ClientOptions {
2639+ URL : endpoint ,
2640+ ConnectionTimeout : 5 * time .Second ,
2641+ OperationTimeout : 5 * time .Second ,
2642+ })
2643+ require .NoError (t , err )
2644+ defer client .Close ()
2645+
2646+ var testProducer Producer
2647+ require .Eventually (t , func () bool {
2648+ testProducer , err = client .CreateProducer (ProducerOptions {
2649+ Topic : newTopicName (),
2650+ Schema : NewBytesSchema (nil ),
2651+ SendTimeout : 3 * time .Second ,
2652+ DisableBatching : isDisableBatching ,
2653+ BatchingMaxMessages : 5 ,
2654+ MaxPendingMessages : 10 ,
2655+ })
2656+ return err == nil
2657+ }, 30 * time .Second , 1 * time .Second )
2658+
2659+ numMessages := 10
2660+ // Send 10 messages synchronously
2661+ for i := 0 ; i < numMessages ; i ++ {
2662+ send , err := testProducer .Send (context .Background (), & ProducerMessage {Payload : []byte ("test" )})
2663+ require .NoError (t , err )
2664+ require .NotNil (t , send )
2665+ }
2666+
2667+ // stop pulsar server
2668+ timeout := 10 * time .Second
2669+ err = c .Stop (context .Background (), & timeout )
2670+ require .NoError (t , err )
2671+
2672+ // Test the SendAsync could be timeout if the producer is reconnecting
2673+
2674+ finalErr := make (chan error , 1 )
2675+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
2676+ defer cancel ()
2677+ testProducer .SendAsync (ctx , & ProducerMessage {
2678+ Payload : []byte ("test" ),
2679+ }, func (_ MessageID , _ * ProducerMessage , err error ) {
2680+ finalErr <- err
2681+ })
2682+ select {
2683+ case <- time .After (10 * time .Second ):
2684+ t .Fatal ("test timeout" )
2685+ case err = <- finalErr :
2686+ // should get a timeout error
2687+ require .ErrorIs (t , err , ErrSendTimeout )
2688+ }
2689+ close (finalErr )
2690+
2691+ // Test that the SendAsync could be timeout if the pending queue is full
2692+
2693+ go func () {
2694+ // Send 10 messages asynchronously to make the pending queue full
2695+ errs := make (chan error , numMessages )
2696+ for i := 0 ; i < numMessages ; i ++ {
2697+ testProducer .SendAsync (context .Background (), & ProducerMessage {
2698+ Payload : []byte ("test" ),
2699+ }, func (id MessageID , producerMessage * ProducerMessage , err error ) {
2700+ errs <- err
2701+ })
2702+ }
2703+ }()
2704+
2705+ time .Sleep (3 * time .Second )
2706+ finalErr = make (chan error , 1 )
2707+ testProducer .SendAsync (ctx , & ProducerMessage {
2708+ Payload : []byte ("test" ),
2709+ }, func (_ MessageID , _ * ProducerMessage , err error ) {
2710+ finalErr <- err
2711+ })
2712+ select {
2713+ case <- time .After (10 * time .Second ):
2714+ t .Fatal ("test timeout" )
2715+ case err = <- finalErr :
2716+ // should get a timeout error
2717+ require .ErrorIs (t , err , ErrSendTimeout )
2718+ }
2719+ close (finalErr )
2720+ }
0 commit comments