Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
3b3071d
removed unused function
pompon0 Apr 8, 2026
3c866a6
snapshot
pompon0 Apr 8, 2026
4764164
updated test
pompon0 Apr 8, 2026
3b992a1
more cleanup
pompon0 Apr 8, 2026
9fd05fc
snapshot
pompon0 Apr 8, 2026
1fd3453
wip
pompon0 Apr 8, 2026
a0ef9c7
WIP
pompon0 Apr 8, 2026
63e6bd3
wip
pompon0 Apr 8, 2026
254426b
wip
pompon0 Apr 8, 2026
44b9288
wip
pompon0 Apr 8, 2026
3061e49
wip
pompon0 Apr 8, 2026
47aa688
wip
pompon0 Apr 8, 2026
aaf3ee9
wip
pompon0 Apr 8, 2026
4e0faa9
addressed a flake
pompon0 Apr 8, 2026
bd8db80
Merge branch 'gprusak-mempool2' into gprusak-mempool3
pompon0 Apr 8, 2026
d2b6a21
wip
pompon0 Apr 8, 2026
4a3a579
snapshot
pompon0 Apr 9, 2026
59b9f59
removed notion of precheck
pompon0 Apr 9, 2026
28a2ff1
simplified errors
pompon0 Apr 9, 2026
fab6e8c
Merge remote-tracking branch 'origin/main' into gprusak-mempool2
pompon0 Apr 9, 2026
ea8519e
Merge branch 'gprusak-mempool2' into gprusak-mempool3
pompon0 Apr 9, 2026
15ed859
compilation fix
pompon0 Apr 9, 2026
ba81b8b
separated reactor
pompon0 Apr 9, 2026
4601391
wip
pompon0 Apr 9, 2026
b30fc91
concurrency fix
pompon0 Apr 9, 2026
05e69c6
non-nil args to buildGigaConfig
pompon0 Apr 9, 2026
0d3b1d0
mempool in GigaRouter
pompon0 Apr 9, 2026
f13a871
-1 in Reap
pompon0 Apr 9, 2026
cdc7047
disabled some components for autobahn mode
pompon0 Apr 10, 2026
a21d315
disabled mempool notifications when WaitForTxs is disabled
pompon0 Apr 10, 2026
0b1ed51
Merge branch 'main' into gprusak-mempool4
pompon0 Apr 10, 2026
b84cfda
Merge remote-tracking branch 'origin/main' into gprusak-mempool3
pompon0 Apr 10, 2026
a86ce40
Merge branch 'gprusak-mempool3' into gprusak-mempool4
pompon0 Apr 10, 2026
062f712
reverted err visibility
pompon0 Apr 10, 2026
9b5b8e6
restored comments
pompon0 Apr 10, 2026
c8e6d17
more comments
pompon0 Apr 10, 2026
708a690
broadcast fix
pompon0 Apr 10, 2026
b94c719
SpawnCritical
pompon0 Apr 10, 2026
029113b
moved ownership of mempool
pompon0 Apr 10, 2026
67ea52a
lint
pompon0 Apr 10, 2026
1b2477c
simplified CheckTx
pompon0 Apr 10, 2026
1e74249
Merge remote-tracking branch 'origin/main' into gprusak-mempool3
pompon0 Apr 10, 2026
f6be363
wip
pompon0 Apr 10, 2026
de584fa
mempool fix
pompon0 Apr 10, 2026
70c75a1
Merge remote-tracking branch 'origin/main' into gprusak-mempool3
pompon0 Apr 10, 2026
f5a18e0
Merge branch 'gprusak-mempool3' into gprusak-mempool4
pompon0 Apr 10, 2026
26e74ea
applied comments
pompon0 Apr 13, 2026
e5a5ccd
clist
pompon0 Apr 10, 2026
bde1898
mempool broadcast
pompon0 Apr 13, 2026
be79fac
keeping a tx mempool lock for Finalize + Commit + Update
pompon0 Apr 13, 2026
baac6b0
applied comments
pompon0 Apr 14, 2026
121b2e4
applied comments
pompon0 Apr 14, 2026
4dbc0d7
Merge remote-tracking branch 'origin/main' into gprusak-mempool4
pompon0 Apr 14, 2026
d217ee0
moved config
pompon0 Apr 14, 2026
5ed9b06
extracted config
pompon0 Apr 14, 2026
6a2cd95
deflake
pompon0 Apr 14, 2026
6a07a03
Merge remote-tracking branch 'origin/main' into gprusak-mempool4
pompon0 Apr 15, 2026
2b057d7
Merge branch 'gprusak-mempool4' into gprusak-mempool6
pompon0 Apr 15, 2026
24fab59
test fix
pompon0 Apr 15, 2026
2164681
implemented fix
pompon0 Apr 15, 2026
d3878df
bumped evidence retransmission frequency
pompon0 Apr 16, 2026
5e58178
Merge remote-tracking branch 'origin/main' into gprusak-mempool6
pompon0 Apr 22, 2026
afc44f2
applied comments
pompon0 Apr 22, 2026
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
23 changes: 10 additions & 13 deletions sei-tendermint/internal/consensus/mempool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,9 @@ func checkTxsRange(ctx context.Context, t *testing.T, cs *State, start, end int)
for i := start; i < end; i++ {
txBytes := make([]byte, 8)
binary.BigEndian.PutUint64(txBytes, uint64(i))
var rCode uint32
err := cs.txMempool.CheckTx(ctx, txBytes, func(r *abci.ResponseCheckTx) { rCode = r.Code }, mempool.TxInfo{})
res, err := cs.txMempool.CheckTx(ctx, txBytes, mempool.TxInfo{})
require.NoError(t, err, "error after checkTx")
require.Equal(t, code.CodeTypeOK, rCode, "checkTx code is error, txBytes %X, index=%d", txBytes, i)
require.Equal(t, code.CodeTypeOK, res.Code, "checkTx code is error, txBytes %X, index=%d", txBytes, i)
}
}

Expand Down Expand Up @@ -182,10 +181,9 @@ func TestMempoolTxConcurrentWithCommit(t *testing.T) {
for i := range int(numTxs) {
txBytes := make([]byte, 8)
binary.BigEndian.PutUint64(txBytes, uint64(i))
var rCode uint32
err := cs.txMempool.CheckTx(ctx, txBytes, func(r *abci.ResponseCheckTx) { rCode = r.Code }, mempool.TxInfo{})
res, err := cs.txMempool.CheckTx(ctx, txBytes, mempool.TxInfo{})
require.NoError(t, err, "error after checkTx")
require.Equal(t, code.CodeTypeOK, rCode, "checkTx code is error, txBytes %X, index=%d", txBytes, i)
require.Equal(t, code.CodeTypeOK, res.Code, "checkTx code is error, txBytes %X, index=%d", txBytes, i)
}

startTestRound(ctx, cs, cs.roundState.Height(), cs.roundState.Round())
Expand Down Expand Up @@ -234,17 +232,16 @@ func TestMempoolRmBadTx(t *testing.T) {
// Try to send the tx through the mempool.
// CheckTx should not err, but the app should return a bad abci code
// and the tx should get removed from the pool
err := cs.txMempool.CheckTx(ctx, txBytes, func(r *abci.ResponseCheckTx) {
if r.Code != code.CodeTypeBadNonce {
t.Errorf("expected checktx to return bad nonce, got %v", r)
return
}
checkTxRespCh <- struct{}{}
}, mempool.TxInfo{})
res, err := cs.txMempool.CheckTx(ctx, txBytes, mempool.TxInfo{})
if err != nil {
t.Errorf("error after CheckTx: %v", err)
return
}
if res.Code != code.CodeTypeBadNonce {
t.Errorf("expected checktx to return bad nonce, got %v", res)
return
}
checkTxRespCh <- struct{}{}

// check for the tx
for {
Expand Down
15 changes: 6 additions & 9 deletions sei-tendermint/internal/consensus/reactor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func finalizeTx(
return scope.Run(ctx, func(ctx context.Context, s scope.Scope) error {
for i, sub := range blocksSubs {
s.Spawn(func() error {
if err := states[i].txMempool.CheckTx(ctx, tx, nil, mempool.TxInfo{}); err != nil {
if _, err := states[i].txMempool.CheckTx(ctx, tx, mempool.TxInfo{}); err != nil {
return fmt.Errorf("CheckTx(): %w", err)
}
for {
Expand Down Expand Up @@ -363,15 +363,12 @@ func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) {
}

// send a tx
require.NoError(
t,
states[1].txMempool.CheckTx(
ctx,
[]byte{1, 2, 3},
nil,
mempool.TxInfo{},
),
_, err := states[1].txMempool.CheckTx(
ctx,
[]byte{1, 2, 3},
mempool.TxInfo{},
)
require.NoError(t, err)

var wg sync.WaitGroup
for _, sub := range rts.subs {
Expand Down
14 changes: 7 additions & 7 deletions sei-tendermint/internal/consensus/replay_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ func sendTxs(ctx context.Context, cs *State) error {
return nil
}
tx := []byte{byte(i)}
if err := cs.txMempool.CheckTx(ctx, tx, nil, mempool.TxInfo{}); err != nil {
if _, err := cs.txMempool.CheckTx(ctx, tx, mempool.TxInfo{}); err != nil {
return fmt.Errorf("cs.mempool.CheckTx(): %w", err)
}
}
Expand Down Expand Up @@ -347,7 +347,7 @@ func setupSimulator(ctx context.Context, t *testing.T) *simulatorTestSuite {
require.NoError(t, err)
valPubKey1ABCI := crypto.PubKeyToProto(newValidatorPubKey1)
newValidatorTx1 := kvstore.MakeValSetChangeTx(valPubKey1ABCI, testMinPower)
err = css[0].txMempool.CheckTx(ctx, newValidatorTx1, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, newValidatorTx1, mempool.TxInfo{})
assert.NoError(t, err)
propBlock, err := css[0].createProposalBlock(ctx) // changeProposer(t, cs1, vs2)
require.NoError(t, err)
Expand Down Expand Up @@ -383,7 +383,7 @@ func setupSimulator(ctx context.Context, t *testing.T) *simulatorTestSuite {
require.NoError(t, err)
updatePubKey1ABCI := crypto.PubKeyToProto(updateValidatorPubKey1)
updateValidatorTx1 := kvstore.MakeValSetChangeTx(updatePubKey1ABCI, 25)
err = css[0].txMempool.CheckTx(ctx, updateValidatorTx1, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, updateValidatorTx1, mempool.TxInfo{})
assert.NoError(t, err)
propBlock, err = css[0].createProposalBlock(ctx) // changeProposer(t, cs1, vs2)
require.NoError(t, err)
Expand Down Expand Up @@ -418,14 +418,14 @@ func setupSimulator(ctx context.Context, t *testing.T) *simulatorTestSuite {
require.NoError(t, err)
newVal2ABCI := crypto.PubKeyToProto(newValidatorPubKey2)
newValidatorTx2 := kvstore.MakeValSetChangeTx(newVal2ABCI, testMinPower)
err = css[0].txMempool.CheckTx(ctx, newValidatorTx2, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, newValidatorTx2, mempool.TxInfo{})
assert.NoError(t, err)
pv, _ = css[nVals+2].privValidator.Get()
newValidatorPubKey3, err := pv.GetPubKey(ctx)
require.NoError(t, err)
newVal3ABCI := crypto.PubKeyToProto(newValidatorPubKey3)
newValidatorTx3 := kvstore.MakeValSetChangeTx(newVal3ABCI, testMinPower)
err = css[0].txMempool.CheckTx(ctx, newValidatorTx3, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, newValidatorTx3, mempool.TxInfo{})
assert.NoError(t, err)
propBlock, err = css[0].createProposalBlock(ctx) // changeProposer(t, cs1, vs2)
require.NoError(t, err)
Expand Down Expand Up @@ -471,7 +471,7 @@ func setupSimulator(ctx context.Context, t *testing.T) *simulatorTestSuite {
ensureNewProposal(t, proposalCh, height, round)

removeValidatorTx2 := kvstore.MakeValSetChangeTx(newVal2ABCI, 0)
err = css[0].txMempool.CheckTx(ctx, removeValidatorTx2, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, removeValidatorTx2, mempool.TxInfo{})
assert.NoError(t, err)

rs = css[0].GetRoundState()
Expand Down Expand Up @@ -515,7 +515,7 @@ func setupSimulator(ctx context.Context, t *testing.T) *simulatorTestSuite {
height++
incrementHeight(vss...)
removeValidatorTx3 := kvstore.MakeValSetChangeTx(newVal3ABCI, 0)
err = css[0].txMempool.CheckTx(ctx, removeValidatorTx3, nil, mempool.TxInfo{})
_, err = css[0].txMempool.CheckTx(ctx, removeValidatorTx3, mempool.TxInfo{})
assert.NoError(t, err)
propBlock, err = css[0].createProposalBlock(ctx) // changeProposer(t, cs1, vs2)
require.NoError(t, err)
Expand Down
4 changes: 2 additions & 2 deletions sei-tendermint/internal/consensus/state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2230,7 +2230,7 @@ func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {

ensureNewBlockHeader(t, newBlockHeader, height, blockID.Hash)

err := cs1.txMempool.CheckTx(ctx, types.Tx("test-key=test-value"), nil, mempool.TxInfo{})
_, err := cs1.txMempool.CheckTx(ctx, types.Tx("test-key=test-value"), mempool.TxInfo{})
require.NoError(t, err, "failed to seed the mempool with a transaction")

ensureNewTimeout(t, timeoutProposeCh, height+1, round)
Expand Down Expand Up @@ -2650,7 +2650,7 @@ func TestTryCreateProposalBlock_PartsMismatch(t *testing.T) {
incrementRound(vss[1:]...)
startTestRound(ctx, cs, height, round)

err := cs.txMempool.CheckTx(ctx, types.Tx("test-key=test-value"), nil, mempool.TxInfo{})
_, err := cs.txMempool.CheckTx(ctx, types.Tx("test-key=test-value"), mempool.TxInfo{})
require.NoError(t, err, "failed to seed the mempool with a transaction")

proposal, block := decideProposal(ctx, t, cs, vss[1], height, round)
Expand Down
2 changes: 1 addition & 1 deletion sei-tendermint/internal/evidence/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ The `Receive` function takes a list of evidence and does the following:
3. Stores the evidence to a db and a concurrent list

The gossiping of evidence is initiated when a peer is added which starts a go routine to broadcast currently
uncommitted evidence at intervals of 60 seconds (set by the by broadcastEvidenceIntervalS).
uncommitted evidence at intervals of 60 seconds (set by `broadcastEvidenceInterval`).
It uses a concurrent list to store the evidence and before sending verifies that each evidence is still valid in the
sense that it has not exceeded the max evidence age and height (see types/params.go#EvidenceParams).

Expand Down
17 changes: 8 additions & 9 deletions sei-tendermint/internal/evidence/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ var logger = seilog.NewLogger("tendermint", "internal", "evidence")
// Pool maintains a pool of valid evidence to be broadcasted and committed
type Pool struct {
evidenceStore dbm.DB
evidenceList *clist.CList // concurrent linked-list of evidence
evidenceSize uint32 // amount of pending evidence
evidenceList *clist.CList[types.Evidence] // concurrent linked-list of evidence
evidenceSize uint32 // amount of pending evidence

// needed to load headers and commits to verify evidence
blockStore BlockStore
Expand Down Expand Up @@ -78,7 +78,7 @@ func NewPool(evidenceDB dbm.DB, stateStore sm.Store, blockStore BlockStore, metr
blockStore: blockStore,
stateDB: stateStore,
evidenceStore: evidenceDB,
evidenceList: clist.New(),
evidenceList: clist.New[types.Evidence](),
consensusBuffer: make([]duplicateVoteSet, 0),
Metrics: metrics,
eventBus: eventBus,
Expand Down Expand Up @@ -238,14 +238,13 @@ func (evpool *Pool) CheckEvidence(ctx context.Context, evList types.EvidenceList
}

// EvidenceFront goes to the first evidence in the clist
func (evpool *Pool) EvidenceFront() *clist.CElement {
func (evpool *Pool) EvidenceFront() *clist.CElement[types.Evidence] {
return evpool.evidenceList.Front()
}

// EvidenceWaitChan is a channel that closes once the first evidence in the list
// is there. i.e Front is not nil.
func (evpool *Pool) EvidenceWaitChan() <-chan struct{} {
return evpool.evidenceList.WaitChan()
// WaitEvidenceFront waits until the first evidence in the list is available.
func (evpool *Pool) WaitEvidenceFront(ctx context.Context) (*clist.CElement[types.Evidence], error) {
return evpool.evidenceList.WaitFront(ctx)
}

// Size returns the number of evidence in the pool.
Expand Down Expand Up @@ -532,7 +531,7 @@ func (evpool *Pool) removeEvidenceFromList(

for e := evpool.evidenceList.Front(); e != nil; e = e.Next() {
// Remove from clist
ev := e.Value.(types.Evidence)
ev := e.Value()
if _, ok := blockEvidenceMap[evMapKey(ev)]; ok {
evpool.evidenceList.Remove(e)
e.DetachPrev()
Expand Down
7 changes: 4 additions & 3 deletions sei-tendermint/internal/evidence/pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ func TestEvidencePoolBasic(t *testing.T) {
// good evidence
evAdded := make(chan struct{})
go func() {
<-pool.EvidenceWaitChan()
_, err := pool.WaitEvidenceFront(ctx)
require.NoError(t, err)
close(evAdded)
}()

Expand All @@ -101,7 +102,7 @@ func TestEvidencePoolBasic(t *testing.T) {
}

next := pool.EvidenceFront()
require.Equal(t, ev, next.Value.(types.Evidence))
require.Equal(t, ev, next.Value())

const evidenceBytes int64 = 372
evs, size = pool.PendingEvidence(evidenceBytes)
Expand Down Expand Up @@ -505,7 +506,7 @@ func TestRecoverPendingEvidence(t *testing.T) {
require.Equal(t, 1, len(evList))

next := newPool.EvidenceFront()
require.Equal(t, goodEvidence, next.Value.(types.Evidence))
require.Equal(t, goodEvidence, next.Value())
}

func initializeStateFromValidatorSet(t *testing.T, valSet *types.ValidatorSet, height int64) sm.Store {
Expand Down
71 changes: 33 additions & 38 deletions sei-tendermint/internal/evidence/reactor.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package evidence

import (
"context"
"errors"
"fmt"
"runtime/debug"
"sync"
Expand All @@ -10,6 +11,7 @@ import (
clist "github.com/sei-protocol/sei-chain/sei-tendermint/internal/libs/clist"
"github.com/sei-protocol/sei-chain/sei-tendermint/internal/p2p"
"github.com/sei-protocol/sei-chain/sei-tendermint/libs/service"
"github.com/sei-protocol/sei-chain/sei-tendermint/libs/utils"
pb "github.com/sei-protocol/sei-chain/sei-tendermint/proto/tendermint/types"
"github.com/sei-protocol/sei-chain/sei-tendermint/types"
)
Expand All @@ -25,7 +27,7 @@ const (
// goes back to the start of the list and begins sending the evidence again.
// Most evidence should be committed in the very next block that is why we wait
// just over the block production rate before sending evidence again.
broadcastEvidenceIntervalS = 10
broadcastEvidenceInterval = 60 * time.Second
)

// GetChannelDescriptor produces an instance of a descriptor for this
Expand Down Expand Up @@ -213,7 +215,6 @@ func (r *Reactor) processPeerUpdates(ctx context.Context) error {
//
// REF: https://github.com/tendermint/tendermint/issues/4727
func (r *Reactor) broadcastEvidenceLoop(ctx context.Context, peerID types.NodeID, evidenceCh *p2p.Channel[*pb.Evidence]) {
var next *clist.CElement

defer func() {
r.mtx.Lock()
Expand All @@ -229,50 +230,44 @@ func (r *Reactor) broadcastEvidenceLoop(ctx context.Context, peerID types.NodeID
}
}()

timer := time.NewTimer(0)
defer timer.Stop()

for {
// This happens because the CElement we were looking at got garbage
// collected (removed). That is, .NextWaitChan() returned nil. So we can go
// collected (removed). That is, NextWait() returned nil. So we can go
// ahead and start from the beginning.
if next == nil {
select {
case <-r.evpool.EvidenceWaitChan(): // wait until next evidence is available
if next = r.evpool.EvidenceFront(); next == nil {
continue
}

case <-ctx.Done():
return
}
}

ev := next.Value.(types.Evidence)
evProto, err := types.EvidenceToProto(ev)
next, err := r.evpool.WaitEvidenceFront(ctx)
if err != nil {
panic(fmt.Errorf("failed to convert evidence: %w", err))
return

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Should we return error some day?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not necessarily, since the error will be always context.Canceled/DeadlineExceeded here. TBD

}

// Send the evidence to the corresponding peer. Note, the peer may be behind
// and thus would not be able to process the evidence correctly. Also, the
// peer may receive this piece of evidence multiple times if it added and
// removed frequently from the broadcasting peer.

evidenceCh.Send(evProto, peerID)
logger.Debug("gossiped evidence to peer", "evidence", ev, "peer", peerID)

select {
case <-timer.C:
// start from the beginning after broadcastEvidenceIntervalS seconds
timer.Reset(time.Second * broadcastEvidenceIntervalS)
next = nil
err = utils.WithTimeout(ctx, broadcastEvidenceInterval, func(ctx context.Context) error {
for {
ev := next.Value()
evProto, err := types.EvidenceToProto(ev)
if err != nil {
// This should never happen, but for some historical reasons there is a recover() deferred
// in this function. Current behavior is that evidence will stop being broadcasted to a peer
// if this happens, but the node with not crash.
// TODO(gprusak): reevaluate if this broadcastEvidenceLoop may panic even if there is no bug.
// If it cannot, remove recover().
panic(fmt.Errorf("failed to convert evidence: %w", err))
Comment thread
pompon0 marked this conversation as resolved.
}

case <-next.NextWaitChan():
next = next.Next()
timer.Stop()
// Send the evidence to the corresponding peer. Note, the peer may be behind
// and thus would not be able to process the evidence correctly. Also, the
// peer may receive this piece of evidence multiple times if it added and
// removed frequently from the broadcasting peer.
evidenceCh.Send(evProto, peerID)
logger.Debug("gossiped evidence to peer", "evidence", ev, "peer", peerID)

case <-ctx.Done():
next, err = next.NextWait(ctx)
if err != nil {
return err
}
}
})
// In case the observed element has been removed or we waited too long for the next element,
// we start sending from the beginning.
if err != nil && !errors.Is(err, context.DeadlineExceeded) && !errors.Is(err, clist.ErrRemoved) {
return
}
}
Expand Down
6 changes: 3 additions & 3 deletions sei-tendermint/internal/libs/clist/bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package clist
import "testing"

func BenchmarkDetaching(b *testing.B) {
lst := New()
lst := New[int]()
for i := 0; i < b.N+1; i++ {
lst.PushBack(i)
}
Expand All @@ -22,7 +22,7 @@ func BenchmarkDetaching(b *testing.B) {

// This is used to benchmark the time of RMutex.
func BenchmarkRemoved(b *testing.B) {
lst := New()
lst := New[int]()
for i := 0; i < b.N+1; i++ {
lst.PushBack(i)
}
Expand All @@ -38,7 +38,7 @@ func BenchmarkRemoved(b *testing.B) {
}

func BenchmarkPushBack(b *testing.B) {
lst := New()
lst := New[int]()
b.ResetTimer()
for i := 0; i < b.N; i++ {
lst.PushBack(i)
Expand Down
Loading
Loading