mirror of
https://gitlab.com/pulsechaincom/go-pulse.git
synced 2024-12-23 20:07:16 +00:00
d6c5f2417c
* eth: improve shutdown synchronization Most goroutines started by eth.Ethereum didn't have any shutdown sync at all, which lead to weird error messages when quitting the client. This change improves the clean shutdown path by stopping all internal components in dependency order and waiting for them to actually be stopped before shutdown is considered done. In particular, we now stop everything related to peers before stopping 'resident' parts such as core.BlockChain. * eth: rewrite sync controller * eth: remove sync start debug message * eth: notify chainSyncer about new peers after handshake * eth: move downloader.Cancel call into chainSyncer * eth: make post-sync block broadcast synchronous * eth: add comments * core: change blockchain stop message * eth: change closeBloomHandler channel type
65 lines
2.5 KiB
Go
65 lines
2.5 KiB
Go
// Copyright 2015 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package eth
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/eth/downloader"
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
|
)
|
|
|
|
func TestFastSyncDisabling63(t *testing.T) { testFastSyncDisabling(t, 63) }
|
|
func TestFastSyncDisabling64(t *testing.T) { testFastSyncDisabling(t, 64) }
|
|
func TestFastSyncDisabling65(t *testing.T) { testFastSyncDisabling(t, 65) }
|
|
|
|
// Tests that fast sync gets disabled as soon as a real block is successfully
|
|
// imported into the blockchain.
|
|
func testFastSyncDisabling(t *testing.T, protocol int) {
|
|
t.Parallel()
|
|
|
|
// Create a pristine protocol manager, check that fast sync is left enabled
|
|
pmEmpty, _ := newTestProtocolManagerMust(t, downloader.FastSync, 0, nil, nil)
|
|
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, downloader.FastSync, 1024, nil, nil)
|
|
if atomic.LoadUint32(&pmFull.fastSync) == 1 {
|
|
t.Fatalf("fast sync not disabled on non-empty blockchain")
|
|
}
|
|
|
|
// Sync up the two peers
|
|
io1, io2 := p2p.MsgPipe()
|
|
go pmFull.handle(pmFull.newPeer(protocol, p2p.NewPeer(enode.ID{}, "empty", nil), io2, pmFull.txpool.Get))
|
|
go pmEmpty.handle(pmEmpty.newPeer(protocol, p2p.NewPeer(enode.ID{}, "full", nil), io1, pmEmpty.txpool.Get))
|
|
|
|
time.Sleep(250 * time.Millisecond)
|
|
op := peerToSyncOp(downloader.FastSync, pmEmpty.peers.BestPeer())
|
|
if err := pmEmpty.doSync(op); err != nil {
|
|
t.Fatal("sync failed:", err)
|
|
}
|
|
|
|
// Check that fast sync was disabled
|
|
if atomic.LoadUint32(&pmEmpty.fastSync) == 1 {
|
|
t.Fatalf("fast sync not disabled after successful synchronisation")
|
|
}
|
|
}
|