From a11e4337544833f98c78dd11791d8e7351782fd0 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Tue, 30 Jul 2024 17:42:10 +0300 Subject: [PATCH] mempool: move metrics out of removeInternal, simplify it Metrics should be updated once per action, currently removeInternal is used by Add and Remove, the first one updates them in the end anyway and remove should do the same. Signed-off-by: Roman Khimov --- pkg/core/mempool/mem_pool.go | 64 +++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/pkg/core/mempool/mem_pool.go b/pkg/core/mempool/mem_pool.go index 5e36fd525..263baa665 100644 --- a/pkg/core/mempool/mem_pool.go +++ b/pkg/core/mempool/mem_pool.go @@ -299,44 +299,46 @@ func (mp *Pool) Add(t *transaction.Transaction, fee Feer, data ...any) error { func (mp *Pool) Remove(hash util.Uint256) { mp.lock.Lock() mp.removeInternal(hash) + if mp.updateMetricsCb != nil { + mp.updateMetricsCb(len(mp.verifiedTxes)) + } mp.lock.Unlock() } // removeInternal is an internal unlocked representation of Remove. func (mp *Pool) removeInternal(hash util.Uint256) { - if tx, ok := mp.verifiedMap[hash]; ok { - var num int - delete(mp.verifiedMap, hash) - for num = range mp.verifiedTxes { - if hash.Equals(mp.verifiedTxes[num].txn.Hash()) { - break - } - } - itm := mp.verifiedTxes[num] - if num < len(mp.verifiedTxes)-1 { - mp.verifiedTxes = append(mp.verifiedTxes[:num], mp.verifiedTxes[num+1:]...) - } else if num == len(mp.verifiedTxes)-1 { - mp.verifiedTxes = mp.verifiedTxes[:num] - } - payer := itm.txn.Signers[mp.payerIndex].Account - senderFee := mp.fees[payer] - senderFee.feeSum.SubUint64(&senderFee.feeSum, uint64(tx.SystemFee+tx.NetworkFee)) - mp.fees[payer] = senderFee - // remove all conflicting hashes from mp.conflicts list - mp.removeConflictsOf(tx) - if attrs := tx.GetAttributes(transaction.OracleResponseT); len(attrs) != 0 { - delete(mp.oracleResp, attrs[0].Value.(*transaction.OracleResponse).ID) - } - if mp.subscriptionsOn.Load() { - mp.events <- mempoolevent.Event{ - Type: mempoolevent.TransactionRemoved, - Tx: itm.txn, - Data: itm.data, - } + tx, ok := mp.verifiedMap[hash] + if !ok { + return + } + var num int + delete(mp.verifiedMap, hash) + for num = range mp.verifiedTxes { + if hash.Equals(mp.verifiedTxes[num].txn.Hash()) { + break } } - if mp.updateMetricsCb != nil { - mp.updateMetricsCb(len(mp.verifiedTxes)) + itm := mp.verifiedTxes[num] + if num < len(mp.verifiedTxes)-1 { + mp.verifiedTxes = append(mp.verifiedTxes[:num], mp.verifiedTxes[num+1:]...) + } else if num == len(mp.verifiedTxes)-1 { + mp.verifiedTxes = mp.verifiedTxes[:num] + } + payer := itm.txn.Signers[mp.payerIndex].Account + senderFee := mp.fees[payer] + senderFee.feeSum.SubUint64(&senderFee.feeSum, uint64(tx.SystemFee+tx.NetworkFee)) + mp.fees[payer] = senderFee + // remove all conflicting hashes from mp.conflicts list + mp.removeConflictsOf(tx) + if attrs := tx.GetAttributes(transaction.OracleResponseT); len(attrs) != 0 { + delete(mp.oracleResp, attrs[0].Value.(*transaction.OracleResponse).ID) + } + if mp.subscriptionsOn.Load() { + mp.events <- mempoolevent.Event{ + Type: mempoolevent.TransactionRemoved, + Tx: itm.txn, + Data: itm.data, + } } }