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

[WIP] butterflynet reset follow-ups #5245

Closed
wants to merge 29 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
07f2b24
chore: butterflynet reset
hanabi1224 Feb 4, 2025
b79cf44
Merge branch 'main' into hm/butterflynet-reset
hanabi1224 Feb 4, 2025
d636ddc
feat: support CARv2
hanabi1224 Feb 4, 2025
80ec531
Update src/db/car/plain.rs
hanabi1224 Feb 4, 2025
4bffed8
test and changelog
hanabi1224 Feb 4, 2025
28372db
feat: add CARv2 support to CarStream
hanabi1224 Feb 5, 2025
d80ea5c
changelog
hanabi1224 Feb 5, 2025
d81e95b
lint
hanabi1224 Feb 5, 2025
86d6cb7
Merge remote-tracking branch 'origin/main' into hm/car-v2-stream
hanabi1224 Feb 5, 2025
5fa7c6c
cleanup
hanabi1224 Feb 5, 2025
8ca6c93
improve API
hanabi1224 Feb 5, 2025
e4117c4
Merge remote-tracking branch 'origin/main' into hm/car-v2-stream
hanabi1224 Feb 5, 2025
822a171
self review
hanabi1224 Feb 5, 2025
eb6c8ad
refine API
hanabi1224 Feb 5, 2025
288e5b3
Merge branch 'main' into hm/car-v2-stream
hanabi1224 Feb 5, 2025
bfe45f8
Merge branch 'main' into hm/butterflynet-reset
hanabi1224 Feb 5, 2025
9ed1aa8
Merge remote-tracking branch 'origin/hm/butterflynet-reset' into hm/b…
hanabi1224 Feb 5, 2025
44f5ac0
update teep height
hanabi1224 Feb 5, 2025
7696931
Merge branch 'hm/butterflynet-reset' of github.com:ChainSafe/forest i…
hanabi1224 Feb 5, 2025
809e1d0
update params
hanabi1224 Feb 5, 2025
5c63d7a
Merge remote-tracking branch 'origin/main' into hm/butterflynet-reset
hanabi1224 Feb 5, 2025
45b175a
Merge remote-tracking branch 'origin/hm/butterflynet-reset' into hm/b…
hanabi1224 Feb 6, 2025
3bc4cf3
upadte actor bundle
hanabi1224 Feb 6, 2025
9221c32
Merge remote-tracking branch 'origin/hm/butterflynet-reset' into hm/b…
hanabi1224 Feb 6, 2025
c3590a2
feat(cli): more healthcheck subcommands
hanabi1224 Feb 6, 2025
067bc58
Merge remote-tracking branch 'origin/hm/more-healthcheck-subcommands'…
hanabi1224 Feb 6, 2025
0cc3fc5
CI check
hanabi1224 Feb 6, 2025
679bcbe
move trap line to head
hanabi1224 Feb 6, 2025
79db2b6
test arm runner
hanabi1224 Feb 6, 2025
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
44 changes: 44 additions & 0 deletions .github/workflows/butterflynet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Butterflynet checks
concurrency:
group: "${{ github.workflow }}-${{ github.ref }}"
cancel-in-progress: "${{ github.ref != 'refs/heads/main' }}"
"on":
workflow_dispatch:
# TODO: disable for PR
pull_request:
branches:
- main
env:
CI: 1
CARGO_INCREMENTAL: 0
CACHE_TIMEOUT_MINUTES: 5
SCRIPT_TIMEOUT_MINUTES: 30
AWS_ACCESS_KEY_ID: "${{ secrets.AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
RUSTC_WRAPPER: sccache
CC: sccache clang
CXX: sccache clang++
FIL_PROOFS_PARAMETER_CACHE: /var/tmp/filecoin-proof-parameters
SHELL_IMAGE: busybox
jobs:
butterflynet-checks:
name: Butterflynet checks
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout Sources
uses: actions/checkout@v4
- name: Setup sccache
uses: mozilla-actions/[email protected]
timeout-minutes: "${{ fromJSON(env.CACHE_TIMEOUT_MINUTES) }}"
continue-on-error: true
- uses: actions/setup-go@v5
with:
go-version-file: "go.work"
- name: Build and install Forest binaries
env:
# To minimize compile times: https://nnethercote.github.io/perf-book/build-configuration.html#minimizing-compile-times
RUSTFLAGS: "-C linker=clang -C link-arg=-fuse-ld=lld"
run: make install-slim-quick
- name: Run butterflynet checks
run: ./scripts/tests/butterflynet_check.sh
timeout-minutes: "${{ fromJSON(env.SCRIPT_TIMEOUT_MINUTES) }}"
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@

- [#4954](https://github.com/ChainSafe/forest/issues/4954) Add `--format json` to `forest-cli chain head` command.

- [#5232](https://github.com/ChainSafe/forest/issues/5232) Support `CARv2` stream decoding.

- [#5230](https://github.com/ChainSafe/forest/issues/5230) Add `CARv2` support to `forest-tool archive` command.

### Changed
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ dialoguer = "0.11"
digest = "0.10"
directories = "6"
displaydoc = "0.2"
either = "1"
ethereum-types = { version = "0.15", features = ["ethbloom"] }
ez-jsonrpc-types = "0.5"
fil_actor_account_state = { version = "19" }
Expand Down
3 changes: 1 addition & 2 deletions build/bootstrap/butterflynet
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWFfuFm4eWfMR2Xk9jQ8VsxVqt9nyZXZRdi6WqNrPcg8qk
/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWEgUQub6ZS5M7hfiZPNf4kFFmgsiyYKNcdAk5oKMUcyft
/dnsaddr/bootstrap.butterfly.fildev.network
36 changes: 18 additions & 18 deletions build/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1062,69 +1062,69 @@
"network": {
"type": "butterflynet"
},
"version": "v16.0.0-dev",
"bundle_cid": "bafy2bzaced3uzaynkdi7wiqiwbje7l3lllpwbokuf7slak627gx7bk5pryjpa",
"version": "v16.0.0-dev1",
"bundle_cid": "bafy2bzaced3ucmgzcrkvaw6qgqdzl56t3rctlb7i66vrj23dacgeath7jcxne",
"manifest": {
"actors": [
[
"system",
1,
"bafk2bzacebzc4fklfws2ri4jv6mcu4xgs52ve3gqzgm476hkohfahj7s5lig2"
"bafk2bzacea5dls7jx2bhbhdkwl2c3qgyv22ldbeoc2me5z7qe5kbutf7tjeow"
],
[
"init",
2,
"bafk2bzacebccioskxaudlyoydyy4yoswgfcffpadhbu6midk3edlhuzt3osu4"
"bafk2bzaced6b6odw6vt3ak7z7idhatex6gjsxck57wkum2yud6wubhpbwtm5e"
],
[
"cron",
3,
"bafk2bzaceadysuxpaeqxwbzg7ksyl2olzizj4kgeq2b2oldlca4et55huauwo"
"bafk2bzacec7zpiconapx4veuplh5hk3iumnigsbx7yxhxfz7hirqbf2vpexqa"
],
[
"account",
4,
"bafk2bzacebyxmngiugdhhio7zn7i67jzsythgy3jqqbqyan735g2rkalufhr6"
"bafk2bzaceaw5z2sungnovruolbxdc43xbsksx7ajlr2bw7insd55nho3gfbne"
],
[
"storagepower",
5,
"bafk2bzaceauwj75apfux75zz4owkcjeggu4cp2ldn7weoxakzb5zsz55kthbe"
"bafk2bzacebnq5klygudstkq5tx6y7xusn2frygtotahiagmda3zy6rvzmyqme"
],
[
"storageminer",
6,
"bafk2bzacedz6zjhfuyexwdco7zmpkypjzllk5v2sv4kdoz4gfqdzxuyq5uz5u"
"bafk2bzaceca27d33cwxwwbhbmijt453wkc3dvrnfkrdsuznol4cq33z3oqxbk"
],
[
"storagemarket",
7,
"bafk2bzacedb6p35ax2s2muxvgir73vmdkbxn7uc5aw6n64dewb32drqils5zq"
"bafk2bzaceblznz3yqthmh2jbrknljiqu3kdfr7x7j2wn62abnszs4ziettqmm"
],
[
"paymentchannel",
8,
"bafk2bzaceaigyawy2ywyfdqjccfyi62xtn456gavqrwdilpltiqxbeo7zsjf4"
"bafk2bzacebmpquxfvdh2lmgi7huqcln3ey56run7hkrsuhi6lgcwekbozhxac"
],
[
"multisig",
9,
"bafk2bzacedcpbmiblrhh43kthgrkctrklh27jkvjcorzfreusd7fsjdw2llzq"
"bafk2bzacebius3sex65rxav4oo2qbbm6vuv5pcer3shgutqyyxy3vvcgezayg"
],
[
"reward",
10,
"bafk2bzaceagt6mvup6z3atlaftepdex6f45ncml57zsuxy5puwtzcge5vy4wm"
"bafk2bzaceagmmgu3wt7fozbp3uhd6aepdl6c2ykt7xbpbldh2lvmmvvmt56gw"
],
[
"verifiedregistry",
11,
"bafk2bzaceasoa42xnnbu2uftlfvlzhbok3q3nqetv6bxcw7vydbxbmwn53ad6"
"bafk2bzacecqbljsk5utms7pe4g3uy7zvrpwmwgop4spx6pjrpi4tjx663gkq2"
],
[
"datacap",
12,
"bafk2bzaceals5hcpbvzm24dmmoddqpr2tcpolwwey3qvjf3okzk7ihf75gngu"
"bafk2bzaceb4owttyigypvl6pguxhqwe45rgfjubgpoitqhiyzumhlwwu6buge"
],
[
"placeholder",
Expand All @@ -1134,20 +1134,20 @@
[
"evm",
14,
"bafk2bzacebxlvhz665s2kbace6nzeqy5maasqixgirzn4xhbjx42xi2hkc5gk"
"bafk2bzacebdhgopsxunxykgehkbwtj5iyyvbqygi5uuvhtm7m4vsz3vcsp5iw"
],
[
"eam",
15,
"bafk2bzacec2gt4teegjdhbpfwl6qbxjojffxgkmzhua2m2a4lks52abnjyypw"
"bafk2bzaceapofadtnyiulmdc5k3nujthqwyht67xu2pohatqjcexojm34j7ng"
],
[
"ethaccount",
16,
"bafk2bzacec627lshgjxvfzjledk2wph4u7n47got2ultaijbh4v5wdyhjpxse"
"bafk2bzacebtz62oxftksx4f6efbuh6i5wb5nvuo447uefkbz5lis4rcw7djw2"
]
],
"actor_list_cid": "bafy2bzacebls3q4yivgxner4v3sltf4mk4sxmyr7lu65nic5manmsafqu3qkm"
"actor_list_cid": "bafy2bzacednuely5c7x43ykvspowkcbzrqym7wlfvgn4ceoqakkkxhu3g5i6m"
}
},
{
Expand Down
8 changes: 8 additions & 0 deletions documentation/src/offline-forest.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ chain's archive state without syncing, and various testing scenarios.
```bash
forest-tool api serve --help
```

Sample output (may vary depending on the version):

```console
Usage: forest-tool api serve [OPTIONS] [SNAPSHOT_FILES]...

Expand Down Expand Up @@ -45,7 +47,9 @@ height: 1859736.
```bash
forest-tool api serve --chain calibnet ~/Downloads/forest_snapshot_calibnet_2024-08-08_height_1859736.forest.car.zst
```

Sample output:

```console
2024-08-12T12:29:16.624698Z INFO forest::tool::offline_server::server: Configuring Offline RPC Server
2024-08-12T12:29:16.640402Z INFO forest::tool::offline_server::server: Using chain config for calibnet
Expand All @@ -63,7 +67,9 @@ curl --silent -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":2,"method":"Filecoin.ChainHead","param":"null"}' \
"http://127.0.0.1:2345/rpc/v0" | jq
```

Sample output:

```json
{
"jsonrpc": "2.0",
Expand Down Expand Up @@ -101,7 +107,9 @@ curl --silent -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":2,"method":"Filecoin.StateGetNetworkParams","param":"null"}' \
"http://127.0.0.1:2345/rpc/v0" | jq
```

Sample output:

```json
{
"jsonrpc": "2.0",
Expand Down
28 changes: 28 additions & 0 deletions scripts/tests/butterflynet_check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/bash
set -euxo pipefail

# This script tests Forest is able to catch up the butterflynet.

source "$(dirname "$0")/harness.sh"

function shutdown {
kill -KILL $FOREST_NODE_PID
}

trap shutdown EXIT

function call_forest_chain_head {
curl --silent -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":2,"method":"Filecoin.ChainHead","param":"null"}' \
"http://127.0.0.1:2345/rpc/v1"
}

$FOREST_PATH --chain butterflynet --encrypt-keystore false &
FOREST_NODE_PID=$!

until call_forest_chain_head; do
echo "Forest RPC endpoint is unavailable - sleeping for 1s"
sleep 1
done

forest_wait_for_sync
92 changes: 62 additions & 30 deletions src/cli/subcommands/healthcheck_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,24 @@ pub enum HealthcheckCommand {
#[arg(long, default_value_t=DEFAULT_HEALTHCHECK_PORT)]
healthcheck_port: u16,
},
/// Display live status
Live {
/// Don't exit until node is ready
#[arg(long)]
wait: bool,
/// Healthcheck port
#[arg(long, default_value_t=DEFAULT_HEALTHCHECK_PORT)]
healthcheck_port: u16,
},
/// Display live status
Healthy {
/// Don't exit until node is ready
#[arg(long)]
wait: bool,
/// Healthcheck port
#[arg(long, default_value_t=DEFAULT_HEALTHCHECK_PORT)]
healthcheck_port: u16,
},
}

impl HealthcheckCommand {
Expand All @@ -31,42 +49,56 @@ impl HealthcheckCommand {
Self::Ready {
wait,
healthcheck_port,
} => {
let ticker = Ticker::new(0.., Duration::from_secs(1));
let mut stdout = stdout();
} => Self::check(&client, "readyz", healthcheck_port, wait).await,
Self::Live {
wait,
healthcheck_port,
} => Self::check(&client, "livez", healthcheck_port, wait).await,
Self::Healthy {
wait,
healthcheck_port,
} => Self::check(&client, "healthz", healthcheck_port, wait).await,
}
}

async fn check(
client: &rpc::Client,
endpoint: &str,
healthcheck_port: u16,
wait: bool,
) -> anyhow::Result<()> {
let ticker = Ticker::new(0.., Duration::from_secs(1));
let mut stdout = stdout();

let url = format!(
"http://{}:{}/readyz?verbose",
client.base_url().host_str().unwrap_or("localhost"),
healthcheck_port,
);
let url = format!(
"http://{}:{healthcheck_port}/{endpoint}?verbose",
client.base_url().host_str().unwrap_or("localhost"),
);

for _ in ticker {
let response = reqwest::get(&url).await?;
let status = response.status();
let text = response.text().await?;
for _ in ticker {
let response = reqwest::get(&url).await?;
let status = response.status();
let text = response.text().await?;

println!("{}", text);
println!("{}", text);

if !wait {
break;
}
if status == StatusCode::OK {
println!("Done!");
break;
}
if !wait {
break;
}
if status == StatusCode::OK {
println!("Done!");
break;
}

for _ in 0..(text.matches('\n').count() + 1) {
write!(
stdout,
"\r{}{}",
anes::MoveCursorUp(1),
anes::ClearLine::All,
)?;
}
}
Ok(())
for _ in 0..(text.matches('\n').count() + 1) {
write!(
stdout,
"\r{}{}",
anes::MoveCursorUp(1),
anes::ClearLine::All,
)?;
}
}
Ok(())
}
}
7 changes: 4 additions & 3 deletions src/daemon/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ use ahash::HashSet;
use anyhow::ensure;
use cid::Cid;
use futures::{stream::FuturesUnordered, TryStreamExt};
use std::io::Cursor;
use std::mem::discriminant;
use std::{io::Cursor, path::Path};
use std::path::Path;
use tokio::io::BufReader;
use tracing::{info, warn};

Expand Down Expand Up @@ -53,7 +54,7 @@ pub async fn load_actor_bundles_from_path(
.await?;

// Validate the bundle
let roots = HashSet::from_iter(car_stream.header.roots.iter());
let roots = HashSet::from_iter(car_stream.header_v1.roots.iter());
for ActorBundleInfo {
manifest, network, ..
} in ACTOR_BUNDLES.iter().filter(|bundle| {
Expand Down Expand Up @@ -109,7 +110,7 @@ pub async fn load_actor_bundles_from_server(
while let Some(block) = stream.try_next().await? {
db.put_keyed_persistent(&block.cid, &block.data)?;
}
let header = stream.header;
let header = stream.header_v1;
ensure!(header.roots.len() == 1);
ensure!(header.roots.first() == root);
Ok(*header.roots.first())
Expand Down
Loading
Loading