Skip to content

Commit 857fa79

Browse files
committed
Avoid crash when sending from inactive keyper
Previously keypers would crash, when trying to send a batch config to shuttermint ahead of time, with the crash log ``` Error: remote error: checktx: not a keyper set member remote error: checktx: not a keyper set member ``` With these changes, keypers will a) check, if they are known to shuttermint, and therefore allowed to send messages. b) keep messages that failed to send in the outgoing message queue. This is part of #465
1 parent 393eba9 commit 857fa79

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

rolling-shutter/keyper/fx/messagesender.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ type MessageSender interface {
7474

7575
// RPCMessageSender signs messages and sends them via RPC to shuttermint.
7676
type RPCMessageSender struct {
77-
rpcclient client.Client
78-
chainID string
79-
signingKey *ecdsa.PrivateKey
77+
rpcclient client.Client
78+
chainID string
79+
signingKey *ecdsa.PrivateKey
80+
AllowedToSend bool
8081
}
8182

8283
var _ MessageSender = &RPCMessageSender{}
@@ -93,14 +94,19 @@ var mockMessageSenderBufferSize = 0x10000
9394
// NewRPCMessageSender creates a new RPCMessageSender.
9495
func NewRPCMessageSender(cl client.Client, signingKey *ecdsa.PrivateKey) RPCMessageSender {
9596
return RPCMessageSender{
96-
rpcclient: cl,
97-
chainID: "",
98-
signingKey: signingKey,
97+
rpcclient: cl,
98+
chainID: "",
99+
signingKey: signingKey,
100+
AllowedToSend: false,
99101
}
100102
}
101103

102104
// SendMessage signs the given shmsg.Message and sends the message to shuttermint.
103105
func (ms *RPCMessageSender) SendMessage(ctx context.Context, msg *shmsg.Message) error {
106+
if !ms.AllowedToSend {
107+
log.Info().Str("msg", msg.String()).Msg("not allowed to send")
108+
return nil
109+
}
104110
if err := ms.maybeFetchChainID(ctx); err != nil {
105111
return err
106112
}

rolling-shutter/keyper/fx/send.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,13 @@ func SendShutterMessages(
3131
}
3232
err = messageSender.SendMessage(ctx, msg)
3333
if err != nil {
34-
return err // XXX retry
34+
if !isRetrieable(msg) {
35+
log.Err(err).Str("msg", msg.String()).Msg("sending non-retrieable msg failed")
36+
return err
37+
} else {
38+
log.Info().Str("msg", msg.String()).Msg("msg not accepted, will be retried")
39+
return nil
40+
}
3541
}
3642
log.Info().Int32("id", outgoing.ID).
3743
Str("description", outgoing.Description).
@@ -42,3 +48,8 @@ func SendShutterMessages(
4248
}
4349
}
4450
}
51+
52+
// isRetrieable is a no-op so far
53+
func isRetrieable(msg *shmsg.Message) bool {
54+
return true
55+
}

rolling-shutter/keyper/keyper.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,9 @@ func (kpr *KeyperCore) operateShuttermint(ctx context.Context, _ service.Runner)
358358
if err != nil {
359359
return err
360360
}
361-
361+
if !kpr.messageSender.AllowedToSend {
362+
allowSendIfInKeyperSet(ctx, database.New(kpr.dbpool), syncBlockNumber, kpr)
363+
}
362364
err = fx.SendShutterMessages(ctx, database.New(kpr.dbpool), &kpr.messageSender)
363365
if err != nil {
364366
return err
@@ -370,3 +372,18 @@ func (kpr *KeyperCore) operateShuttermint(ctx context.Context, _ service.Runner)
370372
}
371373
}
372374
}
375+
376+
func allowSendIfInKeyperSet(ctx context.Context, queries *database.Queries, syncBlockNumber uint64, kpr *KeyperCore) {
377+
count, err := queries.CountBatchConfigsInBlockRangeWithKeyper(ctx,
378+
database.CountBatchConfigsInBlockRangeWithKeyperParams{
379+
KeyperAddress: []string{kpr.config.GetAddress().String()},
380+
StartBlock: 0,
381+
EndBlock: int64(syncBlockNumber),
382+
})
383+
if err != nil {
384+
log.Err(err).Msg("could not query if in keyper set")
385+
}
386+
if count > 0 {
387+
kpr.messageSender.AllowedToSend = true
388+
}
389+
}

0 commit comments

Comments
 (0)