diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go index a4670c3020..44852c3459 100644 --- a/data/pools/transactionPool.go +++ b/data/pools/transactionPool.go @@ -585,6 +585,7 @@ func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup []transactio Round: r, FirstValid: tx.Txn.FirstValid, LastValid: tx.Txn.LastValid, + Early: false, } } } diff --git a/data/transactions/error.go b/data/transactions/error.go index d29db15fc8..86ce011023 100644 --- a/data/transactions/error.go +++ b/data/transactions/error.go @@ -41,6 +41,7 @@ type TxnDeadError struct { Round basics.Round FirstValid basics.Round LastValid basics.Round + Early bool } func (err *TxnDeadError) Error() string { diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index 8aa93740c7..e0d908fd63 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -239,6 +239,7 @@ func (tx Header) Alive(tc TxnContext) error { Round: round, FirstValid: tx.FirstValid, LastValid: tx.LastValid, + Early: round < tx.FirstValid, } } diff --git a/data/txHandler.go b/data/txHandler.go index 59bb572e8e..82b59ea713 100644 --- a/data/txHandler.go +++ b/data/txHandler.go @@ -69,13 +69,13 @@ var transactionGroupTxSyncAlreadyCommitted = metrics.MakeCounter(metrics.Transac var transactionMessageTxPoolRememberCounter = metrics.NewTagCounter( "algod_transaction_messages_txpool_remember_{TAG}", "Number of transaction messages not remembered by txpool b/c if {TAG}", - txPoolRememberTagCap, txPoolRememberPendingEval, txPoolRememberTagNoSpace, txPoolRememberTagFee, txPoolRememberTagTxnDead, txPoolRememberTagTooLarge, txPoolRememberTagGroupID, + txPoolRememberTagCap, txPoolRememberPendingEval, txPoolRememberTagNoSpace, txPoolRememberTagFee, txPoolRememberTagTxnDead, txPoolRememberTagTxnEarly, txPoolRememberTagTooLarge, txPoolRememberTagGroupID, txPoolRememberTagTxID, txPoolRememberTagLease, txPoolRememberTagTxIDEval, txPoolRememberTagLeaseEval, txPoolRememberTagEvalGeneric, ) var transactionMessageTxPoolCheckCounter = metrics.NewTagCounter( "algod_transaction_messages_txpool_check_{TAG}", "Number of transaction messages that didn't pass check by txpool b/c if {TAG}", - txPoolRememberTagTxnNotWellFormed, txPoolRememberTagTxnDead, txPoolRememberTagTooLarge, txPoolRememberTagGroupID, + txPoolRememberTagTxnNotWellFormed, txPoolRememberTagTxnDead, txPoolRememberTagTxnEarly, txPoolRememberTagTooLarge, txPoolRememberTagGroupID, txPoolRememberTagTxID, txPoolRememberTagLease, txPoolRememberTagTxIDEval, txPoolRememberTagLeaseEval, txPoolRememberTagEvalGeneric, ) @@ -85,6 +85,7 @@ const ( txPoolRememberTagNoSpace = "no_space" txPoolRememberTagFee = "fee" txPoolRememberTagTxnDead = "txn_dead" + txPoolRememberTagTxnEarly = "txn_early" txPoolRememberTagTooLarge = "too_large" txPoolRememberTagGroupID = "groupid" txPoolRememberTagTxID = "txid" @@ -290,7 +291,11 @@ func (handler *TxHandler) checkReportErrors(err error) { transactionMessageTxPoolCheckCounter.Add(txPoolRememberTagTxnNotWellFormed, 1) return case *transactions.TxnDeadError: - transactionMessageTxPoolCheckCounter.Add(txPoolRememberTagTxnDead, 1) + if err.Early { + transactionMessageTxPoolCheckCounter.Add(txPoolRememberTagTxnEarly, 1) + } else { + transactionMessageTxPoolCheckCounter.Add(txPoolRememberTagTxnDead, 1) + } return case *ledgercore.TransactionInLedgerError: if err.InBlockEvaluator { @@ -348,7 +353,11 @@ func (handler *TxHandler) rememberReportErrors(err error) { transactionMessageTxPoolRememberCounter.Add(txPoolRememberTagFee, 1) return case *transactions.TxnDeadError: - transactionMessageTxPoolRememberCounter.Add(txPoolRememberTagTxnDead, 1) + if err.Early { + transactionMessageTxPoolRememberCounter.Add(txPoolRememberTagTxnEarly, 1) + } else { + transactionMessageTxPoolRememberCounter.Add(txPoolRememberTagTxnDead, 1) + } return case *ledgercore.TransactionInLedgerError: if err.InBlockEvaluator { diff --git a/data/txHandler_test.go b/data/txHandler_test.go index 389eb6d2be..4e8dcdfe1d 100644 --- a/data/txHandler_test.go +++ b/data/txHandler_test.go @@ -1763,9 +1763,19 @@ func TestTxHandlerRememberReportErrorsWithTxPool(t *testing.T) { handler.postProcessCheckedTxn(&wi) require.Equal(t, 1, getMetricCounter(txPoolRememberTagEvalGeneric)) - // trigger TxnDeadErr from the evaluator + // trigger TxnDeadErr from the evaluator for "early" case txn2 = txn1 txn2.FirstValid = ledger.LastRound() + 10 + prevTxnEarly := getMetricCounter(txPoolRememberTagTxnEarly) + wi.unverifiedTxGroup = []transactions.SignedTxn{txn2.Sign(secrets[0])} + handler.postProcessCheckedTxn(&wi) + require.Equal(t, prevTxnEarly+1, getMetricCounter(txPoolRememberTagTxnEarly)) + handler.checkAlreadyCommitted(&wi) + require.Equal(t, 1, getCheckMetricCounter(txPoolRememberTagTxnEarly)) + + // trigger TxnDeadErr from the evaluator for "late" case + txn2 = txn1 + txn2.LastValid = 0 prevTxnDead := getMetricCounter(txPoolRememberTagTxnDead) wi.unverifiedTxGroup = []transactions.SignedTxn{txn2.Sign(secrets[0])} handler.postProcessCheckedTxn(&wi)