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:
Péter Szilágyi 2016-03-16 13:12:46 +02:00
commit 138e7af96c
3 changed files with 10 additions and 17 deletions

View File

@ -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)

View File

@ -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) {

View File

@ -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() {