mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-01 04:28:37 +00:00
cmd/evm: add --workers flag to statetest for parallel file processing
This commit is contained in:
parent
58fe59263c
commit
d46370adff
1 changed files with 68 additions and 11 deletions
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"slices"
|
"slices"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
||||||
|
|
@ -57,6 +58,7 @@ var stateTestCommand = &cli.Command{
|
||||||
HumanReadableFlag,
|
HumanReadableFlag,
|
||||||
idxFlag,
|
idxFlag,
|
||||||
RunFlag,
|
RunFlag,
|
||||||
|
WorkersFlag,
|
||||||
}, traceFlags),
|
}, traceFlags),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -65,16 +67,14 @@ func stateTestCmd(ctx *cli.Context) error {
|
||||||
|
|
||||||
// If path is provided, run the tests at that path.
|
// If path is provided, run the tests at that path.
|
||||||
if len(path) != 0 {
|
if len(path) != 0 {
|
||||||
var (
|
collected := collectFiles(path)
|
||||||
collected = collectFiles(path)
|
workers := ctx.Int(WorkersFlag.Name)
|
||||||
results []testResult
|
if workers <= 0 {
|
||||||
)
|
workers = 1
|
||||||
for _, fname := range collected {
|
}
|
||||||
r, err := runStateTest(ctx, fname)
|
results, err := runStateTestsParallel(ctx, collected, workers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
|
||||||
results = append(results, r...)
|
|
||||||
}
|
}
|
||||||
report(ctx, results)
|
report(ctx, results)
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -95,6 +95,63 @@ func stateTestCmd(ctx *cli.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runStateTestsParallel(ctx *cli.Context, files []string, workers int) ([]testResult, error) {
|
||||||
|
if workers == 1 {
|
||||||
|
var results []testResult
|
||||||
|
for _, fname := range files {
|
||||||
|
r, err := runStateTest(ctx, fname)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
results = append(results, r...)
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
wg sync.WaitGroup
|
||||||
|
fileCh = make(chan struct {
|
||||||
|
index int
|
||||||
|
fname string
|
||||||
|
}, len(files))
|
||||||
|
resultCh = make(chan fileResult, len(files))
|
||||||
|
)
|
||||||
|
for i, fname := range files {
|
||||||
|
fileCh <- struct {
|
||||||
|
index int
|
||||||
|
fname string
|
||||||
|
}{i, fname}
|
||||||
|
}
|
||||||
|
close(fileCh)
|
||||||
|
|
||||||
|
for w := 0; w < workers; w++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for item := range fileCh {
|
||||||
|
r, err := runStateTest(ctx, item.fname)
|
||||||
|
resultCh <- fileResult{index: item.index, results: r, err: err}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
wg.Wait()
|
||||||
|
close(resultCh)
|
||||||
|
}()
|
||||||
|
|
||||||
|
ordered := make([]fileResult, len(files))
|
||||||
|
for fr := range resultCh {
|
||||||
|
if fr.err != nil {
|
||||||
|
return nil, fr.err
|
||||||
|
}
|
||||||
|
ordered[fr.index] = fr
|
||||||
|
}
|
||||||
|
var results []testResult
|
||||||
|
for _, fr := range ordered {
|
||||||
|
results = append(results, fr.results...)
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
|
||||||
// runStateTest loads the state-test given by fname, and executes the test.
|
// runStateTest loads the state-test given by fname, and executes the test.
|
||||||
func runStateTest(ctx *cli.Context, fname string) ([]testResult, error) {
|
func runStateTest(ctx *cli.Context, fname string) ([]testResult, error) {
|
||||||
src, err := os.ReadFile(fname)
|
src, err := os.ReadFile(fname)
|
||||||
|
|
@ -103,7 +160,7 @@ func runStateTest(ctx *cli.Context, fname string) ([]testResult, error) {
|
||||||
}
|
}
|
||||||
var testsByName map[string]tests.StateTest
|
var testsByName map[string]tests.StateTest
|
||||||
if err := json.Unmarshal(src, &testsByName); err != nil {
|
if err := json.Unmarshal(src, &testsByName); err != nil {
|
||||||
return nil, fmt.Errorf("unable to read test file %s: %w", fname, err)
|
return nil, nil // Skip non-fixture JSON files
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := vm.Config{Tracer: tracerFromFlags(ctx)}
|
cfg := vm.Config{Tracer: tracerFromFlags(ctx)}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue