mirror of
https://github.com/tendermint/tendermint.git
synced 2026-07-31 04:22:55 +00:00
mempool: IDs issue fixes (#7763)
This commit is contained in:
@@ -30,6 +30,11 @@ func (ids *IDs) ReserveForPeer(peerID types.NodeID) {
|
||||
ids.mtx.Lock()
|
||||
defer ids.mtx.Unlock()
|
||||
|
||||
if _, ok := ids.peerMap[peerID]; ok {
|
||||
// the peer has been reserved
|
||||
return
|
||||
}
|
||||
|
||||
curID := ids.nextPeerID()
|
||||
ids.peerMap[peerID] = curID
|
||||
ids.activeIDs[curID] = struct{}{}
|
||||
@@ -44,6 +49,9 @@ func (ids *IDs) Reclaim(peerID types.NodeID) {
|
||||
if ok {
|
||||
delete(ids.activeIDs, removedID)
|
||||
delete(ids.peerMap, peerID)
|
||||
if removedID < ids.nextID {
|
||||
ids.nextID = removedID
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,77 @@ func TestMempoolIDsBasic(t *testing.T) {
|
||||
|
||||
peerID, err := types.NewNodeID("0011223344556677889900112233445566778899")
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peerID))
|
||||
|
||||
ids.ReserveForPeer(peerID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peerID))
|
||||
|
||||
ids.Reclaim(peerID)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peerID))
|
||||
|
||||
ids.ReserveForPeer(peerID)
|
||||
require.EqualValues(t, 2, ids.GetForPeer(peerID))
|
||||
ids.Reclaim(peerID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peerID))
|
||||
}
|
||||
|
||||
func TestMempoolIDsPeerDupReserve(t *testing.T) {
|
||||
ids := NewMempoolIDs()
|
||||
|
||||
peerID, err := types.NewNodeID("0011223344556677889900112233445566778899")
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peerID))
|
||||
|
||||
ids.ReserveForPeer(peerID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peerID))
|
||||
|
||||
ids.ReserveForPeer(peerID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peerID))
|
||||
}
|
||||
|
||||
func TestMempoolIDs2Peers(t *testing.T) {
|
||||
ids := NewMempoolIDs()
|
||||
|
||||
peer1ID, _ := types.NewNodeID("0011223344556677889900112233445566778899")
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peer1ID))
|
||||
|
||||
ids.ReserveForPeer(peer1ID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peer1ID))
|
||||
|
||||
ids.Reclaim(peer1ID)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peer1ID))
|
||||
|
||||
peer2ID, _ := types.NewNodeID("1011223344556677889900112233445566778899")
|
||||
|
||||
ids.ReserveForPeer(peer2ID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peer2ID))
|
||||
|
||||
ids.ReserveForPeer(peer1ID)
|
||||
require.EqualValues(t, 2, ids.GetForPeer(peer1ID))
|
||||
}
|
||||
|
||||
func TestMempoolIDsNextExistID(t *testing.T) {
|
||||
ids := NewMempoolIDs()
|
||||
|
||||
peer1ID, _ := types.NewNodeID("0011223344556677889900112233445566778899")
|
||||
ids.ReserveForPeer(peer1ID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peer1ID))
|
||||
|
||||
peer2ID, _ := types.NewNodeID("1011223344556677889900112233445566778899")
|
||||
ids.ReserveForPeer(peer2ID)
|
||||
require.EqualValues(t, 2, ids.GetForPeer(peer2ID))
|
||||
|
||||
peer3ID, _ := types.NewNodeID("2011223344556677889900112233445566778899")
|
||||
ids.ReserveForPeer(peer3ID)
|
||||
require.EqualValues(t, 3, ids.GetForPeer(peer3ID))
|
||||
|
||||
ids.Reclaim(peer1ID)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peer1ID))
|
||||
|
||||
ids.Reclaim(peer3ID)
|
||||
require.EqualValues(t, 0, ids.GetForPeer(peer3ID))
|
||||
|
||||
ids.ReserveForPeer(peer1ID)
|
||||
require.EqualValues(t, 1, ids.GetForPeer(peer1ID))
|
||||
|
||||
ids.ReserveForPeer(peer3ID)
|
||||
require.EqualValues(t, 3, ids.GetForPeer(peer3ID))
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package mempool
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
@@ -370,13 +371,14 @@ func TestMempoolIDsPanicsIfNodeRequestsOvermaxActiveIDs(t *testing.T) {
|
||||
// 0 is already reserved for UnknownPeerID
|
||||
ids := NewMempoolIDs()
|
||||
|
||||
peerID, err := types.NewNodeID("0011223344556677889900112233445566778899")
|
||||
require.NoError(t, err)
|
||||
|
||||
for i := 0; i < MaxActiveIDs-1; i++ {
|
||||
peerID, err := types.NewNodeID(fmt.Sprintf("%040d", i))
|
||||
require.NoError(t, err)
|
||||
ids.ReserveForPeer(peerID)
|
||||
}
|
||||
|
||||
peerID, err := types.NewNodeID(fmt.Sprintf("%040d", MaxActiveIDs-1))
|
||||
require.NoError(t, err)
|
||||
require.Panics(t, func() {
|
||||
ids.ReserveForPeer(peerID)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user