@@ -183,6 +183,8 @@ func (k *Kafka) PostCDC(ctx context.Context, readerIdx int) error {
183183 if reader == nil {
184184 return fmt .Errorf ("reader %s not found for commit" , readerID )
185185 }
186+ _ , generationID := reader .GroupMetadata ()
187+ logger .Debugf ("reader %s post cdc: generation id: %d" , readerID , generationID )
186188
187189 if err := reader .CommitRecords (ctx , messages ... ); err != nil {
188190 return fmt .Errorf ("commit failed for reader %s: %s" , readerID , err )
@@ -208,25 +210,28 @@ func (k *Kafka) PostCDC(ctx context.Context, readerIdx int) error {
208210// for processing messages from a Kafka reader.
209211func (k * Kafka ) processKafkaMessages (ctx context.Context , reader * kgo.Client , stopProcessFn func (record types.KafkaRecord ) (bool , error )) error {
210212 for {
211- messages := reader .PollFetches (ctx )
213+ pollCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
214+ messages := reader .PollFetches (pollCtx )
215+ pollCtxErr := pollCtx .Err ()
216+ cancel ()
212217 errs := messages .Errors ()
213- if len (errs ) > 0 {
218+
219+ // Rebalance/exit checks must run even when PollFetches returns an empty batch;
220+ // otherwise a reader reassigned to empty partitions never enters the record loop.
221+ if stopProcessing , err := k .readerManager .FetchExitState (); stopProcessing {
222+ return err
223+ }
224+
225+ if len (errs ) > 0 && pollCtxErr == nil {
214226 return fmt .Errorf ("%v: error reading message in Kafka CDC sync: %v" , constants .ErrNonRetryable , errs [0 ].Err )
215227 }
216228
217229 records := messages .RecordIter ()
218230
219231 for ! records .Done () {
220- // Discover/schema sampling uses standalone partition consumers without ReaderManager.
221- if k .readerManager != nil {
222- if k .readerManager .ShouldStopProcessing () {
223- logger .Infof ("stopping kafka CDC processing due to consumer group rebalance" )
224- return nil
225- }
226- if err := k .readerManager .ErrForExitMode (); err != nil {
227- logger .Errorf ("kafka consumer lost partition ownership and CDC processing can no longer continue safely: %s " , err )
228- return err
229- }
232+ // Re-check rebalance state before processing each record to stop immediately after partition revocation.
233+ if stopProcessing , err := k .readerManager .FetchExitState (); stopProcessing {
234+ return err
230235 }
231236 message := records .Next ()
232237
0 commit comments