Stop privVal socket client on node shutdown

This commit is contained in:
Alexander Simmerl 2018-03-06 16:11:17 +01:00
parent 25ff699425
commit ca619c80b6
No known key found for this signature in database
GPG Key ID: 4694E95C9CC61BDA
3 changed files with 27 additions and 22 deletions

View File

@ -441,8 +441,13 @@ func (n *Node) OnStop() {
} }
n.eventBus.Stop() n.eventBus.Stop()
n.indexerService.Stop() n.indexerService.Stop()
if pvsc, ok := n.privValidator.(*priv_val.SocketClient); ok {
if err := pvsc.Stop(); err != nil {
n.Logger.Error("Error stopping priv validator socket client", "err", err)
}
}
} }
// RunForever waits for an interrupt signal and stops the node. // RunForever waits for an interrupt signal and stops the node.

View File

@ -32,17 +32,17 @@ var (
) )
// SocketClientOption sets an optional parameter on the SocketClient. // SocketClientOption sets an optional parameter on the SocketClient.
type SocketClientOption func(*socketClient) type SocketClientOption func(*SocketClient)
// SocketClientTimeout sets the timeout for connecting to the external socket // SocketClientTimeout sets the timeout for connecting to the external socket
// address. // address.
func SocketClientTimeout(timeout time.Duration) SocketClientOption { func SocketClientTimeout(timeout time.Duration) SocketClientOption {
return func(sc *socketClient) { sc.connectTimeout = timeout } return func(sc *SocketClient) { sc.connectTimeout = timeout }
} }
// socketClient implements PrivValidator, it uses a socket to request signatures // SocketClient implements PrivValidator, it uses a socket to request signatures
// from an external process. // from an external process.
type socketClient struct { type SocketClient struct {
cmn.BaseService cmn.BaseService
conn net.Conn conn net.Conn
@ -52,28 +52,28 @@ type socketClient struct {
connectTimeout time.Duration connectTimeout time.Duration
} }
// Check that socketClient implements PrivValidator2. // Check that SocketClient implements PrivValidator2.
var _ types.PrivValidator2 = (*socketClient)(nil) var _ types.PrivValidator2 = (*SocketClient)(nil)
// NewSocketClient returns an instance of socketClient. // NewSocketClient returns an instance of SocketClient.
func NewSocketClient( func NewSocketClient(
logger log.Logger, logger log.Logger,
socketAddr string, socketAddr string,
privKey *crypto.PrivKeyEd25519, privKey *crypto.PrivKeyEd25519,
) *socketClient { ) *SocketClient {
sc := &socketClient{ sc := &SocketClient{
addr: socketAddr, addr: socketAddr,
connectTimeout: time.Second * defaultConnDeadlineSeconds, connectTimeout: time.Second * defaultConnDeadlineSeconds,
privKey: privKey, privKey: privKey,
} }
sc.BaseService = *cmn.NewBaseService(logger, "privValidatorsocketClient", sc) sc.BaseService = *cmn.NewBaseService(logger, "privValidatorSocketClient", sc)
return sc return sc
} }
// OnStart implements cmn.Service. // OnStart implements cmn.Service.
func (sc *socketClient) OnStart() error { func (sc *SocketClient) OnStart() error {
if err := sc.BaseService.OnStart(); err != nil { if err := sc.BaseService.OnStart(); err != nil {
return err return err
} }
@ -89,7 +89,7 @@ func (sc *socketClient) OnStart() error {
} }
// OnStop implements cmn.Service. // OnStop implements cmn.Service.
func (sc *socketClient) OnStop() { func (sc *SocketClient) OnStop() {
sc.BaseService.OnStop() sc.BaseService.OnStop()
if sc.conn != nil { if sc.conn != nil {
@ -99,7 +99,7 @@ func (sc *socketClient) OnStop() {
// GetAddress implements PrivValidator. // GetAddress implements PrivValidator.
// TODO(xla): Remove when PrivValidator2 replaced PrivValidator. // TODO(xla): Remove when PrivValidator2 replaced PrivValidator.
func (sc *socketClient) GetAddress() types.Address { func (sc *SocketClient) GetAddress() types.Address {
addr, err := sc.Address() addr, err := sc.Address()
if err != nil { if err != nil {
panic(err) panic(err)
@ -109,7 +109,7 @@ func (sc *socketClient) GetAddress() types.Address {
} }
// Address is an alias for PubKey().Address(). // Address is an alias for PubKey().Address().
func (sc *socketClient) Address() (cmn.HexBytes, error) { func (sc *SocketClient) Address() (cmn.HexBytes, error) {
p, err := sc.PubKey() p, err := sc.PubKey()
if err != nil { if err != nil {
return nil, err return nil, err
@ -120,7 +120,7 @@ func (sc *socketClient) Address() (cmn.HexBytes, error) {
// GetPubKey implements PrivValidator. // GetPubKey implements PrivValidator.
// TODO(xla): Remove when PrivValidator2 replaced PrivValidator. // TODO(xla): Remove when PrivValidator2 replaced PrivValidator.
func (sc *socketClient) GetPubKey() crypto.PubKey { func (sc *SocketClient) GetPubKey() crypto.PubKey {
pubKey, err := sc.PubKey() pubKey, err := sc.PubKey()
if err != nil { if err != nil {
panic(err) panic(err)
@ -130,7 +130,7 @@ func (sc *socketClient) GetPubKey() crypto.PubKey {
} }
// PubKey implements PrivValidator2. // PubKey implements PrivValidator2.
func (sc *socketClient) PubKey() (crypto.PubKey, error) { func (sc *SocketClient) PubKey() (crypto.PubKey, error) {
err := writeMsg(sc.conn, &PubKeyMsg{}) err := writeMsg(sc.conn, &PubKeyMsg{})
if err != nil { if err != nil {
return crypto.PubKey{}, err return crypto.PubKey{}, err
@ -145,7 +145,7 @@ func (sc *socketClient) PubKey() (crypto.PubKey, error) {
} }
// SignVote implements PrivValidator2. // SignVote implements PrivValidator2.
func (sc *socketClient) SignVote(chainID string, vote *types.Vote) error { func (sc *SocketClient) SignVote(chainID string, vote *types.Vote) error {
err := writeMsg(sc.conn, &SignVoteMsg{Vote: vote}) err := writeMsg(sc.conn, &SignVoteMsg{Vote: vote})
if err != nil { if err != nil {
return err return err
@ -162,7 +162,7 @@ func (sc *socketClient) SignVote(chainID string, vote *types.Vote) error {
} }
// SignProposal implements PrivValidator2. // SignProposal implements PrivValidator2.
func (sc *socketClient) SignProposal(chainID string, proposal *types.Proposal) error { func (sc *SocketClient) SignProposal(chainID string, proposal *types.Proposal) error {
err := writeMsg(sc.conn, &SignProposalMsg{Proposal: proposal}) err := writeMsg(sc.conn, &SignProposalMsg{Proposal: proposal})
if err != nil { if err != nil {
return err return err
@ -179,7 +179,7 @@ func (sc *socketClient) SignProposal(chainID string, proposal *types.Proposal) e
} }
// SignHeartbeat implements PrivValidator2. // SignHeartbeat implements PrivValidator2.
func (sc *socketClient) SignHeartbeat(chainID string, heartbeat *types.Heartbeat) error { func (sc *SocketClient) SignHeartbeat(chainID string, heartbeat *types.Heartbeat) error {
err := writeMsg(sc.conn, &SignHeartbeatMsg{Heartbeat: heartbeat}) err := writeMsg(sc.conn, &SignHeartbeatMsg{Heartbeat: heartbeat})
if err != nil { if err != nil {
return err return err
@ -195,7 +195,7 @@ func (sc *socketClient) SignHeartbeat(chainID string, heartbeat *types.Heartbeat
return nil return nil
} }
func (sc *socketClient) connect() (net.Conn, error) { func (sc *SocketClient) connect() (net.Conn, error) {
retries := defaultDialRetryMax retries := defaultDialRetryMax
RETRY_LOOP: RETRY_LOOP:

View File

@ -128,7 +128,7 @@ func TestSocketClientConnectRetryMax(t *testing.T) {
assert.EqualError(sc.Start(), ErrDialRetryMax.Error()) assert.EqualError(sc.Start(), ErrDialRetryMax.Error())
} }
func testSetupSocketPair(t *testing.T, chainID string) (*socketClient, *PrivValidatorSocketServer) { func testSetupSocketPair(t *testing.T, chainID string) (*SocketClient, *PrivValidatorSocketServer) {
var ( var (
assert, require = assert.New(t), require.New(t) assert, require = assert.New(t), require.New(t)
logger = log.TestingLogger() logger = log.TestingLogger()