aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/geth/main.go2
-rw-r--r--eth/api.go4
-rw-r--r--eth/backend.go10
-rw-r--r--eth/handler.go8
-rw-r--r--eth/protocol_test.go2
-rw-r--r--eth/sync.go2
6 files changed, 18 insertions, 10 deletions
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index bc5cf06e8..e8aef2bb2 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -301,7 +301,7 @@ func startNode(ctx *cli.Context, stack *node.Node) {
th.SetThreads(threads)
}
}
- if err := ethereum.StartMining(); err != nil {
+ if err := ethereum.StartMining(true); err != nil {
utils.Fatalf("Failed to start mining: %v", err)
}
}
diff --git a/eth/api.go b/eth/api.go
index 947070515..0decd57ca 100644
--- a/eth/api.go
+++ b/eth/api.go
@@ -103,7 +103,7 @@ func (api *PublicMinerAPI) SubmitWork(nonce types.BlockNonce, solution, digest c
// result[2], 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty
func (api *PublicMinerAPI) GetWork() ([3]string, error) {
if !api.e.IsMining() {
- if err := api.e.StartMining(); err != nil {
+ if err := api.e.StartMining(false); err != nil {
return [3]string{}, err
}
}
@@ -153,7 +153,7 @@ func (api *PrivateMinerAPI) Start(threads *int) error {
}
// Start the miner and return
if !api.e.IsMining() {
- return api.e.StartMining()
+ return api.e.StartMining(true)
}
return nil
}
diff --git a/eth/backend.go b/eth/backend.go
index df5460201..6c3ccb9b9 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -22,6 +22,7 @@ import (
"math/big"
"regexp"
"sync"
+ "sync/atomic"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
@@ -326,12 +327,19 @@ func (self *Ethereum) SetEtherbase(etherbase common.Address) {
self.miner.SetEtherbase(etherbase)
}
-func (s *Ethereum) StartMining() error {
+func (s *Ethereum) StartMining(local bool) error {
eb, err := s.Etherbase()
if err != nil {
log.Error("Cannot start mining without etherbase", "err", err)
return fmt.Errorf("etherbase missing: %v", err)
}
+ if local {
+ // If local (CPU) mining is started, we can disable the transaction rejection
+ // mechanism introduced to speed sync times. CPU mining on mainnet is ludicrous
+ // so noone will ever hit this path, whereas marking sync done on CPU mining
+ // will ensure that private networks work in single miner mode too.
+ atomic.StoreUint32(&s.protocolManager.acceptTxs, 1)
+ }
go s.miner.Start(eb)
return nil
}
diff --git a/eth/handler.go b/eth/handler.go
index ef62a3d65..99c2c4b32 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -62,8 +62,8 @@ func errResp(code errCode, format string, v ...interface{}) error {
type ProtocolManager struct {
networkId int
- fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks)
- synced uint32 // Flag whether we're considered synchronised (enables transaction processing)
+ fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks)
+ acceptTxs uint32 // Flag whether we're considered synchronised (enables transaction processing)
txpool txPool
blockchain *core.BlockChain
@@ -171,7 +171,7 @@ func NewProtocolManager(config *params.ChainConfig, fastSync bool, networkId int
return blockchain.CurrentBlock().NumberU64()
}
inserter := func(blocks types.Blocks) (int, error) {
- atomic.StoreUint32(&manager.synced, 1) // Mark initial sync done on any fetcher import
+ atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import
return manager.blockchain.InsertChain(blocks)
}
manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer)
@@ -643,7 +643,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
case msg.Code == TxMsg:
// Transactions arrived, make sure we have a valid and fresh chain to handle them
- if atomic.LoadUint32(&pm.synced) == 0 {
+ if atomic.LoadUint32(&pm.acceptTxs) == 0 {
break
}
// Transactions can be processed, parse all of them and deliver to the pool
diff --git a/eth/protocol_test.go b/eth/protocol_test.go
index 253dcd8a7..3c9a734df 100644
--- a/eth/protocol_test.go
+++ b/eth/protocol_test.go
@@ -94,7 +94,7 @@ func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) }
func testRecvTransactions(t *testing.T, protocol int) {
txAdded := make(chan []*types.Transaction)
pm := newTestProtocolManagerMust(t, false, 0, nil, txAdded)
- pm.synced = 1 // mark synced to accept transactions
+ pm.acceptTxs = 1 // mark synced to accept transactions
p, _ := newTestPeer("peer", protocol, pm, true)
defer pm.Stop()
defer p.close()
diff --git a/eth/sync.go b/eth/sync.go
index 68d3afdb8..b0653acf9 100644
--- a/eth/sync.go
+++ b/eth/sync.go
@@ -188,7 +188,7 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil {
return
}
- atomic.StoreUint32(&pm.synced, 1) // Mark initial sync done
+ atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done
if head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 {
// We've completed a sync cycle, notify all peers of new state. This path is
// essential in star-topology networks where a gateway node needs to notify