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

CommitInfo values written to the DB are non-deterministic -- does it matter? #11589

Closed
08d2 opened this issue Apr 11, 2022 · 4 comments · Fixed by #11592
Closed

CommitInfo values written to the DB are non-deterministic -- does it matter? #11589

08d2 opened this issue Apr 11, 2022 · 4 comments · Fixed by #11592
Assignees

Comments

@08d2
Copy link
Contributor

08d2 commented Apr 11, 2022

The rootmulti.Store's Commit method sets rs.lastCommitInfo to the result of calling the commitStores function, and then later passes that value to the flushMetadata function.

The flushMetadata function calls the setCommitInfo 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?

@tac0turtle
Copy link
Member

this is a good place to start for this #6370

@yihuang
Copy link
Collaborator

yihuang commented Apr 11, 2022

I guess not, otherwise we should notice long time ago 😄
I guess the commit info is not committed into the app hash?

@alexanderbez
Copy link
Contributor

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.

@alexanderbez alexanderbez self-assigned this Apr 11, 2022
@mergify mergify bot closed this as completed in #11592 Apr 11, 2022
mergify bot pushed a commit that referenced this issue Apr 11, 2022
## 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)
@08d2
Copy link
Contributor Author

08d2 commented Apr 11, 2022

Thanks for the fast response!

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 a pull request may close this issue.

4 participants