forked from cerc-io/plugeth
Merge pull request #2354 from karalabe/miner-atomic-pending
eth, miner: fetch pending block/state in on go (data race)
This commit is contained in:
commit
138e7af96c
@ -56,7 +56,8 @@ const defaultGas = uint64(90000)
|
|||||||
func blockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber) *types.Block {
|
func blockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber) *types.Block {
|
||||||
// Pending block is only known by the miner
|
// Pending block is only known by the miner
|
||||||
if blockNr == rpc.PendingBlockNumber {
|
if blockNr == rpc.PendingBlockNumber {
|
||||||
return m.PendingBlock()
|
block, _ := m.Pending()
|
||||||
|
return block
|
||||||
}
|
}
|
||||||
// Otherwise resolve and return the block
|
// Otherwise resolve and return the block
|
||||||
if blockNr == rpc.LatestBlockNumber {
|
if blockNr == rpc.LatestBlockNumber {
|
||||||
@ -72,7 +73,8 @@ func blockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber)
|
|||||||
func stateAndBlockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber, chainDb ethdb.Database) (*state.StateDB, *types.Block, error) {
|
func stateAndBlockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber, chainDb ethdb.Database) (*state.StateDB, *types.Block, error) {
|
||||||
// Pending state is only known by the miner
|
// Pending state is only known by the miner
|
||||||
if blockNr == rpc.PendingBlockNumber {
|
if blockNr == rpc.PendingBlockNumber {
|
||||||
return m.PendingState(), m.PendingBlock(), nil
|
block, state := m.Pending()
|
||||||
|
return state, block, nil
|
||||||
}
|
}
|
||||||
// Otherwise resolve the block number and return its state
|
// Otherwise resolve the block number and return its state
|
||||||
block := blockByNumber(m, bc, blockNr)
|
block := blockByNumber(m, bc, blockNr)
|
||||||
|
@ -164,12 +164,9 @@ func (self *Miner) SetExtra(extra []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Miner) PendingState() *state.StateDB {
|
// Pending returns the currently pending block and associated state.
|
||||||
return self.worker.pendingState()
|
func (self *Miner) Pending() (*types.Block, *state.StateDB) {
|
||||||
}
|
return self.worker.pending()
|
||||||
|
|
||||||
func (self *Miner) PendingBlock() *types.Block {
|
|
||||||
return self.worker.pendingBlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Miner) SetEtherbase(addr common.Address) {
|
func (self *Miner) SetEtherbase(addr common.Address) {
|
||||||
|
@ -152,13 +152,7 @@ func (self *worker) setEtherbase(addr common.Address) {
|
|||||||
self.coinbase = addr
|
self.coinbase = addr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *worker) pendingState() *state.StateDB {
|
func (self *worker) pending() (*types.Block, *state.StateDB) {
|
||||||
self.currentMu.Lock()
|
|
||||||
defer self.currentMu.Unlock()
|
|
||||||
return self.current.state
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *worker) pendingBlock() *types.Block {
|
|
||||||
self.currentMu.Lock()
|
self.currentMu.Lock()
|
||||||
defer self.currentMu.Unlock()
|
defer self.currentMu.Unlock()
|
||||||
|
|
||||||
@ -168,9 +162,9 @@ func (self *worker) pendingBlock() *types.Block {
|
|||||||
self.current.txs,
|
self.current.txs,
|
||||||
nil,
|
nil,
|
||||||
self.current.receipts,
|
self.current.receipts,
|
||||||
)
|
), self.current.state
|
||||||
}
|
}
|
||||||
return self.current.Block
|
return self.current.Block, self.current.state
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *worker) start() {
|
func (self *worker) start() {
|
||||||
|
Loading…
Reference in New Issue
Block a user