Skip to content
This repository has been archived by the owner on Jun 9, 2024. It is now read-only.

fix(evict): Switch to LRU to prevent removed transactions from being re-gossiped from a peer instantly. #1472

Merged
merged 3 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cosmos/runtime/txpool/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ func (m *Mempool) AnteHandle(
if shouldEject := m.shouldEjectFromCometMempool(
ctx.BlockTime().Unix(), ethTx,
); shouldEject {
m.crc.DropRemoteTx(ethTx.Hash())
telemetry.IncrCounter(float32(1), MetricKeyAnteEjectedTxs)
return ctx, errors.New("eject from comet mempool")
}
Expand Down
31 changes: 9 additions & 22 deletions cosmos/runtime/txpool/comet.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@
package txpool

import (
"sync"
"time"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/lru"
)

const (
defaultCacheSize = 4096
defaultCacheSize = 100000
)

// CometRemoteCache is used to mark which txs are added to our Polaris node remotely from
Expand All @@ -37,43 +37,30 @@ type CometRemoteCache interface {
IsRemoteTx(txHash common.Hash) bool
MarkRemoteSeen(txHash common.Hash)
TimeFirstSeen(txHash common.Hash) int64 // Unix timestamp
DropRemoteTx(txHash common.Hash)
}

// Thread-safe implementation of CometRemoteCache.
type cometRemoteCache struct {
timeInserted map[common.Hash]int64
timeInsertedMu sync.RWMutex
timeInserted *lru.Cache[common.Hash, int64]
}

func newCometRemoteCache() *cometRemoteCache {
return &cometRemoteCache{
timeInserted: make(map[common.Hash]int64, defaultCacheSize),

timeInserted: lru.NewCache[common.Hash, int64](defaultCacheSize),
}
}

func (crc *cometRemoteCache) IsRemoteTx(txHash common.Hash) bool {
crc.timeInsertedMu.RLock()
defer crc.timeInsertedMu.RUnlock()
_, ok := crc.timeInserted[txHash]
return ok
return crc.timeInserted.Contains(txHash)
}

// Record the time the tx was inserted from Comet successfully.
func (crc *cometRemoteCache) MarkRemoteSeen(txHash common.Hash) {
crc.timeInsertedMu.Lock()
crc.timeInserted[txHash] = time.Now().Unix()
crc.timeInsertedMu.Unlock()
crc.timeInserted.Add(txHash, time.Now().Unix())
itsdevbear marked this conversation as resolved.
Show resolved Hide resolved
}

func (crc *cometRemoteCache) TimeFirstSeen(txHash common.Hash) int64 {
crc.timeInsertedMu.RLock()
defer crc.timeInsertedMu.RUnlock()
return crc.timeInserted[txHash]
}

func (crc *cometRemoteCache) DropRemoteTx(txHash common.Hash) {
crc.timeInsertedMu.Lock()
delete(crc.timeInserted, txHash)
crc.timeInsertedMu.Unlock()
i, _ := crc.timeInserted.Get(txHash)
return i
}
4 changes: 0 additions & 4 deletions cosmos/runtime/txpool/mempool.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,6 @@ func (m *Mempool) Remove(tx sdk.Tx) error {
if err := ethTx.UnmarshalBinary(txBz); err != nil {
continue
}
txHash := ethTx.Hash()

// Remove the eth tx from comet seen tx cache.
m.crc.DropRemoteTx(txHash)
}
}
return nil
Expand Down
Loading