feat: blocks backup / restore
Working on top of #3946 Fixes #1827
Description (thanks @n0izn0iz )
- Adds a grpc service called Backup in the tendermint2 node that allows to stream blocks efficiently It has a single method StreamBlocks that take a start and end height. If end height is 0 it will stream to the latest height. It is disabled by default and require enabling it in the config.toml
- Adds a contribs binary named tm2backup that pulls blocks from the backup service and store them in compressed 100-blocks files. It takes a start and end height as well as supporting resuming. The tar format was chosen to bundle blocks since it's widely supported and efficient. The zstandard format was chosen for compression because it's fast, has a good compression ratio and is widely supported.
- Adds a restore subcommand to the gnoland binary that allows to replay blocks from a backup. It takes the options from the start subcommand as well as the backup directory and an optional end height. It will start at the current node height + 1.
The restore command can only restore at backupEndHeight-1 because I did not figure a way to commit block n without block n+1. I'd gladly take ideas on how to do that.
The backup is fast enough for now IMO (< 20min for test5 on my macbook) but can be optimized because it's not parallelized. The restore bottleneck seems to be the gnovm currently but I would need to profile to be sure.
How to create a backup
- Enable the backup service in your node's config.toml
[backup]
laddr = "localhost:4242"
- (Re-)Start your node
- Run the tm2backup command
cd contribs/tm2backup
tm2backup -o blocks-backup -remote http://localhost:4242
How to create a node from a backup
- Get the genesis file, for example:
wget https://example.com/genesis.json
- Run the restore command
gnoland restore --lazy --backup-dir ../contribs/tm2backup/blocks-backup
- Start your node
gnoland start
🛠 PR Checks Summary
🔴 Pending initial approval by a review team member, or review from tech-staff
Manual Checks (for Reviewers):
- [ ] IGNORE the bot requirements for this PR (force green CI check)
Read More
🤖 This bot helps streamline PR reviews by verifying automated checks and providing guidance for contributors and reviewers.
✅ Automated Checks (for Contributors):
🟢 Maintainers must be able to edit this pull request (more info) 🔴 Pending initial approval by a review team member, or review from tech-staff
☑️ Contributor Actions:
- Fix any issues flagged by automated checks.
- Follow the Contributor Checklist to ensure your PR is ready for review.
- Add new tests, or document why they are unnecessary.
- Provide clear examples/screenshots, if necessary.
- Update documentation, if required.
- Ensure no breaking changes, or include
BREAKING CHANGEnotes. - Link related issues/PRs, where applicable.
☑️ Reviewer Actions:
- Complete manual checks for the PR, including the guidelines and additional checks if applicable.
📚 Resources:
Debug
Automated Checks
Maintainers must be able to edit this pull request (more info)
If
🟢 Condition met └── 🟢 And ├── 🟢 The base branch matches this pattern: ^master$ └── 🟢 The pull request was created from a fork (head branch repo: Villaquiranm/gno)Then
🟢 Requirement satisfied └── 🟢 Maintainer can modify this pull requestPending initial approval by a review team member, or review from tech-staff
If
🟢 Condition met └── 🟢 And ├── 🟢 The base branch matches this pattern: ^master$ └── 🟢 Not (🔴 Pull request author is a member of the team: tech-staff)Then
🔴 Requirement not satisfied └── 🔴 If ├── 🔴 Condition │ └── 🔴 Or │ ├── 🔴 At least one of these user(s) reviewed the pull request: [jefft0 leohhhn n0izn0iz notJoon omarsy x1unix] (with state "APPROVED") │ ├── 🔴 At least 1 user(s) of the team tech-staff reviewed pull request │ └── 🔴 This pull request is a draft └── 🔴 Else └── 🔴 And ├── 🟢 This label is applied to pull request: review/triage-pending └── 🔴 On no pull requestManual Checks
**IGNORE** the bot requirements for this PR (force green CI check)
If
🟢 Condition met └── 🟢 On every pull requestCan be checked by
- Any user with comment edit permission
Codecov Report
:x: Patch coverage is 60.73394% with 214 lines in your changes missing coverage. Please review.
:loudspeaker: Thoughts on this report? Let us know!