You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "Bob Barrett (Jira)" <ji...@apache.org> on 2020/04/02 23:22:00 UTC

[jira] [Created] (KAFKA-9811) TransactionMetadata state and pendingState are non-volatile and read outside the metadata lock

Bob Barrett created KAFKA-9811:
----------------------------------

             Summary: TransactionMetadata state and pendingState are non-volatile and read outside the metadata lock
                 Key: KAFKA-9811
                 URL: https://issues.apache.org/jira/browse/KAFKA-9811
             Project: Kafka
          Issue Type: Bug
            Reporter: Bob Barrett


As an example, in TransactionStateManager.timedOutTransactions(), we read the state and pendingState without acquiring the lock for each metadata object:
{code:java}
inReadLock(stateLock) {
  transactionMetadataCache.flatMap { case (_, entry) =>
    entry.metadataPerTransactionalId.filter { case (_, txnMetadata) =>
      if (txnMetadata.pendingTransitionInProgress) {
        false
      } else {
        txnMetadata.state match {
          case Ongoing =>
            txnMetadata.txnStartTimestamp + txnMetadata.txnTimeoutMs < now
          case _ => false
        }
      }
    }.map { case (txnId, txnMetadata) =>
      TransactionalIdAndProducerIdEpoch(txnId, txnMetadata.producerId, txnMetadata.producerEpoch)
    }
  }
}{code}
The start timestamp is volatile, so it can be safely read, but we also read the pendingState and state, which are not.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)