synchronized boolean hasOngoingTransaction() { // transactions are considered ongoing once started until completion or a fatal error return currentState == State.IN_TRANSACTION || isCompleting() || hasAbortableError(); }
private boolean maybeTerminateRequestWithError(TxnRequestHandler requestHandler) { if (hasError()) { if (hasAbortableError() && requestHandler instanceof FindCoordinatorHandler) // No harm letting the FindCoordinator request go through if we're expecting to abort return false; requestHandler.fail(lastError); return true; } return false; }
assertTrue(transactionManager.hasAbortableError()); assertTrue(transactionManager.isSendToPartitionAllowed(tp1)); assertTrue(transactionManager.hasAbortableError());
@Test public void testFindCoordinatorAllowedInAbortableErrorState() throws InterruptedException { final long pid = 13131L; final short epoch = 1; doInitTransactions(pid, epoch); transactionManager.beginTransaction(); transactionManager.maybeAddPartitionToTransaction(tp0); Future<RecordMetadata> responseFuture = accumulator.append(tp0, time.milliseconds(), "key".getBytes(), "value".getBytes(), Record.EMPTY_HEADERS, null, MAX_BLOCK_TIMEOUT).future; assertFalse(responseFuture.isDone()); sender.run(time.milliseconds()); // Send AddPartitionsRequest transactionManager.transitionToAbortableError(new KafkaException()); sendAddPartitionsToTxnResponse(Errors.NOT_COORDINATOR, tp0, epoch, pid); sender.run(time.milliseconds()); // AddPartitions returns assertTrue(transactionManager.hasAbortableError()); assertNull(transactionManager.coordinator(CoordinatorType.TRANSACTION)); prepareFindCoordinatorResponse(Errors.NONE, false, CoordinatorType.TRANSACTION, transactionalId); sender.run(time.milliseconds()); // FindCoordinator handled assertEquals(brokerNode, transactionManager.coordinator(CoordinatorType.TRANSACTION)); assertTrue(transactionManager.hasAbortableError()); }
@Test public void testIsSendToPartitionAllowedWithPendingPartitionAfterAbortableError() { final long pid = 13131L; final short epoch = 1; doInitTransactions(pid, epoch); transactionManager.beginTransaction(); transactionManager.maybeAddPartitionToTransaction(tp0); transactionManager.transitionToAbortableError(new KafkaException()); assertFalse(transactionManager.isSendToPartitionAllowed(tp0)); assertTrue(transactionManager.hasAbortableError()); }
assertTrue(e.getCause() instanceof TimeoutException); assertTrue(transactionManager.hasAbortableError());
client.poll(retryBackoffMs, now); return; } else if (transactionManager.hasAbortableError()) { accumulator.abortUndrainedBatches(transactionManager.lastError());
@Test public void testIsSendToPartitionAllowedWithInFlightPartitionAddAfterAbortableError() { final long pid = 13131L; final short epoch = 1; doInitTransactions(pid, epoch); transactionManager.beginTransaction(); transactionManager.maybeAddPartitionToTransaction(tp0); // Send the AddPartitionsToTxn request and leave it in-flight sender.run(time.milliseconds()); transactionManager.transitionToAbortableError(new KafkaException()); assertFalse(transactionManager.isSendToPartitionAllowed(tp0)); assertTrue(transactionManager.hasAbortableError()); }
assertTrue(e.getCause() instanceof TimeoutException); assertTrue(transactionManager.hasAbortableError());
sender.run(time.milliseconds()); assertTrue(transactionManager.hasAbortableError()); transactionManager.beginAbort(); sender.run(time.milliseconds());
@Test public void testIsSendToPartitionAllowedWithAddedPartitionAfterAbortableError() { final long pid = 13131L; final short epoch = 1; doInitTransactions(pid, epoch); transactionManager.beginTransaction(); transactionManager.maybeAddPartitionToTransaction(tp0); prepareAddPartitionsToTxnResponse(Errors.NONE, tp0, epoch, pid); sender.run(time.milliseconds()); assertFalse(transactionManager.hasPartitionsToAdd()); transactionManager.transitionToAbortableError(new KafkaException()); assertTrue(transactionManager.isSendToPartitionAllowed(tp0)); assertTrue(transactionManager.hasAbortableError()); }
prepareAddPartitionsToTxn(singletonMap(unauthorizedPartition, Errors.TOPIC_AUTHORIZATION_FAILED)); sender.run(time.milliseconds()); assertTrue(transactionManager.hasAbortableError()); assertTrue(transactionManager.isPartitionAdded(tp0)); assertFalse(transactionManager.isPartitionAdded(unauthorizedPartition));
prepareAddPartitionsToTxn(singletonMap(unauthorizedPartition, Errors.TOPIC_AUTHORIZATION_FAILED)); sender.run(time.milliseconds()); assertTrue(transactionManager.hasAbortableError()); assertTrue(transactionManager.isPartitionAdded(tp0)); assertFalse(transactionManager.isPartitionAdded(unauthorizedPartition));
assertTrue(transactionManager.hasAbortableError()); assertTrue(transactionManager.hasOngoingTransaction()); assertFalse(transactionManager.isCompleting());