From 62bf23a5ae3d2e61eb2d07c263864401b866cfa7 Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Tue, 3 Sep 2024 15:41:22 +0200 Subject: [PATCH] fix(sims): OOM at sim-multi-seed-long run (#21503) --- .github/workflows/sims-nightly.yml | 2 ++ scripts/build/simulations.mk | 2 +- testutils/sims/runner.go | 12 ++++++++---- x/simulation/client/cli/flags.go | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/sims-nightly.yml b/.github/workflows/sims-nightly.yml index 35f6232bdf..0473bcad52 100644 --- a/.github/workflows/sims-nightly.yml +++ b/.github/workflows/sims-nightly.yml @@ -24,6 +24,8 @@ jobs: go-version: "1.23" check-latest: true - name: test-sim-multi-seed-long + env: + GOMEMLIMIT: 14GiB # reserve 2 GiB as buffer for GC to avoid OOM run: | make test-sim-multi-seed-long diff --git a/scripts/build/simulations.mk b/scripts/build/simulations.mk index ea7510db4c..4020d468a9 100644 --- a/scripts/build/simulations.mk +++ b/scripts/build/simulations.mk @@ -44,7 +44,7 @@ test-sim-custom-genesis-multi-seed: test-sim-multi-seed-long: @echo "Running long multi-seed application simulation. This may take awhile!" - @cd ${CURRENT_DIR}/simapp && go test -mod=readonly -timeout=1h -tags='sims' -run TestFullAppSimulation \ + @cd ${CURRENT_DIR}/simapp && go test -mod=readonly -timeout=2h -tags='sims' -run TestFullAppSimulation \ -NumBlocks=150 -Period=50 test-sim-multi-seed-short: diff --git a/testutils/sims/runner.go b/testutils/sims/runner.go index f708962a60..14d81e4469 100644 --- a/testutils/sims/runner.go +++ b/testutils/sims/runner.go @@ -3,6 +3,7 @@ package sims import ( "fmt" "io" + "os" "path/filepath" "testing" @@ -50,6 +51,7 @@ type SimulationApp interface { SetNotSigverifyTx() GetBaseApp() *baseapp.BaseApp TxConfig() client.TxConfig + Close() error } // Run is a helper function that runs a simulation test with the given parameters. @@ -114,7 +116,6 @@ func RunWithSeeds[T SimulationApp]( runLogger = log.NewTestLoggerInfo(t) } runLogger = runLogger.With("seed", tCfg.Seed) - app := testInstance.App stateFactory := setupStateFactory(app) simParams, err := simulation.SimulateFromSeedX( @@ -124,7 +125,7 @@ func RunWithSeeds[T SimulationApp]( app.GetBaseApp(), stateFactory.AppStateFn, simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simtestutil.SimulationOperations(app, stateFactory.Codec, tCfg, testInstance.App.TxConfig()), + simtestutil.SimulationOperations(app, stateFactory.Codec, tCfg, app.TxConfig()), stateFactory.BlockedAddr, tCfg, stateFactory.Codec, @@ -134,12 +135,13 @@ func RunWithSeeds[T SimulationApp]( require.NoError(t, err) err = simtestutil.CheckExportSimulation(app, tCfg, simParams) require.NoError(t, err) - if tCfg.Commit { + if tCfg.Commit && tCfg.DBBackend == "goleveldb" { simtestutil.PrintStats(testInstance.DB.(*dbm.GoLevelDB)) } for _, step := range postRunActions { step(t, testInstance) } + require.NoError(t, app.Close()) }) } } @@ -173,6 +175,8 @@ func NewSimulationAppInstance[T SimulationApp]( ) TestInstance[T] { t.Helper() workDir := t.TempDir() + require.NoError(t, os.Mkdir(filepath.Join(workDir, "data"), 0o755)) + dbDir := filepath.Join(workDir, "leveldb-app-sim") var logger log.Logger if cli.FlagVerboseValue { @@ -185,7 +189,7 @@ func NewSimulationAppInstance[T SimulationApp]( db, err := dbm.NewDB("Simulation", dbm.BackendType(tCfg.DBBackend), dbDir) require.NoError(t, err) t.Cleanup(func() { - require.NoError(t, db.Close()) + _ = db.Close() // ensure db is closed }) appOptions := make(simtestutil.AppOptionsMap) appOptions[flags.FlagHome] = workDir diff --git a/x/simulation/client/cli/flags.go b/x/simulation/client/cli/flags.go index 409e2aabf8..311ce7017d 100644 --- a/x/simulation/client/cli/flags.go +++ b/x/simulation/client/cli/flags.go @@ -46,7 +46,7 @@ func GetSimulatorFlags() { flag.IntVar(&FlagBlockSizeValue, "BlockSize", 200, "operations per block") flag.BoolVar(&FlagLeanValue, "Lean", false, "lean simulation log output") flag.BoolVar(&FlagCommitValue, "Commit", true, "have the simulation commit") - flag.StringVar(&FlagDBBackendValue, "DBBackend", "goleveldb", "custom db backend type") + flag.StringVar(&FlagDBBackendValue, "DBBackend", "goleveldb", "custom db backend type: goleveldb, memdb") // simulation flags flag.BoolVar(&FlagEnabledValue, "Enabled", false, "enable the simulation")