-
Notifications
You must be signed in to change notification settings - Fork 3.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(server): Allow calling back into the application struct in PostSetup. #24047
base: release/v0.53.x
Are you sure you want to change the base?
Changes from all commits
47e784a
375c1e6
c8c58b2
6f78448
7002267
77fc558
5a9b596
3b2a061
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,7 +21,7 @@ const FlagAppDBBackend = "app-db-backend" | |
|
||
// Cmd prunes the sdk root multi store history versions based on the pruning options | ||
// specified by command flags. | ||
func Cmd(appCreator servertypes.AppCreator, defaultNodeHome string) *cobra.Command { | ||
func Cmd[T servertypes.Application](appCreator servertypes.AppCreator[T], defaultNodeHome string) *cobra.Command { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like the only diff in this PR is the generics. If that is the case, then we can just close There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean the purpose of this pr is to allow calling back into the application struct in PostSetup. If that something we don't want to support in the future for berachain then we can close this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the PR extends the StartCmdOptions struct here: https://github.com/cosmos/cosmos-sdk/pull/24047/files#diff-97289af2ab66016f168df6fccac70626d125f170e5cf0841fcdc8fa624999608R112-R124 the generics help with type safety i believe - so you cannot pass in an AppCreator for a different type than your application. |
||
cmd := &cobra.Command{ | ||
Use: "prune [pruning-method]", | ||
Short: "Prune app history states by keeping the recent heights and deleting old heights", | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -109,30 +109,30 @@ const ( | |
) | ||
|
||
// StartCmdOptions defines options that can be customized in `StartCmdWithOptions`, | ||
type StartCmdOptions struct { | ||
type StartCmdOptions[T types.Application] struct { | ||
// DBOpener can be used to customize db opening, for example customize db options or support different db backends, | ||
// default to the builtin db opener. | ||
DBOpener func(rootDir string, backendType dbm.BackendType) (dbm.DB, error) | ||
// PostSetup can be used to setup extra services under the same cancellable context, | ||
// it's not called in stand-alone mode, only for in-process mode. | ||
PostSetup func(svrCtx *Context, clientCtx client.Context, ctx context.Context, g *errgroup.Group) error | ||
PostSetup func(app T, svrCtx *Context, clientCtx client.Context, ctx context.Context, g *errgroup.Group) error | ||
// PostSetupStandalone can be used to setup extra services under the same cancellable context, | ||
PostSetupStandalone func(svrCtx *Context, clientCtx client.Context, ctx context.Context, g *errgroup.Group) error | ||
PostSetupStandalone func(app T, svrCtx *Context, clientCtx client.Context, ctx context.Context, g *errgroup.Group) error | ||
// AddFlags add custom flags to start cmd | ||
AddFlags func(cmd *cobra.Command) | ||
// StartCommandHanlder can be used to customize the start command handler | ||
StartCommandHandler func(svrCtx *Context, clientCtx client.Context, appCreator types.AppCreator, inProcessConsensus bool, opts StartCmdOptions) error | ||
StartCommandHandler func(svrCtx *Context, clientCtx client.Context, appCreator types.AppCreator[T], inProcessConsensus bool, opts StartCmdOptions[T]) error | ||
Comment on lines
+118
to
+124
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you explain what the benefit is for app devs with this? i saw you mentioned berachain, but curious what they/others use it for. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Beside allowing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure 🤔 also I can't tag him |
||
} | ||
|
||
// StartCmd runs the service passed in, either stand-alone or in-process with | ||
// CometBFT. | ||
func StartCmd(appCreator types.AppCreator, defaultNodeHome string) *cobra.Command { | ||
return StartCmdWithOptions(appCreator, defaultNodeHome, StartCmdOptions{}) | ||
func StartCmd[T types.Application](appCreator types.AppCreator[T], defaultNodeHome string) *cobra.Command { | ||
return StartCmdWithOptions(appCreator, defaultNodeHome, StartCmdOptions[T]{}) | ||
} | ||
|
||
// StartCmdWithOptions runs the service passed in, either stand-alone or in-process with | ||
// CometBFT. | ||
func StartCmdWithOptions(appCreator types.AppCreator, defaultNodeHome string, opts StartCmdOptions) *cobra.Command { | ||
func StartCmdWithOptions[T types.Application](appCreator types.AppCreator[T], defaultNodeHome string, opts StartCmdOptions[T]) *cobra.Command { | ||
if opts.DBOpener == nil { | ||
opts.DBOpener = openDB | ||
} | ||
|
@@ -210,7 +210,7 @@ is performed. Note, when enabled, gRPC will also be automatically enabled. | |
return cmd | ||
} | ||
|
||
func start(svrCtx *Context, clientCtx client.Context, appCreator types.AppCreator, withCmt bool, opts StartCmdOptions) error { | ||
func start[T types.Application](svrCtx *Context, clientCtx client.Context, appCreator types.AppCreator[T], withCmt bool, opts StartCmdOptions[T]) error { | ||
svrCfg, err := getAndValidateConfig(svrCtx) | ||
if err != nil { | ||
return err | ||
|
@@ -235,7 +235,7 @@ func start(svrCtx *Context, clientCtx client.Context, appCreator types.AppCreato | |
return startInProcess(svrCtx, svrCfg, clientCtx, app, metrics, opts) | ||
} | ||
|
||
func startStandAlone(svrCtx *Context, svrCfg serverconfig.Config, clientCtx client.Context, app types.Application, metrics *telemetry.Metrics, opts StartCmdOptions) error { | ||
func startStandAlone[T types.Application](svrCtx *Context, svrCfg serverconfig.Config, clientCtx client.Context, app T, metrics *telemetry.Metrics, opts StartCmdOptions[T]) error { | ||
addr := svrCtx.Viper.GetString(flagAddress) | ||
transport := svrCtx.Viper.GetString(flagTransport) | ||
|
||
|
@@ -280,7 +280,7 @@ func startStandAlone(svrCtx *Context, svrCfg serverconfig.Config, clientCtx clie | |
} | ||
|
||
if opts.PostSetupStandalone != nil { | ||
if err := opts.PostSetupStandalone(svrCtx, clientCtx, ctx, g); err != nil { | ||
if err := opts.PostSetupStandalone(app, svrCtx, clientCtx, ctx, g); err != nil { | ||
return err | ||
} | ||
} | ||
|
@@ -301,8 +301,8 @@ func startStandAlone(svrCtx *Context, svrCfg serverconfig.Config, clientCtx clie | |
return g.Wait() | ||
} | ||
|
||
func startInProcess(svrCtx *Context, svrCfg serverconfig.Config, clientCtx client.Context, app types.Application, | ||
metrics *telemetry.Metrics, opts StartCmdOptions, | ||
func startInProcess[T types.Application](svrCtx *Context, svrCfg serverconfig.Config, clientCtx client.Context, app T, | ||
metrics *telemetry.Metrics, opts StartCmdOptions[T], | ||
) error { | ||
cmtCfg := svrCtx.Config | ||
gRPCOnly := svrCtx.Viper.GetBool(flagGRPCOnly) | ||
|
@@ -346,7 +346,7 @@ func startInProcess(svrCtx *Context, svrCfg serverconfig.Config, clientCtx clien | |
} | ||
|
||
if opts.PostSetup != nil { | ||
if err := opts.PostSetup(svrCtx, clientCtx, ctx, g); err != nil { | ||
if err := opts.PostSetup(app, svrCtx, clientCtx, ctx, g); err != nil { | ||
return err | ||
} | ||
} | ||
|
@@ -592,7 +592,7 @@ func getCtx(svrCtx *Context, block bool) (*errgroup.Group, context.Context) { | |
return g, ctx | ||
} | ||
|
||
func startApp(svrCtx *Context, appCreator types.AppCreator, opts StartCmdOptions) (app types.Application, cleanupFn func(), err error) { | ||
func startApp[T types.Application](svrCtx *Context, appCreator types.AppCreator[T], opts StartCmdOptions[T]) (app T, cleanupFn func(), err error) { | ||
traceWriter, traceCleanupFn, err := setupTraceWriter(svrCtx) | ||
if err != nil { | ||
return app, traceCleanupFn, err | ||
|
@@ -605,10 +605,12 @@ func startApp(svrCtx *Context, appCreator types.AppCreator, opts StartCmdOptions | |
} | ||
|
||
if isTestnet, ok := svrCtx.Viper.Get(KeyIsTestnet).(bool); ok && isTestnet { | ||
app, err = testnetify(svrCtx, appCreator, db, traceWriter) | ||
var appPtr *T | ||
appPtr, err = testnetify(svrCtx, appCreator, db, traceWriter) | ||
if err != nil { | ||
return app, traceCleanupFn, err | ||
} | ||
app = *appPtr | ||
} else { | ||
app = appCreator(svrCtx.Logger, db, traceWriter, svrCtx.Viper) | ||
} | ||
|
@@ -625,8 +627,8 @@ func startApp(svrCtx *Context, appCreator types.AppCreator, opts StartCmdOptions | |
// InPlaceTestnetCreator utilizes the provided chainID and operatorAddress as well as the local private validator key to | ||
// control the network represented in the data folder. This is useful to create testnets nearly identical to your | ||
// mainnet environment. | ||
func InPlaceTestnetCreator(testnetAppCreator types.AppCreator) *cobra.Command { | ||
opts := StartCmdOptions{} | ||
func InPlaceTestnetCreator[T types.Application](testnetAppCreator types.AppCreator[T]) *cobra.Command { | ||
opts := StartCmdOptions[T]{} | ||
if opts.DBOpener == nil { | ||
opts.DBOpener = openDB | ||
} | ||
|
@@ -722,7 +724,7 @@ you want to test the upgrade handler itself. | |
|
||
// testnetify modifies both state and blockStore, allowing the provided operator address and local validator key to control the network | ||
// that the state in the data folder represents. The chainID of the local genesis file is modified to match the provided chainID. | ||
func testnetify(ctx *Context, testnetAppCreator types.AppCreator, db dbm.DB, traceWriter io.WriteCloser) (types.Application, error) { | ||
func testnetify[T types.Application](ctx *Context, testnetAppCreator types.AppCreator[T], db dbm.DB, traceWriter io.WriteCloser) (*T, error) { | ||
config := ctx.Config | ||
|
||
newChainID, ok := ctx.Viper.Get(KeyNewChainID).(string) | ||
|
@@ -952,11 +954,11 @@ func testnetify(ctx *Context, testnetAppCreator types.AppCreator, db dbm.DB, tra | |
return nil, err | ||
} | ||
|
||
return testnetApp, err | ||
return &testnetApp, err | ||
} | ||
|
||
// addStartNodeFlags should be added to any CLI commands that start the network. | ||
func addStartNodeFlags(cmd *cobra.Command, opts StartCmdOptions) { | ||
func addStartNodeFlags[T types.Application](cmd *cobra.Command, opts StartCmdOptions[T]) { | ||
cmd.Flags().Bool(flagWithComet, true, "Run abci app embedded in-process with CometBFT") | ||
cmd.Flags().String(flagAddress, "tcp://127.0.0.1:26658", "Listen address") | ||
cmd.Flags().String(flagTransport, "socket", "Transport protocol: socket, grpc") | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hoangdv2429 we do not need these uses of generics in here. Can we remove?