Skip to content

rewrite of sei-load generator and sender.#56

Open
pompon0 wants to merge 46 commits into
mainfrom
gprusak-nonce-reset
Open

rewrite of sei-load generator and sender.#56
pompon0 wants to merge 46 commits into
mainfrom
gprusak-nonce-reset

Conversation

@pompon0

@pompon0 pompon0 commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Primary reason for the rewrite is support for non-happy paths for autobahn loadtesting - rejected transactions/not successfully executed/etc. The idea is that if sending a tx fails, we need to check the account nonce before sending the next transaction. Note that this affects only accounts from the long-lived pools - accounts generated for the sake of sending just 1 transaction (aka "new accounts") do not benefit from this extra logic.

The nonces, as well as the txs waiting to be sent are managed by TxsQueue, which ensures that:

  • inserted (generated) transactions have expected nonces
  • transactions per account are sent sequentially (otherwise they will be rejected by autobahn)

TxsQueue is managed by ShardedSender.

Additionally

  • removed unnecessary abstractions in both sender and generator logic
  • made Generator.Run accept the sender which exposes Nonce(), Flush() and Send() calls
  • added Generator <-> Sender integration tests
  • removed open/closed loop logic (might need to be reintroduced later if needed)
  • removed utils/rng in favor of just using a single Rand synchronously (we don't have other use cases). If concurrent Rand usage is needed, a SplitRng method was introduced (slower but robust alternative to SplitMix).

@pompon0
pompon0 requested a review from bdchatham June 26, 2026 16:14
@cursor

cursor Bot commented Jun 29, 2026

Copy link
Copy Markdown

PR Summary

High Risk
This is a large refactor of transaction generation, signing, nonce recovery, and RPC sending—behavior that must stay correct for Autobahn rejection paths. Config and CLI break (workers removed; new required validation on maxInFlight/connsPerEndpoint), and open-loop arrival scheduling is removed.

Overview
Rewrites the load path so Generator.Run drives the campaign directly against a TxSender (Nonce, Send, Flush), replacing the dispatcher/weighted-generator stack and removing open/closed-loop scheduling for now.

Sender: ShardedSender fronts a TxsQueue that enforces per-account ordering and expected nonces; failed sends on tracked pool accounts trigger nonce refresh before the next tx. Txs are built unsigned in scenarios and signed at send time; RPC I/O uses multiple connections per endpoint (connsPerEndpoint) with address-based stickiness instead of per-worker shards. --workers / numShards are gone; tuning is bufferSize (queue), maxInFlight, and connsPerEndpoint.

Generator/config: Drops utils/rng stream binding—workload randomness uses a single seeded *rand.Rand passed into generate/gas/distribution APIs. Prewarm lives on Generator.Prewarm; funding takes a flat address list from gen.Accounts().

Docs and JSON profiles are updated for the new settings; integration tests cover generator↔sender nonce behavior.

Reviewed by Cursor Bugbot for commit 2ed022d. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment thread sender/sharded_sender.go
Comment thread sender/txs_queue.go
Comment thread main.go
Comment thread sender/txs_queue.go
Comment thread sender/sharded_sender.go
}, nil
cfg: cfg,
queue: NewTxsQueue(cfg.Settings.MaxInFlight),
limiter: limiter,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buffer size no longer bounds queue

Medium Severity

NewShardedSender sizes TxsQueue only from Settings.MaxInFlight. Settings.BufferSize and LoadConfig.TotalQueueSize() are no longer used, so existing configs that tune bufferSize/--buffer-size do not limit queue depth or memory as before.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 34ba3fe. Configure here.

Comment thread sender/metrics.go Outdated
attribute.String("chain_id", stats.ChainID),
))
}
}*/

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worker queue metric disabled

Low Severity

The worker_queue_length observable gauge callback no longer records observations: the ShardStats loop is commented out and only assigns _ = ss. Scrapers always see an empty series after the sender rewrite removed per-shard queues.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 34ba3fe. Configure here.

Comment thread generator/generator.go Outdated
Comment thread generator/generator.go
Comment thread generator/generator.go
Comment thread main.go
Comment thread main.go
Comment thread generator/generator.go
instance.Deployed = true

if address.Cmp(common.Address{}) != 0 {
address := instance.Scenario.Deploy(g.config, deployer, uint64(i))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deploy nonces skip unused slots

High Severity

Sequential scenario deployment passes the scenario list index as the deployer nonce. Instances that do not broadcast a deployment transaction still advance that index, so the next contract deployment can be signed with a nonce above the account’s on-chain nonce and be rejected.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit cce23ae. Configure here.

Comment thread sender/sharded_sender.go
Comment thread sender/writer.go
if err != nil {
return fmt.Errorf("tx.EthTx.MarshalBinary(): %w", err)
}
txData.TxPayloads = append(txData.TxPayloads, payload)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TxsWriter emits unsigned payloads

High Severity

Transaction signing moved into ShardedSender, so generators now hand off unsigned txs. The TxsDir path uses TxsWriter, which marshals EthTx directly without signing. Written tx_payloads are therefore not valid raw transactions for later submission.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 10fe1d9. Configure here.

Comment thread main.go
if err := funder.FundAccounts(ctx, cfg, addrs); err != nil {
return fmt.Errorf("failed to fund accounts: %w", err)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funding skipped for txs-dir path

Medium Severity

Account funding now runs only in the ShardedSender branch. When TxsDir is set, FundAccounts is never called even if cfg.Funding is configured, so written txs can target unfunded accounts when replayed.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 59dd2f4. Configure here.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

There are 7 total unresolved issues (including 6 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 7aa4303. Configure here.

Comment thread generator/generator.go
type EthClient interface {
Send(ctx context.Context, tx *types.LoadTx) error
Nonce(ctx context.Context, acc types.Account) (uint64, error)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused EthClient interface left behind

Low Severity

The new exported-looking EthClient interface in generator is never referenced. Dead API surface next to the real TxSender interface makes the generator↔sender contract harder to follow.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 7aa4303. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants