-
Notifications
You must be signed in to change notification settings - Fork 3.7k
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
CommitInfo values written to the DB are non-deterministic -- does it matter? #11589
Comments
this is a good place to start for this #6370 |
I guess not, otherwise we should notice long time ago 😄 |
No, these objects written to disk as part of the commit execution are not used as part of the app's merkle-ized tree. Thus, the map iteration is not important. However, I'd still argue that we should make it deterministic for brevity and testing's sake. |
## Description Closes: #11589 Ensure the `StoreInfos` are sorted when flushing commit metadata. --- ### 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](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] 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.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
Thanks for the fast response! |
The rootmulti.Store's Commit method sets
rs.lastCommitInfo
to the result of calling thecommitStores
function, and then later passes that value to theflushMetadata
function.The
flushMetadata
function calls thesetCommitInfo
function which sets a key/value pair on the provided batch, with the key being based on a height, and the value being the result of the CommitInfo's Marshal method. That Marshal method calls MarshalToSizedBuffer, which encodes each of the CommitInfo's StoreInfo values in the (reverse) order as they are defined in the slice.That slice is built by the
commitStores
function, which ranges over a map of StoreKeys to CommitKVStore interfaces, and appends the result of some computation on those values to the slice, one by one. Ranging over a map is defined to be random. That means the value of these CommitInfo keys — persisted to the DB, as part of a batch, with each call to the rootmulti.Store Commit method — are non-deterministic.I stumbled over this curiosity while trying to diagnose AppHash failures on replay. But I'm not actually sure if this non-determinism matters. Does it?
The text was updated successfully, but these errors were encountered: