forked from cerc-io/plugeth
542c861b4f
This PR fixes an issues in the new simulated backend. The root cause is the fact that the transaction pool has an internal reset operation that runs on a background thread. When a new transaction is added to the pool via the RPC, the transaction is added to a non-executable queue and will be moved to its final location on a background thread. If the machine is overloaded (or simply due to timing issues), it can happen that the simulated backend will try to produce the next block, whilst the pool has not yet marked the newly added transaction executable. This will cause the block to not contain the transaction. This is an issue because we want determinism from the simulator: add a tx, mine a block. It should be in there. The PR fixes it by adding a Sync function to the txpool, which waits for the current reset operation (if any) to finish, and then runs an entire round of reset on top. The new round is needed because resets are only triggered by new head events, so newly added transactions will not trigger the outer resets that we can wait on. The transaction pool would eventually internally do a reset even on transaction addition, but there's no easy way to wait on that and there's no meaningful reason to bubble that across everything. A clean outer reset will at worse be a small noop goroutine. |
||
---|---|---|
.. | ||
catalyst | ||
downloader | ||
ethconfig | ||
fetcher | ||
filters | ||
gasestimator | ||
gasprice | ||
protocols | ||
tracers | ||
api_admin.go | ||
api_backend.go | ||
api_debug_test.go | ||
api_debug.go | ||
api_miner.go | ||
api.go | ||
backend.go | ||
bloombits.go | ||
handler_eth_test.go | ||
handler_eth.go | ||
handler_snap.go | ||
handler_test.go | ||
handler.go | ||
peer.go | ||
peerset.go | ||
state_accessor.go | ||
sync_test.go | ||
sync.go |