feat: module circuit breaker (#14521)
Co-authored-by: Aaron Craelius <aaron@regen.network> Co-authored-by: Julien Robert <julien@rbrt.fr> Co-authored-by: Sam Ricotta <samanthalricotta@gmail.com> Co-authored-by: samricotta <37125168+samricotta@users.noreply.github.com> Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com>
This commit is contained in:
co-authored by
Aaron Craelius
Julien Robert
Sam Ricotta
samricotta
Facundo Medica
parent
d818a628a1
commit
b8e15a7930
@@ -431,6 +431,12 @@ func (app *BaseApp) setState(mode runTxMode, header cmtproto.Header) {
|
||||
}
|
||||
}
|
||||
|
||||
// SetCircuitBreaker sets the circuit breaker for the BaseApp.
|
||||
// The circuit breaker is checked on every message execution to verify if a transaction should be executed or not.
|
||||
func (app *BaseApp) SetCircuitBreaker(cb CircuitBreaker) {
|
||||
app.msgServiceRouter.SetCircuit(cb)
|
||||
}
|
||||
|
||||
// GetConsensusParams returns the current consensus parameters from the BaseApp's
|
||||
// ParamStore. If the BaseApp has no ParamStore defined, nil is returned.
|
||||
func (app *BaseApp) GetConsensusParams(ctx sdk.Context) cmtproto.ConsensusParams {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package baseapp
|
||||
|
||||
import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
// CircuitBreaker is an interface that defines the methods for a circuit breaker.
|
||||
type CircuitBreaker interface {
|
||||
IsAllowed(ctx sdk.Context, typeURL string) bool
|
||||
}
|
||||
@@ -26,6 +26,7 @@ type MessageRouter interface {
|
||||
type MsgServiceRouter struct {
|
||||
interfaceRegistry codectypes.InterfaceRegistry
|
||||
routes map[string]MsgServiceHandler
|
||||
circuitBreaker CircuitBreaker
|
||||
}
|
||||
|
||||
var _ gogogrpc.Server = &MsgServiceRouter{}
|
||||
@@ -37,6 +38,10 @@ func NewMsgServiceRouter() *MsgServiceRouter {
|
||||
}
|
||||
}
|
||||
|
||||
func (msr *MsgServiceRouter) SetCircuit(cb CircuitBreaker) {
|
||||
msr.circuitBreaker = cb
|
||||
}
|
||||
|
||||
// MsgServiceHandler defines a function type which handles Msg service message.
|
||||
type MsgServiceHandler = func(ctx sdk.Context, req sdk.Msg) (*sdk.Result, error)
|
||||
|
||||
@@ -128,6 +133,13 @@ func (msr *MsgServiceRouter) RegisterService(sd *grpc.ServiceDesc, handler inter
|
||||
}
|
||||
}
|
||||
|
||||
if msr.circuitBreaker != nil {
|
||||
msgURL := sdk.MsgTypeURL(msg)
|
||||
if !msr.circuitBreaker.IsAllowed(ctx, msgURL) {
|
||||
return nil, fmt.Errorf("circuit breaker disables execution of this message: %s", msgURL)
|
||||
}
|
||||
}
|
||||
|
||||
// Call the method handler from the service description with the handler object.
|
||||
// We don't do any decoding here because the decoding was already done.
|
||||
res, err := methodHandler(handler, ctx, noopDecoder, interceptor)
|
||||
|
||||
Reference in New Issue
Block a user