aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2016-05-17 20:56:57 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2016-05-17 20:56:57 +0800
commitc8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7 (patch)
tree438a14920171c8fbbff7995c15bf09a80993a50b
parentadc1b503957e572c4ec30533de3ec28ec6feea13 (diff)
parentd87f7a1e817cbecbb62c012ed3811ceba933ae3a (diff)
downloaddexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.gz
dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.zst
dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.zip
Merge pull request #2574 from karalabe/notx-during-fastsync
eth: skip transaction handling during fast sync
-rw-r--r--eth/handler.go23
-rw-r--r--eth/sync.go7
-rw-r--r--eth/sync_test.go7
3 files changed, 23 insertions, 14 deletions
diff --git a/eth/handler.go b/eth/handler.go
index 3980a625e..202acdc78 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -22,6 +22,7 @@ import (
"math"
"math/big"
"sync"
+ "sync/atomic"
"time"
"github.com/ethereum/go-ethereum/common"
@@ -58,7 +59,7 @@ type blockFetcherFn func([]common.Hash) error
type ProtocolManager struct {
networkId int
- fastSync bool
+ fastSync uint32
txpool txPool
blockchain *core.BlockChain
chaindb ethdb.Database
@@ -87,15 +88,9 @@ type ProtocolManager struct {
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
// with the ethereum network.
func NewProtocolManager(config *core.ChainConfig, fastSync bool, networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) {
- // Figure out whether to allow fast sync or not
- if fastSync && blockchain.CurrentBlock().NumberU64() > 0 {
- glog.V(logger.Info).Infof("blockchain not empty, fast sync disabled")
- fastSync = false
- }
// Create the protocol manager with the base fields
manager := &ProtocolManager{
networkId: networkId,
- fastSync: fastSync,
eventMux: mux,
txpool: txpool,
blockchain: blockchain,
@@ -106,6 +101,14 @@ func NewProtocolManager(config *core.ChainConfig, fastSync bool, networkId int,
txsyncCh: make(chan *txsync),
quitSync: make(chan struct{}),
}
+ // Figure out whether to allow fast sync or not
+ if fastSync && blockchain.CurrentBlock().NumberU64() > 0 {
+ glog.V(logger.Info).Infof("blockchain not empty, fast sync disabled")
+ fastSync = false
+ }
+ if fastSync {
+ manager.fastSync = uint32(1)
+ }
// Initiate a sub-protocol for every implemented version we can handle
manager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions))
for i, version := range ProtocolVersions {
@@ -678,7 +681,11 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
}
case msg.Code == TxMsg:
- // Transactions arrived, parse all of them and deliver to the pool
+ // Transactions arrived, make sure we have a valid chain to handle them
+ if atomic.LoadUint32(&pm.fastSync) == 1 {
+ break
+ }
+ // Transactions can be processed, parse all of them and deliver to the pool
var txs []*types.Transaction
if err := msg.Decode(&txs); err != nil {
return errResp(ErrDecode, "msg %v: %v", msg, err)
diff --git a/eth/sync.go b/eth/sync.go
index 69881530d..4b16c1322 100644
--- a/eth/sync.go
+++ b/eth/sync.go
@@ -18,6 +18,7 @@ package eth
import (
"math/rand"
+ "sync/atomic"
"time"
"github.com/ethereum/go-ethereum/common"
@@ -167,18 +168,18 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
}
// Otherwise try to sync with the downloader
mode := downloader.FullSync
- if pm.fastSync {
+ if atomic.LoadUint32(&pm.fastSync) == 1 {
mode = downloader.FastSync
}
if err := pm.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), mode); err != nil {
return
}
// If fast sync was enabled, and we synced up, disable it
- if pm.fastSync {
+ if atomic.LoadUint32(&pm.fastSync) == 1 {
// Disable fast sync if we indeed have something in our chain
if pm.blockchain.CurrentBlock().NumberU64() > 0 {
glog.V(logger.Info).Infof("fast sync complete, auto disabling")
- pm.fastSync = false
+ atomic.StoreUint32(&pm.fastSync, 0)
}
}
}
diff --git a/eth/sync_test.go b/eth/sync_test.go
index afd90c9b6..198ffaf27 100644
--- a/eth/sync_test.go
+++ b/eth/sync_test.go
@@ -17,6 +17,7 @@
package eth
import (
+ "sync/atomic"
"testing"
"time"
@@ -29,12 +30,12 @@ import (
func TestFastSyncDisabling(t *testing.T) {
// Create a pristine protocol manager, check that fast sync is left enabled
pmEmpty := newTestProtocolManagerMust(t, true, 0, nil, nil)
- if !pmEmpty.fastSync {
+ if atomic.LoadUint32(&pmEmpty.fastSync) == 0 {
t.Fatalf("fast sync disabled on pristine blockchain")
}
// Create a full protocol manager, check that fast sync gets disabled
pmFull := newTestProtocolManagerMust(t, true, 1024, nil, nil)
- if pmFull.fastSync {
+ if atomic.LoadUint32(&pmFull.fastSync) == 1 {
t.Fatalf("fast sync not disabled on non-empty blockchain")
}
// Sync up the two peers
@@ -47,7 +48,7 @@ func TestFastSyncDisabling(t *testing.T) {
pmEmpty.synchronise(pmEmpty.peers.BestPeer())
// Check that fast sync was disabled
- if pmEmpty.fastSync {
+ if atomic.LoadUint32(&pmEmpty.fastSync) == 1 {
t.Fatalf("fast sync not disabled after successful synchronisation")
}
}