Browse Source

eth, miner: fetch pending block/state in on go (data race)

Péter Szilágyi 9 năm trước cách đây
mục cha
commit
0228fb57cd
3 tập tin đã thay đổi với 10 bổ sung17 xóa
  1. 4 2
      eth/api.go
  2. 3 6
      miner/miner.go
  3. 3 9
      miner/worker.go

+ 4 - 2
eth/api.go

@@ -56,7 +56,8 @@ const defaultGas = uint64(90000)
 func blockByNumber(m *miner.Miner, bc *core.BlockChain, blockNr rpc.BlockNumber) *types.Block {
 	// Pending block is only known by the miner
 	if blockNr == rpc.PendingBlockNumber {
-		return m.PendingBlock()
+		block, _ := m.Pending()
+		return block
 	}
 	// Otherwise resolve and return the block
 	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) {
 	// Pending state is only known by the miner
 	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
 	block := blockByNumber(m, bc, blockNr)

+ 3 - 6
miner/miner.go

@@ -164,12 +164,9 @@ func (self *Miner) SetExtra(extra []byte) error {
 	return nil
 }
 
-func (self *Miner) PendingState() *state.StateDB {
-	return self.worker.pendingState()
-}
-
-func (self *Miner) PendingBlock() *types.Block {
-	return self.worker.pendingBlock()
+// Pending returns the currently pending block and associated state.
+func (self *Miner) Pending() (*types.Block, *state.StateDB) {
+	return self.worker.pending()
 }
 
 func (self *Miner) SetEtherbase(addr common.Address) {

+ 3 - 9
miner/worker.go

@@ -152,13 +152,7 @@ func (self *worker) setEtherbase(addr common.Address) {
 	self.coinbase = addr
 }
 
-func (self *worker) pendingState() *state.StateDB {
-	self.currentMu.Lock()
-	defer self.currentMu.Unlock()
-	return self.current.state
-}
-
-func (self *worker) pendingBlock() *types.Block {
+func (self *worker) pending() (*types.Block, *state.StateDB) {
 	self.currentMu.Lock()
 	defer self.currentMu.Unlock()
 
@@ -168,9 +162,9 @@ func (self *worker) pendingBlock() *types.Block {
 			self.current.txs,
 			nil,
 			self.current.receipts,
-		)
+		), self.current.state
 	}
-	return self.current.Block
+	return self.current.Block, self.current.state
 }
 
 func (self *worker) start() {