diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-05-17 20:56:57 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-05-17 20:56:57 +0800 |
commit | c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7 (patch) | |
tree | 438a14920171c8fbbff7995c15bf09a80993a50b | |
parent | adc1b503957e572c4ec30533de3ec28ec6feea13 (diff) | |
parent | d87f7a1e817cbecbb62c012ed3811ceba933ae3a (diff) | |
download | dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.gz dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.bz2 dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.lz dexon-c8a8ad97f7e8889ca9f3aece7ddb50cce8ef18c7.tar.xz 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.go | 23 | ||||
-rw-r--r-- | eth/sync.go | 7 | ||||
-rw-r--r-- | eth/sync_test.go | 7 |
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") } } |