network/consensus: always process dBFT messages as high priority
Move category definition from consensus to payload, consensus service is the one of its kind (HP), so network.Server can be adjusted accordingly.
This commit is contained in:
parent
ff93a680eb
commit
9b0ea2c21b
8 changed files with 20 additions and 26 deletions
|
@ -151,7 +151,7 @@ func newTestChain(t *testing.T, f func(*config.Config), run bool) (*core.Blockch
|
||||||
TimePerBlock: serverConfig.TimePerBlock,
|
TimePerBlock: serverConfig.TimePerBlock,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
netSrv.AddExtensibleHPService(cons, consensus.Category, cons.OnPayload, cons.OnTransaction)
|
netSrv.AddConsensusService(cons, cons.OnPayload, cons.OnTransaction)
|
||||||
go netSrv.Start(make(chan error, 1))
|
go netSrv.Start(make(chan error, 1))
|
||||||
errCh := make(chan error, 2)
|
errCh := make(chan error, 2)
|
||||||
rpcServer := rpcsrv.New(chain, cfg.ApplicationConfiguration.RPC, netSrv, nil, logger, errCh)
|
rpcServer := rpcsrv.New(chain, cfg.ApplicationConfiguration.RPC, netSrv, nil, logger, errCh)
|
||||||
|
|
|
@ -423,7 +423,7 @@ func mkConsensus(config config.Wallet, tpb time.Duration, chain *core.Blockchain
|
||||||
return nil, fmt.Errorf("can't initialize Consensus module: %w", err)
|
return nil, fmt.Errorf("can't initialize Consensus module: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
serv.AddExtensibleHPService(srv, consensus.Category, srv.OnPayload, srv.OnTransaction)
|
serv.AddConsensusService(srv, srv.OnPayload, srv.OnTransaction)
|
||||||
return srv, nil
|
return srv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,7 +606,7 @@ Main:
|
||||||
}
|
}
|
||||||
case sigusr2:
|
case sigusr2:
|
||||||
if dbftSrv != nil {
|
if dbftSrv != nil {
|
||||||
serv.DelExtensibleHPService(dbftSrv, consensus.Category)
|
serv.DelConsensusService(dbftSrv)
|
||||||
dbftSrv.Shutdown()
|
dbftSrv.Shutdown()
|
||||||
}
|
}
|
||||||
dbftSrv, err = mkConsensus(cfgnew.ApplicationConfiguration.UnlockWallet, serverConfig.TimePerBlock, chain, serv, log)
|
dbftSrv, err = mkConsensus(cfgnew.ApplicationConfiguration.UnlockWallet, serverConfig.TimePerBlock, chain, serv, log)
|
||||||
|
|
|
@ -40,9 +40,6 @@ const defaultTimePerBlock = 15 * time.Second
|
||||||
// Number of nanoseconds in millisecond.
|
// Number of nanoseconds in millisecond.
|
||||||
const nsInMs = 1000000
|
const nsInMs = 1000000
|
||||||
|
|
||||||
// Category is a message category for extensible payloads.
|
|
||||||
const Category = "dBFT"
|
|
||||||
|
|
||||||
// Ledger is the interface to Blockchain sufficient for Service.
|
// Ledger is the interface to Blockchain sufficient for Service.
|
||||||
type Ledger interface {
|
type Ledger interface {
|
||||||
AddBlock(block *coreb.Block) error
|
AddBlock(block *coreb.Block) error
|
||||||
|
@ -218,7 +215,7 @@ var (
|
||||||
func NewPayload(m netmode.Magic, stateRootEnabled bool) *Payload {
|
func NewPayload(m netmode.Magic, stateRootEnabled bool) *Payload {
|
||||||
return &Payload{
|
return &Payload{
|
||||||
Extensible: npayload.Extensible{
|
Extensible: npayload.Extensible{
|
||||||
Category: Category,
|
Category: npayload.ConsensusCategory,
|
||||||
},
|
},
|
||||||
message: message{
|
message: message{
|
||||||
stateRootEnabled: stateRootEnabled,
|
stateRootEnabled: stateRootEnabled,
|
||||||
|
|
|
@ -297,7 +297,7 @@ func getVerificationScript(i uint8, validators []crypto.PublicKey) []byte {
|
||||||
func fromPayload(t messageType, recovery *Payload, p io.Serializable) *Payload {
|
func fromPayload(t messageType, recovery *Payload, p io.Serializable) *Payload {
|
||||||
return &Payload{
|
return &Payload{
|
||||||
Extensible: npayload.Extensible{
|
Extensible: npayload.Extensible{
|
||||||
Category: Category,
|
Category: npayload.ConsensusCategory,
|
||||||
ValidBlockEnd: recovery.BlockIndex,
|
ValidBlockEnd: recovery.BlockIndex,
|
||||||
},
|
},
|
||||||
message: message{
|
message: message{
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/fakechain"
|
"github.com/nspcc-dev/neo-go/internal/fakechain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/consensus"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
||||||
|
|
|
@ -11,6 +11,10 @@ import (
|
||||||
|
|
||||||
const maxExtensibleCategorySize = 32
|
const maxExtensibleCategorySize = 32
|
||||||
|
|
||||||
|
// ConsensusCategory is a message category for consensus-related extensible
|
||||||
|
// payloads.
|
||||||
|
const ConsensusCategory = "dBFT"
|
||||||
|
|
||||||
// Extensible represents a payload containing arbitrary data.
|
// Extensible represents a payload containing arbitrary data.
|
||||||
type Extensible struct {
|
type Extensible struct {
|
||||||
// Category is the payload type.
|
// Category is the payload type.
|
||||||
|
|
|
@ -105,7 +105,6 @@ type (
|
||||||
serviceLock sync.RWMutex
|
serviceLock sync.RWMutex
|
||||||
services map[string]Service
|
services map[string]Service
|
||||||
extensHandlers map[string]func(*payload.Extensible) error
|
extensHandlers map[string]func(*payload.Extensible) error
|
||||||
extensHighPrio string
|
|
||||||
txCallback func(*transaction.Transaction)
|
txCallback func(*transaction.Transaction)
|
||||||
|
|
||||||
txInLock sync.Mutex
|
txInLock sync.Mutex
|
||||||
|
@ -301,13 +300,12 @@ func (s *Server) addExtensibleService(svc Service, category string, handler func
|
||||||
s.addService(svc)
|
s.addService(svc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddExtensibleHPService registers a high-priority service that handles an extensible payload of some kind.
|
// AddConsensusService registers consensus service that handles transactions and dBFT extensible payloads.
|
||||||
func (s *Server) AddExtensibleHPService(svc Service, category string, handler func(*payload.Extensible) error, txCallback func(*transaction.Transaction)) {
|
func (s *Server) AddConsensusService(svc Service, handler func(*payload.Extensible) error, txCallback func(*transaction.Transaction)) {
|
||||||
s.serviceLock.Lock()
|
s.serviceLock.Lock()
|
||||||
defer s.serviceLock.Unlock()
|
defer s.serviceLock.Unlock()
|
||||||
s.txCallback = txCallback
|
s.txCallback = txCallback
|
||||||
s.extensHighPrio = category
|
s.addExtensibleService(svc, payload.ConsensusCategory, handler)
|
||||||
s.addExtensibleService(svc, category, handler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelService drops a service from the list, use it when the service is stopped
|
// DelService drops a service from the list, use it when the service is stopped
|
||||||
|
@ -337,13 +335,12 @@ func (s *Server) delExtensibleService(svc Service, category string) {
|
||||||
s.delService(svc)
|
s.delService(svc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelExtensibleHPService unregisters a high-priority service that handles an extensible payload of some kind.
|
// DelConsensusService unregisters consensus service that handles transactions and dBFT extensible payloads.
|
||||||
func (s *Server) DelExtensibleHPService(svc Service, category string) {
|
func (s *Server) DelConsensusService(svc Service) {
|
||||||
s.serviceLock.Lock()
|
s.serviceLock.Lock()
|
||||||
defer s.serviceLock.Unlock()
|
defer s.serviceLock.Unlock()
|
||||||
s.txCallback = nil
|
s.txCallback = nil
|
||||||
s.extensHighPrio = ""
|
s.delExtensibleService(svc, payload.ConsensusCategory)
|
||||||
s.delExtensibleService(svc, category)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNotaryPool allows to retrieve notary pool, if it's configured.
|
// GetNotaryPool allows to retrieve notary pool, if it's configured.
|
||||||
|
@ -1004,10 +1001,7 @@ func (s *Server) handleExtensibleCmd(e *payload.Extensible) error {
|
||||||
|
|
||||||
func (s *Server) advertiseExtensible(e *payload.Extensible) {
|
func (s *Server) advertiseExtensible(e *payload.Extensible) {
|
||||||
msg := NewMessage(CMDInv, payload.NewInventory(payload.ExtensibleType, []util.Uint256{e.Hash()}))
|
msg := NewMessage(CMDInv, payload.NewInventory(payload.ExtensibleType, []util.Uint256{e.Hash()}))
|
||||||
s.serviceLock.RLock()
|
if e.Category == payload.ConsensusCategory {
|
||||||
hp := s.extensHighPrio
|
|
||||||
s.serviceLock.RUnlock()
|
|
||||||
if e.Category == hp {
|
|
||||||
// It's high priority because it directly affects consensus process,
|
// It's high priority because it directly affects consensus process,
|
||||||
// even though it's just an inv.
|
// even though it's just an inv.
|
||||||
s.broadcastHPMessage(msg)
|
s.broadcastHPMessage(msg)
|
||||||
|
|
|
@ -111,7 +111,7 @@ func TestServerStartAndShutdown(t *testing.T) {
|
||||||
t.Run("with consensus", func(t *testing.T) {
|
t.Run("with consensus", func(t *testing.T) {
|
||||||
s := newTestServer(t, ServerConfig{})
|
s := newTestServer(t, ServerConfig{})
|
||||||
cons := new(fakeConsensus)
|
cons := new(fakeConsensus)
|
||||||
s.AddExtensibleHPService(cons, consensus.Category, cons.OnPayload, cons.OnTransaction)
|
s.AddConsensusService(cons, cons.OnPayload, cons.OnTransaction)
|
||||||
|
|
||||||
ch := startWithChannel(s)
|
ch := startWithChannel(s)
|
||||||
p := newLocalPeer(t, s)
|
p := newLocalPeer(t, s)
|
||||||
|
@ -413,7 +413,7 @@ func TestBlock(t *testing.T) {
|
||||||
func TestConsensus(t *testing.T) {
|
func TestConsensus(t *testing.T) {
|
||||||
s := newTestServer(t, ServerConfig{})
|
s := newTestServer(t, ServerConfig{})
|
||||||
cons := new(fakeConsensus)
|
cons := new(fakeConsensus)
|
||||||
s.AddExtensibleHPService(cons, consensus.Category, cons.OnPayload, cons.OnTransaction)
|
s.AddConsensusService(cons, cons.OnPayload, cons.OnTransaction)
|
||||||
startWithCleanup(t, s)
|
startWithCleanup(t, s)
|
||||||
|
|
||||||
atomic2.StoreUint32(&s.chain.(*fakechain.FakeChain).Blockheight, 4)
|
atomic2.StoreUint32(&s.chain.(*fakechain.FakeChain).Blockheight, 4)
|
||||||
|
@ -424,7 +424,7 @@ func TestConsensus(t *testing.T) {
|
||||||
|
|
||||||
newConsensusMessage := func(start, end uint32) *Message {
|
newConsensusMessage := func(start, end uint32) *Message {
|
||||||
pl := payload.NewExtensible()
|
pl := payload.NewExtensible()
|
||||||
pl.Category = consensus.Category
|
pl.Category = payload.ConsensusCategory
|
||||||
pl.ValidBlockStart = start
|
pl.ValidBlockStart = start
|
||||||
pl.ValidBlockEnd = end
|
pl.ValidBlockEnd = end
|
||||||
return NewMessage(CMDExtensible, pl)
|
return NewMessage(CMDExtensible, pl)
|
||||||
|
@ -458,7 +458,7 @@ func TestConsensus(t *testing.T) {
|
||||||
func TestTransaction(t *testing.T) {
|
func TestTransaction(t *testing.T) {
|
||||||
s := newTestServer(t, ServerConfig{})
|
s := newTestServer(t, ServerConfig{})
|
||||||
cons := new(fakeConsensus)
|
cons := new(fakeConsensus)
|
||||||
s.AddExtensibleHPService(cons, consensus.Category, cons.OnPayload, cons.OnTransaction)
|
s.AddConsensusService(cons, cons.OnPayload, cons.OnTransaction)
|
||||||
startWithCleanup(t, s)
|
startWithCleanup(t, s)
|
||||||
|
|
||||||
t.Run("good", func(t *testing.T) {
|
t.Run("good", func(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue