aptos-core
aptos-core copied to clipboard
[Compiler V2] Control flow graph simplification
Description
Implements a stackless bytecode pipeline control_flow_simplifier which simplifies the control flow graph in the following ways:
-
Eliminates branch or jump to jump: Any empty block
L1: goto L2 where L1 != L2is removed, and any block jumping to L1 will jump to L2 directly
goto L1 => (the => here means the instruction above will be replaced by the instruction below) goto L2if ... goto L1 else ... => if ... goto L2 else ...if ... goto ... else L1 => if ... goto ... else L2 -
Removes edges where the source has only one successor and the target has only one predecessor: If there is block
BB1: xx goto L2and block
BB2: L2 yywhich has only one predecessor BB1. Then we move BB2 to the end of BB1 so that BB1 becomes
BB1: xx yyand BB2 is removed.
-
Removes all jumps to the next instruction: Whenever we have
goto L; L;replace it by simply
L; -
Replaces branch to same target by jump: Whenever we have
if ... goto L else goto Lreplace it by simply
goto L
Structure of the code
The module control_flow_graph_simplifier.rs includes a
/// Control flow graph that owns the code for transformation
///
/// To do a control flow graph based transformation:
/// 1. construct a `ControlFlowGraphCodeGenerator` from the code,
/// 2. perform the transformation on the `ControlFlowGraphCodeGenerator`
/// 3. generate the code back from the `ControlFlowGraphCodeGenerator`
struct ControlFlowGraphCodeGenerator
and two such CFG based transformations
/// Transformation state for transformation 1 in the module doc
struct EmptyBlockRemover(ControlFlowGraphCodeGenerator);
/// Transformation state for transformation 2 in the module doc
struct RedundantJumpRemover(pub ControlFlowGraphCodeGenerator);
Transformation 3 is implicitly done when converting code to and from ControlFlowGraphCodeGenerator.
A top-level bytecode pipeline does all the transformation (including transformation 4)
/// Simplifies the control flow graph as described in the module doc
pub struct ControlFlowGraphSimplifier {}
Simple experiment
I printed the length of the code before and after the transformation during transactional tests, showing that before the transformation there were 37507 stackless bytecode processed and 32176 after, i.e., reducing the size of the code by 14.21%. The rate is 13.77% if we only enable empty block remover.
Type of Change
- [x] New feature
- [ ] Bug fix
- [ ] Breaking change
- [x] Performance improvement
- [ ] Refactoring
- [ ] Dependency update
- [ ] Documentation update
- [ ] Tests
Which Components or Systems Does This Change Impact?
- [ ] Validator Node
- [ ] Full Node (API, Indexer, etc.)
- [x] Move/Aptos Virtual Machine
- [ ] Aptos Framework
- [ ] Aptos CLI/SDK
- [ ] Developer Infrastructure
- [ ] Other (specify)
Test Plan
Passed all existing unit & transactional tests.
⏱️ 10h 52m total CI duration on this PR
| Job | Cumulative Duration | Recent Runs |
|---|---|---|
| rust-unit-tests | 2h 37m | ⬜ 🟩 🟩 🟩 🟥 (+1 more) |
| rust-move-unit-coverage | 2h 18m | ⬜ 🟩 🟩 🟩 🟩 (+1 more) |
| windows-build | 2h 8m | 🟩 🟩 🟩 🟩 🟩 (+1 more) |
| rust-move-tests | 1h 18m | 🟥 🟩 |
| run-tests-main-branch | 45m | 🟩 🟩 🟩 🟥 🟥 (+6 more) |
| rust-lints | 39m | ⬜ 🟩 🟩 🟩 🟩 (+1 more) |
| check | 29m | 🟥 🟥 🟥 🟩 🟥 (+3 more) |
| general-lints | 16m | 🟩 🟩 🟩 🟩 🟩 (+1 more) |
| check-dynamic-deps | 13m | 🟩 🟩 🟩 🟩 🟩 (+1 more) |
| semgrep/ci | 3m | 🟩 🟩 🟩 🟩 🟩 (+1 more) |
| file_change_determinator | 2m | 🟩 🟩 🟩 🟩 🟩 (+6 more) |
| file_change_determinator | 1m | 🟩 🟩 🟩 🟩 🟩 (+1 more) |
| permission-check | 43s | 🟩 🟩 🟩 🟩 🟩 (+7 more) |
| permission-check | 42s | 🟩 🟩 🟩 🟩 🟩 (+7 more) |
| permission-check | 40s | 🟩 🟩 🟩 🟩 🟩 (+7 more) |
| permission-check | 33s | 🟩 🟩 🟩 🟩 🟩 (+7 more) |
🚨 2 jobs on the last run were significantly faster/slower than expected
| Job | Duration | vs 7d avg | Delta |
|---|---|---|---|
| windows-build | 31m | 19m | |
| rust-lints | 10m | 8m |
Codecov Report
Attention: Patch coverage is 99.10913% with 4 lines in your changes missing coverage. Please review.
Project coverage is 59.6%. Comparing base (
362b812) to head (43092f3). Report is 16 commits behind head on main.
| Files | Patch % | Lines |
|---|---|---|
| ...r-v2/src/pipeline/control_flow_graph_simplifier.rs | 99.4% | 2 Missing :warning: |
| ...model/bytecode/src/stackless_control_flow_graph.rs | 96.0% | 2 Missing :warning: |
Additional details and impacted files
@@ Coverage Diff @@
## main #11725 +/- ##
=========================================
+ Coverage 59.4% 59.6% +0.2%
=========================================
Files 838 839 +1
Lines 204392 205492 +1100
=========================================
+ Hits 121562 122659 +1097
- Misses 82830 82833 +3
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
Can we add a small test case or 2 showing critical edges and what happens with them? Some of the break/continue loop tests probably should show critical edges.
@fEst1ck Your PR description currently says (for "removes edges where the source has only one successor and the target has only one predecessor"):
BB1: ...
goto L2
...
BB2: L2 (no other goto L2)
...
=>
BB1: BB1 content
BB2 content
goto L2
This would be an incorrect transformation: the goto L2 at the end of transformed code is not needed. Is the following what you intended to convey, perhaps?
BB1: xx
goto L2
yy
BB2: L2 (no other goto L2)
zz
=>
BB1: xx
zz
edit: even this transformation is not always correct, eg, if yy contains a label L3 and there is a goto L3 somewhere.
@fEst1ck the PR description currently says, for "removes all jumps to the next instruction":
goto L; L removed
Perhaps you meant:
goto L; L => L? That is, only goto L is removed, not the label?
@vineethk The documentation is wrong. It should be
Removes edges where the source has only one successor and the target has only one predecessor
BB1: xx
goto L2
// BB1 BB2 don't have to be consecutive in the code
BB2: L2 (no other goto L2)
yy
=>
BB1: xx
yy
Removes all jumps to the next instruction": goto L; L removed
Perhaps you meant: goto L; L => L? That is, only goto L is removed, not the label?
Yes.
Can we add a small test case or 2 showing critical edges and what happens with them? Some of the break/continue loop tests probably should show critical edges.
The bytecode generator seems to be generating extra empty blocks already. For instance, if we have
while (...) {
if (...) { break; }
}
Consider the false branch of the branch instruction of the loop condition. The incoming block ends with loop condition branch, so has 2 successors; the outgoing block, which is the end of the while loop, also has 2 predecessors, one the false branch of the loop condition, another from the break. So this should be a critical edge.
I checked the generated CFG, the break doesn't goto the end of of the loop, but goto an extra empty block before jumping to the end of the loop.
But just for testing the critical edge processor, I can clear the empty blocks first, which will create lots of critical edges. I've add a todo for this. @brmataptos
@vineethk The documentation is wrong. It should be
Removes edges where the source has only one successor and the target has only one predecessor
BB1: xx goto L2 // BB1 BB2 don't have to be consecutive in the code BB2: L2 (no other goto L2) yy => BB1: xx yy
I think this specification is incomplete and therefore incorrect. For example, there may be code just before BB2: L2 that falls through to L2 in the original code (but there is no explicit goto L2, so it satisfies the conditions for the transformation). But this behavior is not retained in the transformed code.
I set the PR to draft temporarily since I'm adding more documentation, which facilitates code review.
Please mark this PR as non-draft if you consider it ready for general review.
All comments addressed. PTAL @vineethk @brmataptos
@brmataptos @wrwg @vineethk The PR has been refactored and ready for review now.
All comments addressed. PTAL @brmataptos @rahxephon89
This issue is stale because it has been open 45 days with no activity. Remove the stale label, comment or push a commit - otherwise this will be closed in 15 days.
Thanks for the comments. All addressed. PTAL! @vineethk
@vineethk All comments addressed. PTAL
Forge is running suite realistic_env_max_load on da68844d2fcb3805fcfdbba0cb157dd3c2f97923
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite framework_upgrade on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> da68844d2fcb3805fcfdbba0cb157dd3c2f97923
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:x: Forge suite realistic_env_max_load failure on da68844d2fcb3805fcfdbba0cb157dd3c2f97923
two traffics test: inner traffic : committed: 12269.57 txn/s, latency: 3246.68 ms, (p50: 2700 ms, p90: 3300 ms, p99: 9800 ms), latency samples: 4665180
two traffics test : committed: 100.02 txn/s, latency: 4309.14 ms, (p50: 2600 ms, p90: 9200 ms, p99: 10300 ms), latency samples: 1800
Latency breakdown for phase 0: ["QsBatchToPos: max: 0.231, avg: 0.216", "QsPosToProposal: max: 0.236, avg: 0.174", "ConsensusProposalToOrdered: max: 0.320, avg: 0.293", "ConsensusOrderedToCommit: max: 0.430, avg: 0.412", "ConsensusProposalToCommit: max: 0.721, avg: 0.705"]
Test Failed: check for success
Caused by:
Failed latency check, for ["P90 latency is 9.2s and exceeds limit of 4.5s"]
Stack backtrace:
0: anyhow::error::<impl anyhow::Error>::msg
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/anyhow-1.0.79/src/error.rs:83:36
1: aptos_forge::success_criteria::SuccessCriteriaChecker::check_latency
at ./testsuite/forge/src/success_criteria.rs:560:13
2: aptos_forge::success_criteria::SuccessCriteriaChecker::check_for_success::{{closure}}
at ./testsuite/forge/src/success_criteria.rs:304:9
3: aptos_forge::interface::network::NetworkContext::check_for_success::{{closure}}
at ./testsuite/forge/src/interface/network.rs:112:10
4: <dyn aptos_testcases::NetworkLoadTest as aptos_forge::interface::network::NetworkTest>::run::{{closure}}
at ./testsuite/testcases/src/lib.rs:322:14
5: <core::pin::Pin<P> as core::future::future::Future>::poll
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/future/future.rs:123:9
6: <aptos_testcases::two_traffics_test::TwoTrafficsTest as aptos_forge::interface::network::NetworkTest>::run::{{closure}}
at ./testsuite/testcases/src/two_traffics_test.rs:77:47
7: <core::pin::Pin<P> as core::future::future::Future>::poll
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/future/future.rs:123:9
8: <aptos_testcases::CompositeNetworkTest as aptos_forge::interface::network::NetworkTest>::run::{{closure}}
at ./testsuite/testcases/src/lib.rs:628:37
9: <core::pin::Pin<P> as core::future::future::Future>::poll
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/future/future.rs:123:9
10: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/park.rs:282:63
11: tokio::runtime::coop::with_budget
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/coop.rs:107:5
12: tokio::runtime::coop::budget
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/coop.rs:73:5
13: tokio::runtime::park::CachedParkThread::block_on
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/park.rs:282:31
14: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/context/blocking.rs:66:9
15: tokio::runtime::handle::Handle::block_on::{{closure}}
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/handle.rs:310:22
16: tokio::runtime::context::runtime::enter_runtime
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/context/runtime.rs:65:16
17: tokio::runtime::handle::Handle::block_on
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.35.1/src/runtime/handle.rs:309:9
18: aptos_forge::runner::Forge<F>::run::{{closure}}
at ./testsuite/forge/src/runner.rs:628:49
19: aptos_forge::runner::run_test
at ./testsuite/forge/src/runner.rs:701:11
20: aptos_forge::runner::Forge<F>::run
at ./testsuite/forge/src/runner.rs:628:30
21: forge::run_forge
at ./testsuite/forge-cli/src/main.rs:458:11
22: forge::main
at ./testsuite/forge-cli/src/main.rs:384:21
23: core::ops::function::FnOnce::call_once
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
24: std::sys_common::backtrace::__rust_begin_short_backtrace
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:155:18
25: std::rt::lang_start::{{closure}}
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:166:18
26: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:284:13
27: std::panicking::try::do_call
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
28: std::panicking::try
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
29: std::panic::catch_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
30: std::rt::lang_start_internal::{{closure}}
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:48
31: std::panicking::try::do_call
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
32: std::panicking::try
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
33: std::panic::catch_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
34: std::rt::lang_start_internal
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:20
35: main
36: __libc_start_main
37: _start
Trailing Log Lines:
32: std::panicking::try
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
33: std::panic::catch_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
34: std::rt::lang_start_internal
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:20
35: main
36: __libc_start_main
37: _start
Swarm logs can be found here: See fgi output for more information.
{"level":"INFO","source":{"package":"aptos_forge","file":"testsuite/forge/src/backend/k8s/cluster_helper.rs:292"},"thread_name":"main","hostname":"forge-e2e-pr-11725-1724904963-da68844d2fcb3805fcfdbba0cb157dd3c","timestamp":"2024-08-29T04:27:49.577863Z","message":"Deleting namespace forge-e2e-pr-11725: Some(NamespaceStatus { conditions: None, phase: Some(\"Terminating\") })"}
{"level":"INFO","source":{"package":"aptos_forge","file":"testsuite/forge/src/backend/k8s/cluster_helper.rs:400"},"thread_name":"main","hostname":"forge-e2e-pr-11725-1724904963-da68844d2fcb3805fcfdbba0cb157dd3c","timestamp":"2024-08-29T04:27:49.577904Z","message":"aptos-node resources for Forge removed in namespace: forge-e2e-pr-11725"}
Failed to run tests:
Tests Failed
failures:
CompositeNetworkTest
test result: FAILED. 0 passed; 1 failed; 0 filtered out
Error: Tests Failed
Stack backtrace:
0: anyhow::error::<impl anyhow::Error>::msg
at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/anyhow-1.0.79/src/error.rs:83:36
1: aptos_forge::runner::Forge<F>::run
at ./testsuite/forge/src/runner.rs:653:13
2: forge::run_forge
at ./testsuite/forge-cli/src/main.rs:458:11
3: forge::main
at ./testsuite/forge-cli/src/main.rs:384:21
4: core::ops::function::FnOnce::call_once
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
5: std::sys_common::backtrace::__rust_begin_short_backtrace
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:155:18
6: std::rt::lang_start::{{closure}}
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:166:18
7: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:284:13
8: std::panicking::try::do_call
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
9: std::panicking::try
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
10: std::panic::catch_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
11: std::rt::lang_start_internal::{{closure}}
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:48
12: std::panicking::try::do_call
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
13: std::panicking::try
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
14: std::panic::catch_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
15: std::rt::lang_start_internal
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:20
16: main
17: __libc_start_main
18: _start
Debugging output:
NAME READY STATUS RESTARTS AGE
aptos-node-0-fullnode-eforge227-0 1/1 Running 0 11m
aptos-node-0-validator-0 1/1 Running 0 11m
aptos-node-1-fullnode-eforge227-0 1/1 Running 0 11m
aptos-node-1-validator-0 1/1 Running 0 11m
aptos-node-2-fullnode-eforge227-0 1/1 Running 0 11m
aptos-node-2-validator-0 1/1 Running 0 11m
aptos-node-3-fullnode-eforge227-0 1/1 Running 0 11m
aptos-node-3-validator-0 1/1 Running 0 11m
aptos-node-4-fullnode-eforge227-0 1/1 Running 0 11m
aptos-node-4-validator-0 1/1 Running 0 11m
aptos-node-5-validator-0 1/1 Running 0 11m
aptos-node-6-validator-0 1/1 Running 0 11m
genesis-aptos-genesis-eforge227-r6ckl 0/1 Completed 0 11m
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite framework_upgrade success on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> da68844d2fcb3805fcfdbba0cb157dd3c2f97923
Compatibility test results for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> da68844d2fcb3805fcfdbba0cb157dd3c2f97923 (PR)
Upgrade the nodes to version: da68844d2fcb3805fcfdbba0cb157dd3c2f97923
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1310.25 txn/s, submitted: 1312.66 txn/s, failed submission: 2.42 txn/s, expired: 2.42 txn/s, latency: 2340.69 ms, (p50: 2100 ms, p90: 3600 ms, p99: 5100 ms), latency samples: 119220
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1180.81 txn/s, submitted: 1182.58 txn/s, failed submission: 1.77 txn/s, expired: 1.77 txn/s, latency: 2718.24 ms, (p50: 2400 ms, p90: 4800 ms, p99: 6200 ms), latency samples: 106560
5. check swarm health
Compatibility test for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> da68844d2fcb3805fcfdbba0cb157dd3c2f97923 passed
Upgrade the remaining nodes to version: da68844d2fcb3805fcfdbba0cb157dd3c2f97923
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1201.71 txn/s, submitted: 1203.51 txn/s, failed submission: 1.80 txn/s, expired: 1.80 txn/s, latency: 2514.32 ms, (p50: 2300 ms, p90: 3900 ms, p99: 5500 ms), latency samples: 106800
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite realistic_env_max_load on da68844d2fcb3805fcfdbba0cb157dd3c2f97923
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite realistic_env_max_load success on da68844d2fcb3805fcfdbba0cb157dd3c2f97923
two traffics test: inner traffic : committed: 13148.31 txn/s, latency: 3028.50 ms, (p50: 2700 ms, p90: 3900 ms, p99: 5100 ms), latency samples: 4999260
two traffics test : committed: 100.04 txn/s, latency: 2928.52 ms, (p50: 2500 ms, p90: 4500 ms, p99: 5400 ms), latency samples: 1780
Latency breakdown for phase 0: ["QsBatchToPos: max: 0.235, avg: 0.220", "QsPosToProposal: max: 0.253, avg: 0.207", "ConsensusProposalToOrdered: max: 0.321, avg: 0.296", "ConsensusOrderedToCommit: max: 0.480, avg: 0.457", "ConsensusProposalToCommit: max: 0.778, avg: 0.753"]
Max non-epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 0.96s no progress at version 2747400 (avg 0.21s) [limit 15].
Max epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 7.76s no progress at version 2747398 (avg 7.76s) [limit 15].
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite realistic_env_max_load on 949fa49298bd3fac912799c652a3b55a4547677e
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite framework_upgrade on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 949fa49298bd3fac912799c652a3b55a4547677e
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite realistic_env_max_load success on 949fa49298bd3fac912799c652a3b55a4547677e
two traffics test: inner traffic : committed: 13642.49 txn/s, latency: 2914.15 ms, (p50: 2700 ms, p90: 3300 ms, p99: 3900 ms), latency samples: 5187200
two traffics test : committed: 99.90 txn/s, latency: 2588.72 ms, (p50: 2400 ms, p90: 3000 ms, p99: 6400 ms), latency samples: 1840
Latency breakdown for phase 0: ["QsBatchToPos: max: 0.230, avg: 0.217", "QsPosToProposal: max: 0.300, avg: 0.243", "ConsensusProposalToOrdered: max: 0.315, avg: 0.295", "ConsensusOrderedToCommit: max: 0.477, avg: 0.453", "ConsensusProposalToCommit: max: 0.770, avg: 0.748"]
Max non-epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 0.91s no progress at version 1988142 (avg 0.21s) [limit 15].
Max epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 8.27s no progress at version 1988140 (avg 6.95s) [limit 15].
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite framework_upgrade success on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 949fa49298bd3fac912799c652a3b55a4547677e
Compatibility test results for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 949fa49298bd3fac912799c652a3b55a4547677e (PR)
Upgrade the nodes to version: 949fa49298bd3fac912799c652a3b55a4547677e
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1286.53 txn/s, submitted: 1288.70 txn/s, failed submission: 2.17 txn/s, expired: 2.17 txn/s, latency: 2530.97 ms, (p50: 2100 ms, p90: 4500 ms, p99: 6400 ms), latency samples: 106660
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1283.10 txn/s, submitted: 1285.16 txn/s, failed submission: 2.05 txn/s, expired: 2.05 txn/s, latency: 2536.82 ms, (p50: 2400 ms, p90: 3900 ms, p99: 6000 ms), latency samples: 112400
5. check swarm health
Compatibility test for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 949fa49298bd3fac912799c652a3b55a4547677e passed
Upgrade the remaining nodes to version: 949fa49298bd3fac912799c652a3b55a4547677e
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1246.16 txn/s, submitted: 1248.45 txn/s, failed submission: 2.29 txn/s, expired: 2.29 txn/s, latency: 2450.11 ms, (p50: 2100 ms, p90: 4300 ms, p99: 6000 ms), latency samples: 108880
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite framework_upgrade on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 9e37bf0baf1a61c6680eba316f97dad5124cf64c
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
Forge is running suite realistic_env_max_load on 9e37bf0baf1a61c6680eba316f97dad5124cf64c
- Grafana dashboard (auto-refresh)
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite realistic_env_max_load success on 9e37bf0baf1a61c6680eba316f97dad5124cf64c
two traffics test: inner traffic : committed: 13543.49 txn/s, latency: 2936.26 ms, (p50: 2700 ms, p90: 3200 ms, p99: 3600 ms), latency samples: 5149580
two traffics test : committed: 99.91 txn/s, latency: 2602.83 ms, (p50: 2500 ms, p90: 2800 ms, p99: 9800 ms), latency samples: 1700
Latency breakdown for phase 0: ["QsBatchToPos: max: 0.237, avg: 0.221", "QsPosToProposal: max: 0.271, avg: 0.223", "ConsensusProposalToOrdered: max: 0.317, avg: 0.297", "ConsensusOrderedToCommit: max: 0.488, avg: 0.471", "ConsensusProposalToCommit: max: 0.788, avg: 0.768"]
Max non-epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 1.02s no progress at version 2731154 (avg 0.21s) [limit 15].
Max epoch-change gap was: 0 rounds at version 0 (avg 0.00) [limit 4], 8.28s no progress at version 2731152 (avg 8.28s) [limit 15].
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking
:white_check_mark: Forge suite framework_upgrade success on d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 9e37bf0baf1a61c6680eba316f97dad5124cf64c
Compatibility test results for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 9e37bf0baf1a61c6680eba316f97dad5124cf64c (PR)
Upgrade the nodes to version: 9e37bf0baf1a61c6680eba316f97dad5124cf64c
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1101.84 txn/s, submitted: 1104.75 txn/s, failed submission: 2.90 txn/s, expired: 2.90 txn/s, latency: 2837.50 ms, (p50: 2200 ms, p90: 5300 ms, p99: 7200 ms), latency samples: 98680
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 1017.43 txn/s, submitted: 1020.95 txn/s, failed submission: 3.52 txn/s, expired: 3.52 txn/s, latency: 3062.55 ms, (p50: 2400 ms, p90: 5800 ms, p99: 7300 ms), latency samples: 92460
5. check swarm health
Compatibility test for d1bf834728a0cf166d993f4728dfca54f3086fb0 ==> 9e37bf0baf1a61c6680eba316f97dad5124cf64c passed
Upgrade the remaining nodes to version: 9e37bf0baf1a61c6680eba316f97dad5124cf64c
framework_upgrade::framework-upgrade::full-framework-upgrade : committed: 974.25 txn/s, submitted: 976.26 txn/s, failed submission: 2.01 txn/s, expired: 2.01 txn/s, latency: 3583.33 ms, (p50: 2400 ms, p90: 6600 ms, p99: 15100 ms), latency samples: 87280
Test Ok
- Grafana dashboard
- Humio Logs
- Axiom Logs
- Validator CPU Profile
- Fullnode CPU Profile
- Test runner output
- Test run is land-blocking