private void completeBatch(ProducerBatch batch, ProduceResponse.PartitionResponse response) { if (transactionManager != null) { if (transactionManager.hasProducerIdAndEpoch(batch.producerId(), batch.producerEpoch())) { transactionManager .maybeUpdateLastAckedSequence(batch.topicPartition, batch.baseSequence() + batch.recordCount - 1); log.debug("ProducerId: {}; Set last ack'd sequence number for topic-partition {} to {}", batch.producerId(), batch.topicPartition, transactionManager.lastAckedSequence(batch.topicPartition)); } transactionManager.updateLastAckedOffset(response, batch); transactionManager.removeInFlightBatch(batch); } if (batch.done(response.baseOffset, response.logAppendTime, null)) { maybeRemoveFromInflightBatches(batch); this.accumulator.deallocate(batch); } }
@Test public void testShouldResetProducerStateAfterResolvingSequences() { // Create a TransactionManager without a transactionalId to test // shouldResetProducerStateAfterResolvingSequences. TransactionManager manager = new TransactionManager(logContext, null, transactionTimeoutMs, DEFAULT_RETRY_BACKOFF_MS); assertFalse(manager.shouldResetProducerStateAfterResolvingSequences()); TopicPartition tp0 = new TopicPartition("foo", 0); TopicPartition tp1 = new TopicPartition("foo", 1); assertEquals(Integer.valueOf(0), manager.sequenceNumber(tp0)); assertEquals(Integer.valueOf(0), manager.sequenceNumber(tp1)); manager.incrementSequenceNumber(tp0, 1); manager.incrementSequenceNumber(tp1, 1); manager.maybeUpdateLastAckedSequence(tp0, 0); manager.maybeUpdateLastAckedSequence(tp1, 0); manager.markSequenceUnresolved(tp0); manager.markSequenceUnresolved(tp1); assertFalse(manager.shouldResetProducerStateAfterResolvingSequences()); manager.maybeUpdateLastAckedSequence(tp0, 5); manager.incrementSequenceNumber(tp0, 1); manager.markSequenceUnresolved(tp0); manager.markSequenceUnresolved(tp1); assertTrue(manager.shouldResetProducerStateAfterResolvingSequences()); }