Get mempoool imput addresses concurrently
This commit is contained in:
parent
e5d79b09bc
commit
919a26dfd6
@ -44,8 +44,18 @@ func NewUTXOMempool(chain BlockChain, workers int, subworkers int) *UTXOMempool
|
|||||||
}
|
}
|
||||||
for i := 0; i < workers; i++ {
|
for i := 0; i < workers; i++ {
|
||||||
go func(i int) {
|
go func(i int) {
|
||||||
|
chanInput := make(chan *Vin, 1)
|
||||||
|
chanResult := make(chan *addrIndex, 1)
|
||||||
|
for j := 0; j < subworkers; j++ {
|
||||||
|
go func(j int) {
|
||||||
|
for input := range chanInput {
|
||||||
|
ai := m.getInputAddress(input)
|
||||||
|
chanResult <- ai
|
||||||
|
}
|
||||||
|
}(j)
|
||||||
|
}
|
||||||
for txid := range m.chanTxid {
|
for txid := range m.chanTxid {
|
||||||
io, ok := m.getMempoolTxAddrs(txid)
|
io, ok := m.getTxAddrs(txid, chanInput, chanResult)
|
||||||
if !ok {
|
if !ok {
|
||||||
io = []addrIndex{}
|
io = []addrIndex{}
|
||||||
}
|
}
|
||||||
@ -101,7 +111,7 @@ func (m *UTXOMempool) getInputAddress(input *Vin) *addrIndex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UTXOMempool) getMempoolTxAddrs(txid string) ([]addrIndex, bool) {
|
func (m *UTXOMempool) getTxAddrs(txid string, chanInput chan *Vin, chanResult chan *addrIndex) ([]addrIndex, bool) {
|
||||||
tx, err := m.chain.GetTransactionForMempool(txid)
|
tx, err := m.chain.GetTransactionForMempool(txid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Error("cannot get transaction ", txid, ": ", err)
|
glog.Error("cannot get transaction ", txid, ": ", err)
|
||||||
@ -122,11 +132,29 @@ func (m *UTXOMempool) getMempoolTxAddrs(txid string) ([]addrIndex, bool) {
|
|||||||
m.onNewTxAddr(tx.Txid, output.ScriptPubKey.Addresses[0])
|
m.onNewTxAddr(tx.Txid, output.ScriptPubKey.Addresses[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dispatched := 0
|
||||||
for _, input := range tx.Vin {
|
for _, input := range tx.Vin {
|
||||||
if input.Coinbase != "" {
|
if input.Coinbase != "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ai := m.getInputAddress(&input)
|
loop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
// store as many processed results as possible
|
||||||
|
case ai := <-chanResult:
|
||||||
|
if ai != nil {
|
||||||
|
io = append(io, *ai)
|
||||||
|
}
|
||||||
|
dispatched--
|
||||||
|
// send input to be processed
|
||||||
|
case chanInput <- &input:
|
||||||
|
dispatched++
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < dispatched; i++ {
|
||||||
|
ai := <-chanResult
|
||||||
if ai != nil {
|
if ai != nil {
|
||||||
io = append(io, *ai)
|
io = append(io, *ai)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user