all: collate new transaction events together
This commit is contained in:
committed by
Péter Szilágyi
parent
6286c255f1
commit
a2e43d28d0
@ -46,7 +46,7 @@ const (
|
||||
softResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data.
|
||||
estHeaderRlpSize = 500 // Approximate size of an RLP encoded block header
|
||||
|
||||
// txChanSize is the size of channel listening to TxPreEvent.
|
||||
// txChanSize is the size of channel listening to TxsPreEvent.
|
||||
// The number is referenced from the size of tx pool.
|
||||
txChanSize = 4096
|
||||
)
|
||||
@ -81,8 +81,8 @@ type ProtocolManager struct {
|
||||
SubProtocols []p2p.Protocol
|
||||
|
||||
eventMux *event.TypeMux
|
||||
txCh chan core.TxPreEvent
|
||||
txSub event.Subscription
|
||||
txsCh chan core.TxsPreEvent
|
||||
txsSub event.Subscription
|
||||
minedBlockSub *event.TypeMuxSubscription
|
||||
|
||||
// channels for fetcher, syncer, txsyncLoop
|
||||
@ -204,8 +204,8 @@ func (pm *ProtocolManager) Start(maxPeers int) {
|
||||
pm.maxPeers = maxPeers
|
||||
|
||||
// broadcast transactions
|
||||
pm.txCh = make(chan core.TxPreEvent, txChanSize)
|
||||
pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh)
|
||||
pm.txsCh = make(chan core.TxsPreEvent, txChanSize)
|
||||
pm.txsSub = pm.txpool.SubscribeTxPreEvent(pm.txsCh)
|
||||
go pm.txBroadcastLoop()
|
||||
|
||||
// broadcast mined blocks
|
||||
@ -220,7 +220,7 @@ func (pm *ProtocolManager) Start(maxPeers int) {
|
||||
func (pm *ProtocolManager) Stop() {
|
||||
log.Info("Stopping Ethereum protocol")
|
||||
|
||||
pm.txSub.Unsubscribe() // quits txBroadcastLoop
|
||||
pm.txsSub.Unsubscribe() // quits txBroadcastLoop
|
||||
pm.minedBlockSub.Unsubscribe() // quits blockBroadcastLoop
|
||||
|
||||
// Quit the sync loop.
|
||||
@ -712,16 +712,23 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {
|
||||
}
|
||||
}
|
||||
|
||||
// BroadcastTx will propagate a transaction to all peers which are not known to
|
||||
// BroadcastTxs will propagate a batch of transactions to all peers which are not known to
|
||||
// already have the given transaction.
|
||||
func (pm *ProtocolManager) BroadcastTx(hash common.Hash, tx *types.Transaction) {
|
||||
// Broadcast transaction to a batch of peers not knowing about it
|
||||
peers := pm.peers.PeersWithoutTx(hash)
|
||||
//FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))]
|
||||
for _, peer := range peers {
|
||||
peer.SendTransactions(types.Transactions{tx})
|
||||
func (pm *ProtocolManager) BroadcastTxs(txs types.Transactions) {
|
||||
var txset = make(map[*peer]types.Transactions)
|
||||
|
||||
// Broadcast transactions to a batch of peers not knowing about it
|
||||
for _, tx := range txs {
|
||||
peers := pm.peers.PeersWithoutTx(tx.Hash())
|
||||
for _, peer := range peers {
|
||||
txset[peer] = append(txset[peer], tx)
|
||||
}
|
||||
log.Trace("Broadcast transaction", "hash", tx.Hash(), "recipients", len(peers))
|
||||
}
|
||||
// FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))]
|
||||
for peer, txs := range txset {
|
||||
peer.SendTransactions(txs)
|
||||
}
|
||||
log.Trace("Broadcast transaction", "hash", hash, "recipients", len(peers))
|
||||
}
|
||||
|
||||
// Mined broadcast loop
|
||||
@ -739,11 +746,11 @@ func (pm *ProtocolManager) minedBroadcastLoop() {
|
||||
func (pm *ProtocolManager) txBroadcastLoop() {
|
||||
for {
|
||||
select {
|
||||
case event := <-pm.txCh:
|
||||
pm.BroadcastTx(event.Tx.Hash(), event.Tx)
|
||||
case event := <-pm.txsCh:
|
||||
pm.BroadcastTxs(event.Txs)
|
||||
|
||||
// Err() channel will be closed when unsubscribing.
|
||||
case <-pm.txSub.Err():
|
||||
case <-pm.txsSub.Err():
|
||||
return
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user