Skip to content

Commit 86e1d28

Browse files
committed
test: pin devnet-6 fixtures to v6.1.1 and fix the EEST harness
Pins the pyspec/EEST fixtures (tests-glamsterdam-devnet@v6.1.1, tests-zkevm@v0.5.0) across the NUnit constants and the nethtest workflow, adds state-test progress reporting and watchdog thread-stack diagnostics, and warms up Rlp's static initializer to prevent a class-init deadlock in the parallel state-test parse phase.
1 parent 911b4b0 commit 86e1d28

4 files changed

Lines changed: 43 additions & 17 deletions

File tree

.github/workflows/run-nethtest.yml

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ on:
2525
eest_version:
2626
description: EEST release tag, or latest / latest-<keyword> to resolve dynamically
2727
required: false
28-
default: latest-bal
28+
default: tests-glamsterdam-devnet@v6.1.1
2929
type: string
3030
zkevm_version:
3131
description: zkEVM fixtures release tag (zkevmTest only), or latest / latest-<keyword>
3232
required: false
33-
default: tests-zkevm@v0.4.1
33+
default: tests-zkevm@v0.5.0
3434
type: string
3535
filter:
3636
description: Regex filter for test names
@@ -66,12 +66,12 @@ on:
6666
eest_version:
6767
description: EEST release tag, or latest / latest-<keyword> to resolve dynamically
6868
required: false
69-
default: latest-bal
69+
default: tests-glamsterdam-devnet@v6.1.1
7070
type: string
7171
zkevm_version:
7272
description: zkEVM fixtures release tag (zkevmTest only), or latest / latest-<keyword>
7373
required: false
74-
default: tests-zkevm@v0.4.1
74+
default: tests-zkevm@v0.5.0
7575
type: string
7676
filter:
7777
description: Regex filter for test names (optional)
@@ -89,19 +89,16 @@ env:
8989
TERM: xterm
9090
FILTER: ${{ inputs.filter || '' }}
9191
IDLE_TIMEOUT_MINUTES: ${{ inputs.idle_timeout_minutes || '10' }}
92-
# Fixture source: the next-fork (BAL) releases of ethereum/execution-specs. They ship
93-
# fixtures for all forks (Frontier..Amsterdam), so a separate execution-spec-tests
94-
# "current spec" run adds no extra coverage. latest-bal resolves the newest BAL
95-
# release per run so new upstream tests surface immediately; client-vs-spec drift
96-
# then fails CI by design. Pass an exact tag (e.g. tests-bal@v7.2.0) to pin.
92+
# Fixture source: the glamsterdam-devnet releases of ethereum/execution-specs. They ship
93+
# fixtures for all forks (Frontier..Amsterdam) with the devnet-6 Amsterdam semantics
94+
# this branch implements. Pass an exact tag (e.g. tests-glamsterdam-devnet@v6.1.1) to pin.
9795
EEST_REPOSITORY: ethereum/execution-specs
98-
EEST_VERSION: ${{ inputs.eest_version || 'latest-bal' }}
99-
EEST_ARCHIVE: fixtures_bal.tar.gz
96+
EEST_VERSION: ${{ inputs.eest_version || 'tests-glamsterdam-devnet@v6.1.1' }}
97+
EEST_ARCHIVE: fixtures_glamsterdam-devnet.tar.gz
10098
# zkEVM stateless-preview fixtures ship in their own release line of the same repo;
101-
# zkevmTest jobs resolve this instead of EEST_VERSION. Pinned to v0.4.1: v0.5.0
102-
# changed the expected witness roots and the client currently matches v0.4.1
103-
# (dispatch with zkevm_version=latest-zkevm to test against newer releases).
104-
ZKEVM_VERSION: ${{ inputs.zkevm_version || 'tests-zkevm@v0.4.1' }}
99+
# zkevmTest jobs resolve this instead of EEST_VERSION. Pinned to v0.5.0, which this
100+
# branch's witness roots match (dispatch with zkevm_version to test other releases).
101+
ZKEVM_VERSION: ${{ inputs.zkevm_version || 'tests-zkevm@v0.5.0' }}
105102
# ubuntu-latest runners have 16 GB of RAM. The runner ships with server GC
106103
# (throughput-oriented, collects lazily), which previously ballooned past the
107104
# runner limit on the full fixture set. Workstation GC keeps the heap tight,
@@ -628,6 +625,12 @@ jobs:
628625
echo ""
629626
echo "--- recent nethtest status ---"
630627
tail -30 "$STDERR_FILE" | sed 's/\x1b\[[0-9;]*m//g' || true
628+
echo ""
629+
echo "--- managed thread stacks (deadlock diagnostics) ---"
630+
if kill -0 "$NETHTEST_PID" 2>/dev/null; then
631+
dotnet tool install --global dotnet-stack >/dev/null 2>&1 || true
632+
"$HOME/.dotnet/tools/dotnet-stack" report -p "$NETHTEST_PID" 2>&1 | head -600 || true
633+
fi
631634
echo "================================"
632635
}
633636

src/Nethermind/Ethereum.Blockchain.Pyspec.Test/Constants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace Ethereum.Blockchain.Pyspec.Test;
66
public class Constants
77
{
88
public const string ARCHIVE_URL_TEMPLATE = "https://github.com/ethereum/execution-specs/releases/download/{0}/{1}";
9-
public const string DEFAULT_ARCHIVE_VERSION = "tests-glamsterdam-devnet@v6.1.0";
9+
public const string DEFAULT_ARCHIVE_VERSION = "tests-glamsterdam-devnet@v6.1.1";
1010
public const string DEFAULT_ARCHIVE_NAME = "fixtures_glamsterdam-devnet.tar.gz";
1111
}

src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ZkEvmFixtures/Constants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ namespace Ethereum.Blockchain.Pyspec.Test.ZkEvmFixtures;
77
// ARCHIVE_URL_TEMPLATE already points there, so only the version/name need overriding.
88
public static class Constants
99
{
10-
public const string ArchiveVersion = "tests-zkevm@v0.4.1";
10+
public const string ArchiveVersion = "tests-zkevm@v0.5.0";
1111
public const string ArchiveName = "fixtures_zkevm.tar.gz";
1212
}

src/Nethermind/Nethermind.Test.Runner/Program.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ private static async Task<int> Run(ParseResult parseResult, CancellationToken ca
142142
string input = parseResult.GetValue(Options.Input);
143143
if (parseResult.GetValue(Options.Stdin)) input = Console.ReadLine();
144144

145+
// Rlp's and the decoders' static initializers reach into each other via RegisterDecoders;
146+
// racing the first RLP use across parse workers can deadlock class init. Warm it up here.
147+
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(Nethermind.Serialization.Rlp.Rlp).TypeHandle);
148+
145149
ulong chainId = parseResult.GetValue(Options.GnosisTest) ? GnosisSpecProvider.Instance.ChainId : MainnetSpecProvider.Instance.ChainId;
146150
bool jsonOutput = parseResult.GetValue(Options.JsonOutput);
147151
int workers = Math.Max(1, parseResult.GetValue(Options.Workers));
@@ -364,13 +368,31 @@ private static List<EthereumTestResult> RunStateTestFiles(
364368
}
365369
}
366370

371+
int completedTests = 0;
372+
// Keeps stderr alive for CI idle watchdogs; also streams failures as they happen.
373+
void ReportProgress(EthereumTestResult result)
374+
{
375+
int completed = Interlocked.Increment(ref completedTests);
376+
if (!result.Pass)
377+
{
378+
Console.Error.WriteLine($"\x1b[31mFAIL\x1b[0m [{completed}/{testCases.Count}] {result.Name} - {result.Error}");
379+
Console.Error.Flush();
380+
}
381+
else if (completed % ProgressReportTestInterval == 0 || completed == testCases.Count)
382+
{
383+
Console.Error.WriteLine($"PROGRESS [{completed}/{testCases.Count}]");
384+
Console.Error.Flush();
385+
}
386+
}
387+
367388
if (workers <= 1 || whenTrace != WhenTrace.Never || enableWarmup)
368389
{
369390
List<EthereumTestResult> allResults = [];
370391
foreach ((int index, GeneralStateTest test) in testCases)
371392
{
372393
StateTestsRunner runner = new(whenTrace, traceMemory, traceStack, chainId, filter, enableWarmup, suppressOutput: true);
373394
EthereumTestResult result = runner.RunSingleTest(test);
395+
ReportProgress(result);
374396
allResults.Add(result);
375397
}
376398
return allResults;
@@ -385,6 +407,7 @@ private static List<EthereumTestResult> RunStateTestFiles(
385407
StateTestsRunner runner = new(WhenTrace.Never, traceMemory, traceStack, chainId, filter, enableWarmup: false, suppressOutput: true);
386408
EthereumTestResult result = runner.RunSingleTest(item.test);
387409
results[item.index] = result;
410+
ReportProgress(result);
388411
});
389412

390413
return [.. results];

0 commit comments

Comments
 (0)