-
Notifications
You must be signed in to change notification settings - Fork 3.6k
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(stf): port stf's simappv2 changes. #20611
Conversation
@testinginprod your pull request is missing a changelog! |
WalkthroughThe recent changes enhance the recursive state change collection for actors in the Changes
Sequence Diagram(s)State Change Collection Flow (New)sequenceDiagram
participant Client
participant WriterMap
participant Store
Client ->> WriterMap: GetStateChanges()
WriterMap ->> WriterMap: recurseStateChanges()
WriterMap -->> Store: Collect State Changes
Store -->> WriterMap: Return State Changes
WriterMap -->> Client: Return All State Changes
Error Handling (core_router_service.go)sequenceDiagram
participant Client
participant CoreRouterService
participant Handler
Client ->> CoreRouterService: InvokeTyped()
CoreRouterService ->> Handler: Lazy Initialize or Use Existing
Handler -->> CoreRouterService: Return Result
CoreRouterService -->> Client: Return Result/Error
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? TipsChatThere are 3 ways to chat with CodeRabbit:
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 as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
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.
Actionable comments posted: 3
Review details
Configuration used: .coderabbit.yml
Review profile: CHILL
Files selected for processing (3)
- server/v2/stf/branch/writer_map.go (1 hunks)
- server/v2/stf/core_router_service.go (3 hunks)
- server/v2/stf/stf.go (6 hunks)
Files not summarized due to errors (1)
- server/v2/stf/stf.go: Error: Server error. Please try again later.
Additional context used
Path-based instructions (3)
server/v2/stf/branch/writer_map.go (1)
Pattern
**/*.go
: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.server/v2/stf/core_router_service.go (1)
Pattern
**/*.go
: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.server/v2/stf/stf.go (1)
Pattern
**/*.go
: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.
GitHub Check: CodeQL
server/v2/stf/core_router_service.go
[notice] 7-7: Sensitive package import
Certain system packages contain functions which may be a possible source of non-determinism
Additional comments not posted (2)
server/v2/stf/branch/writer_map.go (2)
80-95
: The implementation of recursive state collection inrecurseStateChanges
is correct and efficient.
96-96
: TheapplyStateChange
method is correctly implemented and handles errors appropriately.
server/v2/stf/branch/writer_map.go
Outdated
// GetStateChanges returns the state changes for all actors in the WriterMap, including all direct | ||
// ancesotors from which this WriterMap was derived. | ||
// See WriterMap.recurseStateChanges for more details. | ||
// Subject to possible renaming to ensure a developer can retrieve only changes in *this* branch | ||
// context (not ancestors) if that is desired. | ||
// see: https://github.com/cosmos/cosmos-sdk/pull/20412#discussion_r1618771230 | ||
func (b WriterMap) GetStateChanges() ([]store.StateChanges, error) { | ||
sc := make([]store.StateChanges, len(b.branchedWriterState)) | ||
for account, stateChange := range b.branchedWriterState { | ||
kvChanges, err := stateChange.ChangeSets() | ||
if err != nil { | ||
return nil, err | ||
} | ||
var ( | ||
changes = make(map[string][]store.KVPair) | ||
sc []store.StateChanges | ||
) | ||
if err := b.recurseStateChanges(changes); err != nil { | ||
return nil, err | ||
} | ||
|
||
for account, kvPairs := range changes { |
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.
Consider renaming GetStateChanges
to reflect its recursive functionality more clearly.
The current name might imply it only retrieves direct changes. A name like GetAllStateChanges
or GetRecursiveStateChanges
could be more descriptive.
server/v2/stf/core_router_service.go
Outdated
// TODO lazy initialization is ugly and not thread safe. we don't want to check a mutex on every InvokeTyped either. | ||
if m.handler == nil { | ||
var err error | ||
m.handler, err = m.builder.Build() | ||
if err != nil { | ||
return fmt.Errorf("cannot create queryRouter: %w", err) | ||
} | ||
} | ||
// reflection is required, see https://github.com/cosmos/cosmos-sdk/pull/20349 | ||
res, err := m.handler(ctx, req) | ||
if err != nil { | ||
return err | ||
} | ||
reflect.Indirect(reflect.ValueOf(resp)).Set(reflect.Indirect(reflect.ValueOf(res))) | ||
return nil |
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.
Ensure thread safety in lazy initialization of handler
.
The current implementation of lazy initialization in InvokeTyped
is not thread-safe. Consider using synchronization mechanisms like mutexes to avoid potential race conditions.
+ var mutex sync.Mutex
+ mutex.Lock()
+ defer mutex.Unlock()
Additionally, reflect on the necessity and risks of using reflection for setting response values.
Committable suggestion was skipped due to low confidence.
server/v2/stf/stf.go
Outdated
const headerInfoPrefix = 0x37 | ||
|
||
// setHeaderInfo sets the header info in the state to be used by queries in the future. | ||
func (s STF[T]) setHeaderInfo(state store.WriterMap, headerInfo header.Info) error { | ||
runtimeStore, err := state.GetWriter(appmanager.RuntimeIdentity) | ||
// TODO storing header info is too low level here, stf should be stateless. | ||
// We should have a keeper that does this. | ||
runtimeStore, err := state.GetWriter(Identity) |
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.
Consider refactoring the header information management.
The current implementation of setHeaderInfo
within the STF
struct is noted as potentially too low-level. Consider creating a dedicated keeper or manager for header information to encapsulate this functionality more appropriately.
server/v2/stf/core_router_service.go
Outdated
@@ -100,8 +95,21 @@ func (m *queryRouterService) InvokeTyped( | |||
ctx context.Context, | |||
req, resp protoiface.MessageV1, | |||
) error { | |||
// see https://github.com/cosmos/cosmos-sdk/pull/20349 | |||
panic("not implemented") | |||
// TODO lazy initialization is ugly and not thread safe. we don't want to check a mutex on every InvokeTyped either. |
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.
can we solve this todo before the merge?
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.
gentle ping on this
server/v2/stf/stf.go
Outdated
runtimeStore, err := state.GetWriter(appmanager.RuntimeIdentity) | ||
// TODO storing header info is too low level here, stf should be stateless. | ||
// We should have a keeper that does this. | ||
runtimeStore, err := state.GetWriter(Identity) |
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.
From local testing, this will break as-is with
failed to start servers: error during handshake: error on replay: unable to commit the changeset: failed to write batch to SC store: store key stf not found in multiTrees
consider cherry picking fb32eaf to fix
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.
Actionable comments posted: 0
Review details
Configuration used: .coderabbit.yml
Review profile: CHILL
Files selected for processing (1)
- runtime/v2/module.go (1 hunks)
Additional context used
Path-based instructions (1)
runtime/v2/module.go (1)
Pattern
**/*.go
: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.
Additional comments not posted (3)
runtime/v2/module.go (3)
167-167
: Consider pre-allocating space forStoreKeys
if the size is known beforehand to optimize memory usage.
[REFACTOR_SUGGESTion]// If the length of storeKeys is known, pre-allocate memory to improve performance: inputs.AppBuilder.storeOptions.StoreKeys = make([]string, 0, len(inputs.AppBuilder.app.storeKeys)+1) inputs.AppBuilder.storeOptions.StoreKeys = append(inputs.AppBuilder.storeOptions.StoreKeys, inputs.AppBuilder.app.storeKeys...) inputs.AppBuilder.storeOptions.StoreKeys = append(inputs.AppBuilder.storeOptions.StoreKeys, "stf")
Line range hint
1-167
: The overall file structure and organization are well-designed, adhering to Go's best practices for modularity and readability.
167-167
: Ensure that the new "stf" key does not conflict with existing store keys.Verification successful
The verification confirms that the "stf" key does not conflict with any existing store keys.
runtime/v2/module.go
:inputs.AppBuilder.storeOptions.StoreKeys
only contains the "stf" key addition.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify that the "stf" key is unique across all store keys. # Test: Search for the "stf" key in the store keys. Expect: No occurrences other than the one added. rg --type go $'StoreKeys.*"stf"'Length of output: 155
if inputs.StoreOptions != nil { | ||
inputs.AppBuilder.storeOptions = inputs.StoreOptions | ||
inputs.AppBuilder.storeOptions.StoreKeys = inputs.AppBuilder.app.storeKeys | ||
inputs.AppBuilder.storeOptions.StoreKeys = append(inputs.AppBuilder.storeOptions.StoreKeys, "stf") |
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.
we should open an issue on this. This is pretty hacky .
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.
This is cherry-picked from here: #20611 (comment)
It related to the discussion we had last Thursday about IAVL being unable to set state without knowing all the actors before hand.
}) | ||
} | ||
return sc, nil | ||
} | ||
|
||
func (b WriterMap) recurseStateChanges(changes map[string][]store.KVPair) error { |
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.
godoc
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.
Actionable comments posted: 0
Review details
Configuration used: .coderabbit.yml
Review profile: CHILL
Files selected for processing (1)
- server/v2/stf/branch/writer_map.go (1 hunks)
Files skipped from review as they are similar to previous changes (1)
- server/v2/stf/branch/writer_map.go
Description
This PR ports stf's changes from #20412
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...
!
in the type prefix if API or client breaking changeCHANGELOG.md
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...
Summary by CodeRabbit
New Features
Improvements