Skip to content
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

refactor(runtime/v2): genesis event service bindings #22192

Merged
merged 3 commits into from
Oct 9, 2024

Conversation

kocubinski
Copy link
Member

@kocubinski kocubinski commented Oct 9, 2024

Description

Closes: #21924


Author Checklist

All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.

I have...

  • included the correct type prefix in the PR title, you can find examples of the prefixes below:
  • confirmed ! in the type prefix if API or client breaking change
  • targeted the correct branch (see PR Targeting)
  • provided a link to the relevant issue or specification
  • reviewed "Files changed" and left comments if necessary
  • included the necessary unit and integration tests
  • added a changelog entry to CHANGELOG.md
  • updated the relevant documentation or specification, including comments for documenting Go code
  • confirmed all CI checks have passed

Reviewers Checklist

All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.

Please see Pull Request Reviewer section in the contributing guide for more information on how to review a pull request.

I have...

  • confirmed the correct type prefix in the PR title
  • confirmed all author checklist items have been addressed
  • reviewed state machine logic, API design and naming, documentation is accurate, tests and test coverage

Summary by CodeRabbit

  • New Features

    • Introduced a new GenesisEventService for improved event handling during genesis initialization.
    • Added a blackHoleEventManager to suppress event emissions during genesis.
  • Enhancements

    • Updated service management for the event service to enhance performance and maintainability.

These changes aim to improve the application's event management capabilities, especially during the initialization phase, ensuring a smoother and more efficient user experience.

Copy link
Contributor

github-actions bot commented Oct 9, 2024

@kocubinski your pull request is missing a changelog!

@@ -129,14 +143,34 @@ func NewGenesisHeaderService(executionService header.Service) *GenesisHeaderServ
}
}

type readonlyKVStore struct {
store.Reader
type GenesisEventService struct {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

go doc on why it exists please


// blackHoleEventManager is an event.Manager that does nothing.
// It is used during genesis initialization, genesis events are not emitted.
type blackHoleEventManager struct{}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

great name haha.

@kocubinski kocubinski changed the base branch from alex/sims2_v2_dev to main October 9, 2024 14:20
@kocubinski kocubinski changed the title genesis service event bindings refactor(runtime): genesis service event bindings Oct 9, 2024
Copy link
Contributor

coderabbitai bot commented Oct 9, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

The pull request introduces changes to the runtime/v2/module.go and runtime/v2/services/genesis.go files, enhancing service management and event handling during genesis initialization. The DefaultServiceBindings function now creates the eventService using a new method, while the genesis.go file adds a GenesisEventService type and a blackHoleEventManager to manage event emissions more effectively during genesis. These modifications aim to improve the application’s modularity and event handling capabilities.

Changes

File Path Change Summary
runtime/v2/module.go Updated DefaultServiceBindings to instantiate eventService using services.NewGenesisEventService(stf.NewEventService()).
runtime/v2/services/genesis.go Introduced GenesisEventService type and blackHoleEventManager. Added methods for event management and updated return type of NewGenesisHeaderService to enhance interface-oriented design. New methods suppress event emissions.

Assessment against linked issues

Objective Addressed Explanation
Resolve panic on executionContext retrieval (#21924)

Possibly related PRs

  • fix(runtime/v2): bring back concurrent export genesis in v2 #21554: This PR modifies the ExportGenesis method and the ExportGenesisForModules function, which are related to the overall service management and initialization processes, similar to the changes made in the DefaultServiceBindings function in the main PR.
  • refactor(stf): remove RunWithCtx #21739: This PR introduces changes to the NewSimApp function, which includes the runtime.DefaultServiceBindings() method. This is directly related to the service management enhancements in the main PR, particularly in how services are initialized and managed.
  • feat(x/genutil): add better error messages for genesis validation #21701: Although primarily focused on error handling during genesis validation, this PR's context of improving the genesis process aligns with the overall theme of enhancing service management and initialization in the main PR.

Suggested labels

C:server/v2, C:server/v2 appmanager, C:server/v2 cometbft

Suggested reviewers

  • facundomedica
  • hieuvubk
  • testinginprod
  • akhilkumarpilli
  • julienrbrt

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@kocubinski kocubinski changed the title refactor(runtime): genesis service event bindings refactor(runtime): genesis event service bindings Oct 9, 2024
@julienrbrt julienrbrt changed the title refactor(runtime): genesis event service bindings refactor(runtime/v2): genesis event service bindings Oct 9, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (1)
runtime/v2/services/genesis.go (1)

162-168: Add GoDoc comments for exported methods

The exported methods EventManager, Emit, and EmitKV lack GoDoc comments. The Uber Go Style Guide recommends adding comments to all exported functions and methods, starting with the function name, to enhance code readability.

Consider adding comments like the following:

// EventManager returns an event.Manager for the given context.
// During genesis initialization, it returns a blackHoleEventManager.
func (g *GenesisEventService) EventManager(ctx context.Context) event.Manager { ... }

// Emit does nothing as this is a black hole event manager.
func (b *blackHoleEventManager) Emit(_ transaction.Msg) error { ... }

// EmitKV does nothing as this is a black hole event manager.
func (b *blackHoleEventManager) EmitKV(_ string, _ ...event.Attribute) error { ... }

Also applies to: 176-181

📜 Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 3220aab and 10fcb68.

📒 Files selected for processing (2)
  • runtime/v2/module.go (1 hunks)
  • runtime/v2/services/genesis.go (3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
runtime/v2/module.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

runtime/v2/services/genesis.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

🔇 Additional comments (1)
runtime/v2/module.go (1)

246-246: LGTM! Verify impact on genesis process.

The change to wrap stf.NewEventService() with services.NewGenesisEventService() looks good. This modification aligns with the PR objectives and may help address the issues related to genesis service event bindings.

To ensure this change resolves the panic error mentioned in issue #21924, please run the following verification steps:

These tests will help ensure that the new GenesisEventService is properly implemented and used throughout the codebase, potentially preventing the panic error during node startup from a state dump.

✅ Verification successful

Verified!

All checks pass, and the wrapping of stf.NewEventService() with services.NewGenesisEventService() is correctly implemented without introducing new issues.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the impact of the new GenesisEventService on the genesis process

# Test 1: Check for any remaining direct usage of stf.NewEventService()
echo "Checking for any remaining direct usage of stf.NewEventService():"
rg --type go "stf\.NewEventService\(\)"

# Test 2: Verify the implementation of NewGenesisEventService
echo "Checking the implementation of NewGenesisEventService:"
rg --type go -A 10 "func NewGenesisEventService"

# Test 3: Look for any potential issues or TODOs in the GenesisEventService implementation
echo "Checking for potential issues or TODOs in GenesisEventService:"
rg --type go -i "todo|fixme|xxx" -g "*genesis*event*.go"

Length of output: 1474


Script:

#!/bin/bash
# Description: Re-verify potential issues or TODOs in GenesisEventService with corrected file pattern

# Test 3: Look for any potential issues or TODOs in the GenesisEventService implementation
echo "Re-checking for potential issues or TODOs in GenesisEventService:"
rg --type go -i "todo|fixme|xxx" -g "*genesis.go"

Length of output: 672

runtime/v2/services/genesis.go Outdated Show resolved Hide resolved
runtime/v2/services/genesis.go Fixed Show fixed Hide fixed
runtime/v2/services/genesis.go Fixed Show fixed Hide fixed
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (4)
runtime/v2/services/genesis.go (3)

147-160: LGTM: Well-structured new GenesisEventService

The new GenesisEventService struct and NewGenesisEventService function are well-implemented and follow Go conventions. The purpose is clear from the comments, and the function correctly returns an event.Service interface.

Consider adding a brief comment to the executionService field in the GenesisEventService struct to explain its purpose, similar to other structs in this file.


171-182: LGTM: Correct implementation of blackHoleEventManager

The blackHoleEventManager and its methods Emit and EmitKV are correctly implemented as no-op versions of the event.Manager interface. This is appropriate for discarding events during genesis initialization.

Consider renaming blackHoleEventManager to something more conventional, such as noopEventManager or discardEventManager, to align with common Go naming practices while still conveying its purpose.


147-151: Add Go doc comment for GenesisEventService

To address the previous review comment and improve documentation, consider adding a proper Go doc comment for the GenesisEventService struct. This will provide better documentation that can be picked up by Go tools. For example:

// GenesisEventService is an event.Service implementation used during
// genesis initialization. It wraps an inner execution context event.Service
// and returns a blackHoleEventManager into which events enter and disappear
// completely during genesis initialization.
type GenesisEventService struct {
    executionService event.Service
}
runtime/v2/module.go (1)

244-246: LGTM! Consider applying consistent wrapping to other services.

The change to eventService initialization looks good. It wraps the stf.NewEventService() with services.NewGenesisEventService(), which aligns with the PR objectives of refactoring the genesis event service bindings.

For consistency, you might want to consider applying similar wrapping to headerService and potentially cometService if they also require genesis-specific functionality. This would make the initialization pattern uniform across all services.

📜 Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 10fcb68 and 149b0a7.

📒 Files selected for processing (2)
  • runtime/v2/module.go (1 hunks)
  • runtime/v2/services/genesis.go (3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
runtime/v2/module.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

runtime/v2/services/genesis.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

🔇 Additional comments (4)
runtime/v2/services/genesis.go (4)

5-5: LGTM: New imports added correctly

The new imports for "errors" and "cosmossdk.io/core/transaction" are correctly added and align with the new functionality introduced in the file.

Also applies to: 11-11


115-121: LGTM: Improved error handling in Set and Delete methods

The changes to the Set and Delete methods are good. Returning errors instead of panicking is a better practice, allowing callers to handle the errors gracefully. The error messages are clear and descriptive.


141-144: LGTM: Improved function signature

The change in the return type from *GenesisHeaderService to header.Service is a good improvement. It promotes loose coupling and aligns with Go's interface-based design principles. This change will make the code more flexible and easier to test.


163-169: LGTM: Well-implemented EventManager method

The EventManager method is correctly implemented. It appropriately checks for the genesis context and returns the correct event manager based on the context. The logic is consistent with other similar methods in the file, maintaining a coherent design.

Comment on lines +111 to +113
type readonlyKVStore struct {
store.Reader
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider using an explicit field instead of embedding the interface

Embedding the store.Reader interface directly in the readonlyKVStore struct can lead to unintended method implementations. It's generally better to use an explicit field for better control and clarity.

Consider modifying the struct as follows:

type readonlyKVStore struct {
    reader store.Reader
}

This change would require updating the methods to use r.reader instead of directly calling the methods.

@kocubinski kocubinski added this pull request to the merge queue Oct 9, 2024
Merged via the queue into main with commit c39ec6f Oct 9, 2024
75 of 76 checks passed
@kocubinski kocubinski deleted the kocu/sims2_v2_dev branch October 9, 2024 22:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Bug]: panic: failed to get executionContext from context
9 participants