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

Add Limit Trie Logs Early Access Feature Guide #1495

Closed
wants to merge 4 commits into from
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions docs/public-networks/how-to/bonsai-limit-trie-logs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
---
title: Limit Trie Logs for Bonsai
sidebar_position: 12
description: Enable this early access feature to reduce the size of your database
Copy link
Contributor

Choose a reason for hiding this comment

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

Enable this feature**

tags:
- public networks
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# Limit Trie Logs for Bonsai
Copy link
Contributor

Choose a reason for hiding this comment

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

Bonsai... to reduce database size.

change this for SEO

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Are you suggesting, "Limit Trie Logs to Reduce Database Size"?

Are you happy to exclude Bonsai from the title? I wanted to make it clear it was irrelevant for FOREST, but if we plan to remove FOREST soon, maybe that doesn't matter.

## Step by Step Guide

:::caution

We strongly recommend reading the rest of this documentation before running these commands because your node’s configuration may require changes to these commands.
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
We strongly recommend reading the rest of this documentation before running these commands because your node’s configuration may require changes to these commands.
Limiting trie logs is an early access feature. Before executing the commands in this guide, ensure you review your node configuration.


:::

*Targeting 24.1.2 release, but currently you must be on the Besu `main` branch for this to work*
Copy link
Contributor

Choose a reason for hiding this comment

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

I think we should wait on this page until the feature is released.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

removed this line


1. Update Besu config to add --Xbonsai-limit-trie-logs-enabled but don’t restart yet
1. Stop Besu
1. (optional) Run:
Copy link
Contributor

Choose a reason for hiding this comment

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

should we provide relative paths?

Copy link
Contributor Author

@siladu siladu Feb 1, 2024

Choose a reason for hiding this comment

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

In this example, I opted to use the most widely used paths, which fortunately are the same for ethstaker docs and the two most popular step by step guides: Somer Esats and CoinCashew.

I put a warning to not copy and paste, but if ppl still do then it should work out of the box if they followed the popular guides.

`sudo /usr/local/bin/besu/bin/besu --data-storage-format=BONSAI --data-path=/var/lib/besu --sync-mode=X_SNAP storage x-trie-log prune`
1. Start Besu (remembering to run sudo systemctl daemon-reload if you use a systemd service file as per CoinCashew and Somer)
1. Look out for `Limit trie logs enabled: retention: 512; prune window: 30000` in your Besu config printout during startup
1. Enjoy more GBs
Copy link
Contributor

Choose a reason for hiding this comment

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

enjoy more free space


## What?
Copy link
Contributor

Choose a reason for hiding this comment

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

I would move the explanation for why this feature exists early on in the doc... so maybe move this to the start

We have a new experimental feature available: `--Xbonsai-limit-trie-logs-enabled` which aims to keep Besu’s database as small as it can be. After a brief grace period, we intend to make this enabled by default for stakers. This is only relevant if you're using `data-storage-format=BONSAI`.
Copy link
Contributor

Choose a reason for hiding this comment

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

For tech docs, we typically don't write with a marketing tone and usually opt for language that is a but more succinct and to the point. I think a rewrite for this would be something like:

Suggested change
We have a new experimental feature available: `--Xbonsai-limit-trie-logs-enabled` which aims to keep Besu’s database as small as it can be. After a brief grace period, we intend to make this enabled by default for stakers. This is only relevant if you're using `data-storage-format=BONSAI`.
The feature `--Xbonsai-limit-trie-logs-enabled` minimizes the database size of Besu and requires the use of `data-storage-format=BONSAI`. When enabled, this feature can reduce database growth by more than 3 GB each week.


From our testing, we estimate this will **save users > 3 GB per week** in database growth. Early testing indicates Besu’s **overall database growth with this enabled is ~7 GB per week** (thanks Yorick!) which is on par with geth.

## Why?
Some users noticed that resyncing Besu can free up disk space, especially for longer running nodes. This is despite `--data-storage-format=BONSAI` having “implicit pruning”. More on this reddit thread: https://www.reddit.com/r/ethstaker/comments/12xnxxi/clearing_up_besubonsai_confusion_on_state_growth/
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this can be removed


In reality, whilst the Merkle Patricia Trie is implicitly pruned, the BONSAI feature did introduce an extra data structure: the Trie Log (more detail about BONSAI and trie logs here: https://consensys.io/blog/bonsai-tries-guide)
Copy link
Contributor

Choose a reason for hiding this comment

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

I am not sure this is needed in this guide

Copy link
Contributor Author

@siladu siladu Feb 1, 2024

Choose a reason for hiding this comment

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

Agree, this is better for the initial announcement blog instead

Copy link
Contributor

@joaniefromtheblock joaniefromtheblock Jan 31, 2024

Choose a reason for hiding this comment

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

Can be removed/ rewritten or added Ito an introductory section


The Trie Logs are retained in order to cope with chain reorgs. After each block is finalized, Trie Logs older than that are no longer required so it is safe to remove them from both the node's and the network's point of view.

## How?
If you want to use this feature before it is enabled by default, simply add this option to your Besu command: `--Xbonsai-limit-trie-logs-enabled`
When you restart Besu it will begin pruning, block by block (and a cheeky bit during Besu startup).
Copy link
Contributor

Choose a reason for hiding this comment

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

block by block after an initial reduction in the database.


If you want **maximum database size reduction**, read on.
Copy link
Contributor

Choose a reason for hiding this comment

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

delete


If you have a long-running node, this will not immediately clear your backlog of trie logs in the same way that resyncing does. In order to do this we’re providing a “run once” **offline** command to immediately **prune all your old trie logs in a few minutes or less**. Note, this requires Besu to be shutdown before running, but downtime will be minimal. You will **not** need to run this command a second time if you keep `--Xbonsai-limit-trie-logs-enabled`.

## I’m impatient, reduce my database size now!
Copy link
Contributor

Choose a reason for hiding this comment

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

Remove this header

Okay, okay - we got you! We built a one-off Besu command to remove this extra data (usually in seconds) and avoid having to resync. For minimal downtime, we recommend running this command **before** restarting Besu `--Xbonsai-limit-trie-logs-enabled` (easiest to do it all at the same time).
Copy link
Contributor

Choose a reason for hiding this comment

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

Remove okay we got you


If you followed Somer Esat’s (https://someresat.medium.com/guide-to-staking-on-ethereum-ubuntu-teku-f09ecd9ef2ee ) or CoinCashew’s guide (https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet/part-i-installation/step-3-installing-execution-client/besu) then you likely have these options set in your `besu.service` or `execution.service` systemd file:

```
...
ExecStart=/usr/local/bin/besu/bin/besu \
...
--sync-mode=X_SNAP \
--data-path="/var/lib/besu" \
--data-storage-format=BONSAI \
...
```
So in order to prune the trie logs, your command should be something like:

`sudo /usr/local/bin/besu/bin/besu --data-storage-format=BONSAI --data-path=/var/lib/besu --sync-mode=X_SNAP storage x-trie-log prune`



The logs should look something like this:

```
2024-01-31 05:10:43.777+00:00 | main | INFO | KeyPairUtil | Attempting to load public key from /data/besu/key
...
2024-01-31 05:10:47.574+00:00 | main | INFO | TrieLogSubCommand | Calculating trie logs size before...
2024-01-31 05:10:51.100+00:00 | main | INFO | TrieLogSubCommand | Trie logs size before: 8 GiB
2024-01-31 05:12:45.907+00:00 | main | INFO | TrieLogHelper | Saving trie logs to retain in file /data/besu/database/trieLogsToRetain-1 (batch 1)...
2024-01-31 05:12:45.916+00:00 | main | INFO | TrieLogHelper | Obtaining trielogs from db, this may take a few minutes...
2024-01-31 05:12:46.036+00:00 | main | INFO | TrieLogHelper | Clear trie logs...
2024-01-31 05:12:46.100+00:00 | main | INFO | TrieLogHelper | Restoring trie logs retained from batch 1...
2024-01-31 05:12:46.168+00:00 | main | INFO | TrieLogHelper | Key(0): 0xc0a1f26bf828ae6d9af8fda8af3126f12a6d986afea05fdc61b25d0d0ab3b8d4
...
2024-01-31 05:12:46.263+00:00 | main | INFO | TrieLogHelper | Key(511): 0x5eb700164f4190b8806c7ce3de2f6e5b4f4c05a61bba4058f1b0a5ef63ec73af
2024-01-31 05:12:46.359+00:00 | main | INFO | TrieLogHelper | Deleting files...
2024-01-31 05:12:46.363+00:00 | main | INFO | TrieLogSubCommand | Finished pruning - recalculating size...
2024-01-31 05:12:51.658+00:00 | main | INFO | TrieLogSubCommand | Trie logs size after: 0 B
Prune ran successfully. We estimate you freed up 8 GiB!
```

If you use a toml config file, then you can simply do something like:

`sudo /usr/local/bin/besu/bin/besu --config-file=besu-config.toml storage x-trie-log prune`

## Subcommand Troubleshooting
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
## Subcommand Troubleshooting
## Troubleshoot

The prune command should look something like this for mainnet users:
`sudo /usr/local/bin/besu/bin/besu --data-path=/var/lib/besu --data-storage-format=BONSAI --sync-mode=X_SNAP storage x-trie-log prune`

and Besu should be shutdown before running it.

---

> java.lang.IllegalArgumentException: Subcommand only works with data-storage-format=BONSAI

Are you missing --data-storage-format=BONSAI? It must be add before the storage subcommand, i.e.

`sudo /usr/local/bin/besu/bin/besu --data-storage-format=BONSAI --data-path=/var/lib/besu --sync-mode=X_SNAP storage x-trie-log prune`

---

java.lang.RuntimeException: Column handle not found for segment TRIE_BRANCH_STORAGE

Did you specify the `data-path`?

`sudo /usr/local/bin/besu/bin/besu --data-path=/var/lib/besu --data-storage-format=BONSAI --sync-mode=X_SNAP storage x-trie-log prune`

---

> ...
> | INFO | RocksDBKeyValueStorageFactory | No existing database detected at /tmp/besu. Using version 2
> ...
> java.lang.IllegalArgumentException: Trying to retain more trie logs than chain length (0), skipping pruning

Did you specify the correct data-path for your node?

`sudo /usr/local/bin/besu/bin/besu --data-path=/var/lib/besu --data-storage-format=BONSAI --sync-mode=X_SNAP storage x-trie-log prune`

---

> java.lang.IllegalArgumentException: Cannot store generated private key.

Did you specify the correct data-path for your node?

`sudo /usr/local/bin/besu/bin/besu --data-path=/var/lib/besu --data-storage-format=BONSAI --sync-mode=X_SNAP storage x-trie-log prune`

---

> ...
> | INFO | KeyPairUtil | Attempting to load public key from /data/besu/key
> java.lang.IllegalArgumentException: Supplied file does not contain valid keyPair pair.

Check your file permission, you made need to run the command as sudo:
`sudo /usr/local/bin/besu/bin/besu --data-storage-format=BONSAI --data-path=/var/lib/besu storage --sync-mode=X_SNAP x-trie-log prune`

---

> java.lang.RuntimeException: Column handle not found for segment WORLD_STATE

Are you using data-storage-format=FOREST instead of data-storage-format=BONSAI on an existing bonsai database?

---

> org.hyperledger.besu.plugin.services.exception.StorageException: org.rocksdb.RocksDBException: While lock file: /data/besu/database/LOCK: Resource temporarily unavailable

Is Besu already running? You need to shut the Besu client down before running this subcommand.

---

> java.lang.IllegalStateException: Unable to change the sync mode when snap sync is incomplete, please restart with snap sync mode

Have you specified the sync-mode? Default is sync-mode=FAST. Most mainnet users use X_SNAP or X_CHECKPOINT

`sudo /usr/local/bin/besu/bin/besu --sync-mode=X_SNAP --data-storage-format=BONSAI --data-path=/var/lib/besu storage x-trie-log prune`

---

> java.lang.RuntimeException: No finalized block present, can't safely run trie log prune

If your node is relatively new or recently resynced, you might not need to run this command.

---

> org.hyperledger.besu.util.InvalidConfigurationException: Supplied genesis block does not match chain data stored in /data/besu.

Are you running this command for a network other than mainnet? You need to specify the network…

`sudo /usr/local/bin/besu/bin/besu --network=holesky --sync-mode=X_SNAP --data-storage-format=BONSAI --data-path=/var/lib/besu storage x-trie-log prune`

---


## The Details
Too much detail for users but if you’re interested:

- https://github.com/hyperledger/besu/issues/5390

- https://github.com/hyperledger/besu/pull/6026
Loading