Skip to content

Commit 5fbc956

Browse files
authored
test(e2e): unskip pipelining related e2e tests (#23642)
## Summary - fix the L1 reorg message tests to wait for pre-reorg message visibility instead of readiness where readiness is not the behavior under test - stabilize the L1 reorg pending-chain prune test by reorging back before the checkpoint publish block - target a future pipelined submission slot in the MBPS prune test before checkpoint publishing is disabled - keep recently unskipped tests listed as flake patterns without skip: true - leave blacklist token contract e2e tests on AUTOMINE_E2E_OPTS and remove stale pipelining migration TODOs ## Verification - yarn lint end-to-end - git diff --check - ANVIL_PORT=8571 e2e_epochs/epochs_l1_reorgs.parallel.test.ts -t 'updates L1 to L2 messages changed due to an L1 reorg' passed locally - ANVIL_PORT=8572 e2e_epochs/epochs_mbps.pipeline.parallel.test.ts -t 'prunes uncheckpointed blocks when proposer fails to deliver' passed locally - Raman: escalated red/green local runs passed for e2e_epochs/epochs_l1_reorgs.parallel.test.ts -t 'handles missed message inserted by an L1 reorg' - Raman: escalated red/green local runs passed for e2e_epochs/epochs_l1_reorgs.parallel.test.ts -t 'prunes blocks from pending chain removed from L1 due to an L1 reorg' - Raman: yarn build passed
1 parent 8284490 commit 5fbc956

10 files changed

Lines changed: 36 additions & 48 deletions

File tree

.test_patterns.yml

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,7 @@ tests:
185185
error_regex: "ContractFunctionExecutionError: The contract function"
186186
owners:
187187
- *mitch
188-
# Under proposer pipelining each validator votes in its own slot and the votes
189-
# don't aggregate into the same round, so the slashing quorum (3) is never
190-
# reached within the 414s budget; the test consistently times out at the docker
191-
# outer 600s (exit 124). The publisher refactor lands all vote-offenses tx's
192-
# on L1 successfully — voteCount on the slasher proposer simply stays at 1
193-
# per round. This is a slashing-payload aggregation issue independent of
194-
# publisher work; skip until the slashing team addresses it separately.
195188
- regex: "e2e_p2p/valid_epoch_pruned_slash.test.ts"
196-
skip: true
197189
owners:
198190
- *mitch
199191
- *palla
@@ -276,14 +268,10 @@ tests:
276268
- *adam
277269

278270
- regex: "src/e2e_epochs/epochs_l1_reorgs.parallel.test.ts"
279-
skip: true
280271
owners:
281272
- *phil
282273

283-
# Consistently times out — prune detection timing too tight for CI resources
284-
# See https://github.com/AztecProtocol/aztec-packages/pull/22392
285274
- regex: "epochs_mbps.pipeline.parallel.test.ts.*prunes uncheckpointed"
286-
skip: true
287275
owners:
288276
- *sean
289277

@@ -383,15 +371,7 @@ tests:
383371
owners:
384372
- *palla
385373

386-
# HA full suite is unstable under HA pipelining: multiple distinct failure
387-
# modes (governance vote coord, work distribution, afterAll teardown hook
388-
# timeouts, peer races on checkpoint proposals — see #23344, #23541,
389-
# ci.aztec-labs.com/136431da99834194). Flagging individual error_regex
390-
# entries and even the whole-suite flake match still let it dequeue PRs
391-
# because ci3 retries once and the suite fails both attempts. Skip
392-
# outright on merge-train/spartan until HA pipelining stabilises.
393374
- regex: "yarn-project/end-to-end/scripts/run_test.sh ha src/composed/ha/e2e_ha_full.test.ts"
394-
skip: true
395375
owners:
396376
- *spyros
397377

yarn-project/end-to-end/src/composed/ha/e2e_ha_full.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { GovernanceProposerAbi } from '@aztec/l1-artifacts/GovernanceProposerAbi
2727
import { StatefulTestContractArtifact } from '@aztec/noir-test-contracts.js/StatefulTest';
2828
import { type AttestationInfo, getAttestationInfoFromPublishedCheckpoint } from '@aztec/stdlib/block';
2929
import { Checkpoint } from '@aztec/stdlib/checkpoint';
30+
import { TopicType } from '@aztec/stdlib/p2p';
3031
import { OffenseType } from '@aztec/stdlib/slashing';
3132
import { TxStatus } from '@aztec/stdlib/tx';
3233
import type { GenesisData } from '@aztec/stdlib/world-state';
@@ -263,6 +264,30 @@ describe('HA Full Setup', () => {
263264
}
264265

265266
logger.info(`All ${NODE_COUNT} HA peer nodes started and coordinating via PostgreSQL database`);
267+
logger.info('Waiting for HA peer nodes to join the tx gossip mesh before deploying the test account');
268+
await retryUntil(
269+
async () => {
270+
const meshStates = await Promise.all(
271+
haNodeServices.map(async (service, nodeIndex) => {
272+
const p2p = service.getP2P();
273+
const [peers, txMeshPeerCount] = await Promise.all([
274+
p2p.getPeers(),
275+
p2p.getGossipMeshPeerCount(TopicType.tx),
276+
]);
277+
278+
return { nodeIndex, peerCount: peers.length, txMeshPeerCount };
279+
}),
280+
);
281+
282+
logger.debug('HA tx gossip mesh status', { meshStates });
283+
return meshStates.every(({ peerCount, txMeshPeerCount }) => peerCount > 0 && txMeshPeerCount > 0)
284+
? true
285+
: undefined;
286+
},
287+
'HA tx gossip mesh readiness',
288+
60,
289+
1,
290+
);
266291

267292
// Now deploy the account - blocks can be built by the HA nodes
268293
logger.info('Deploying test account now that validators are running');

yarn-project/end-to-end/src/e2e_blacklist_token_contract/burn.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ describe('e2e_blacklist_token_contract burn', () => {
1111
let { asset, tokenSim, wallet, adminAddress, otherAddress, blacklistedAddress } = t;
1212

1313
beforeAll(async () => {
14-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
15-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
16-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1714
await t.setup({ ...AUTOMINE_E2E_OPTS });
1815
// Beware that we are adding the wallet as minter here, which is very slow because it needs multiple blocks.
1916
await t.applyMint();

yarn-project/end-to-end/src/e2e_blacklist_token_contract/minting.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ describe('e2e_blacklist_token_contract mint', () => {
1111
let { asset, tokenSim, adminAddress, otherAddress, blacklistedAddress } = t;
1212

1313
beforeAll(async () => {
14-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
15-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
16-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1714
await t.setup({ ...AUTOMINE_E2E_OPTS });
1815
// Beware that we are adding the admin as minter here, which is very slow because it needs multiple blocks.
1916
await t.applyMint();

yarn-project/end-to-end/src/e2e_blacklist_token_contract/shielding.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ describe('e2e_blacklist_token_contract shield + redeem_shield', () => {
1010
let { asset, tokenSim, wallet, adminAddress, otherAddress, blacklistedAddress } = t;
1111

1212
beforeAll(async () => {
13-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
14-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
15-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1613
await t.setup({ ...AUTOMINE_E2E_OPTS });
1714
await t.applyMint(); // Beware that we are adding the admin as minter here
1815
// Have to destructure again to ensure we have latest refs.

yarn-project/end-to-end/src/e2e_blacklist_token_contract/transfer_private.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ describe('e2e_blacklist_token_contract transfer private', () => {
1010
let { asset, tokenSim, wallet, adminAddress, otherAddress, blacklistedAddress } = t;
1111

1212
beforeAll(async () => {
13-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
14-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
15-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1613
await t.setup({ ...AUTOMINE_E2E_OPTS });
1714
// Beware that we are adding the admin as minter here, which is very slow because it needs multiple blocks.
1815
await t.applyMint();

yarn-project/end-to-end/src/e2e_blacklist_token_contract/transfer_public.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ describe('e2e_blacklist_token_contract transfer public', () => {
99
let { asset, tokenSim, wallet, adminAddress, otherAddress, blacklistedAddress } = t;
1010

1111
beforeAll(async () => {
12-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
13-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
14-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1512
await t.setup({ ...AUTOMINE_E2E_OPTS });
1613
// Beware that we are adding the admin as minter here, which is very slow because it needs multiple blocks.
1714
await t.applyMint();

yarn-project/end-to-end/src/e2e_blacklist_token_contract/unshielding.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ describe('e2e_blacklist_token_contract unshielding', () => {
1010
let { asset, tokenSim, wallet, adminAddress, otherAddress, blacklistedAddress } = t;
1111

1212
beforeAll(async () => {
13-
// TODO(kill-non-pipelined): re-enable pipelining once B1 (world-state fork lifecycle) is
14-
// fixed — BlacklistTokenContractTest.applyBaseSetup runs two 86400s warps which time out
15-
// mineBlock under pipelining. See PIPELINING_GOTCHAS.md.
1613
await t.setup({ ...AUTOMINE_E2E_OPTS });
1714
// Beware that we are adding the admin as minter here, which is very slow because it needs multiple blocks.
1815
await t.applyMint();

yarn-project/end-to-end/src/e2e_epochs/epochs_l1_reorgs.parallel.test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { keccak256, parseTransaction } from 'viem';
2525

2626
import { sendL1ToL2Message } from '../fixtures/l1_to_l2_messaging.js';
2727
import type { EndToEndContext } from '../fixtures/utils.js';
28+
import { waitForL1ToL2MessageSeen } from '../shared/wait_for_l1_to_l2_message.js';
2829
import { proveInteraction } from '../test-wallet/utils.js';
2930
import { EpochsTestContext } from './epochs_test.js';
3031

@@ -350,12 +351,12 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
350351
const CHECKPOINT_NUMBER = CheckpointNumber(initialCheckpoint + 3);
351352
await test.waitUntilCheckpointNumber(CHECKPOINT_NUMBER, L2_SLOT_DURATION_IN_S * 10);
352353
expect(monitor.checkpointNumber).toEqual(CHECKPOINT_NUMBER);
354+
const l1BlockNumber = monitor.l1BlockNumber;
353355
// Stop the sequencer immediately so any in-flight pipelined publish for CHECKPOINT_NUMBER+1
354-
// doesn't extend l1BlockNumber before we capture it. setConfig alone is not enough under
356+
// doesn't extend the reorg range before we calculate it. setConfig alone is not enough under
355357
// pipelining because already-constructed jobs snapshot the old config.
356358
await context.sequencer!.stop();
357359
logger.warn(`Sequencer stopped`);
358-
const l1BlockNumber = monitor.l1BlockNumber;
359360
// Wait for node to sync to the checkpoint.
360361
await retryUntil(() => getCheckpointNumber(node).then(b => b === CHECKPOINT_NUMBER), 'node sync', 10, 0.1);
361362
logger.warn(`Reached checkpoint ${CHECKPOINT_NUMBER}`);
@@ -364,8 +365,7 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
364365
await test.assertMultipleBlocksPerSlot(2);
365366

366367
// Remove the L2 block from L1
367-
const l1BlocksToReorg = monitor.l1BlockNumber - l1BlockNumber + 1;
368-
await context.cheatCodes.eth.reorgWithReplacement(l1BlocksToReorg);
368+
await context.cheatCodes.eth.reorgTo(l1BlockNumber - 1);
369369
expect(await monitor.run(true).then(monitor => monitor.checkpointNumber)).toEqual(
370370
CheckpointNumber(CHECKPOINT_NUMBER - 1),
371371
);
@@ -472,7 +472,7 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
472472
});
473473
logger.warn(`Sent messages on L1 blocks ${msgs.map(m => m.txReceipt.blockNumber)}`);
474474

475-
await waitForL1ToL2MessageReady(node, msgs.at(-1)!.msgHash, {
475+
await waitForL1ToL2MessageSeen(node, msgs.at(-1)!.msgHash, {
476476
timeoutSeconds: msgs.length * L1_BLOCK_TIME_IN_S * 2,
477477
});
478478

@@ -485,7 +485,7 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
485485
logger.warn(`Sent new message on L1 block ${newMsg.txReceipt.blockNumber}`);
486486

487487
// New msg gets synced, and old one is out
488-
await waitForL1ToL2MessageReady(node, newMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 6 });
488+
await waitForL1ToL2MessageReady(node, newMsg.msgHash, { timeoutSeconds: L2_SLOT_DURATION_IN_S * 5 });
489489
expect(await isL1ToL2MessageReady(node, msgs[0].msgHash)).toBe(true);
490490
expect(await isL1ToL2MessageReady(node, msgs.at(-1)!.msgHash)).toBe(false);
491491

@@ -502,7 +502,7 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
502502
logger.warn(`Sending first cross chain message`);
503503
const firstMsg = await sendMessage();
504504
logger.warn(`Sent first message on L1 block ${firstMsg.txReceipt.blockNumber}`);
505-
await waitForL1ToL2MessageReady(node, firstMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 3 });
505+
await waitForL1ToL2MessageSeen(node, firstMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 3 });
506506
logger.warn(`Synced first message`);
507507

508508
// Next message shall not land
@@ -524,11 +524,12 @@ describe('e2e_epochs/epochs_l1_reorgs', () => {
524524
const reorgDepth = (await monitor.run(true).then(m => m.l1BlockNumber)) - l1BlockNumber;
525525
await context.cheatCodes.eth.reorgWithReplacement(reorgDepth, [[l1ClientDelayer.getCancelledTxs()[0]]]);
526526
const secondMsg = await secondMsgPromise;
527+
await waitForL1ToL2MessageSeen(node, secondMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 3 });
527528

528529
// Archiver should see the new message and should be able to accept a third one on top, without any rolling hash issues
529530
logger.warn(`Reorged-in second message on L1 block ${secondMsg.txReceipt.blockNumber}. Sending third message.`);
530531
const thirdMsg = await sendMessage();
531-
await waitForL1ToL2MessageReady(node, thirdMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 3 });
532+
await waitForL1ToL2MessageSeen(node, thirdMsg.msgHash, { timeoutSeconds: L1_BLOCK_TIME_IN_S * 3 });
532533

533534
// Verify multi-block checkpoints were built
534535
await test.assertMultipleBlocksPerSlot(2);

yarn-project/end-to-end/src/e2e_epochs/epochs_mbps.pipeline.parallel.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,12 @@ describe('e2e_epochs/epochs_mbps_pipeline', () => {
325325
await test.waitUntilCheckpointNumber(CheckpointNumber(1), checkpointTimeout);
326326
const checkpointedBlockNumber = await archiver.getBlockNumber();
327327
logger.warn(`Baseline established: checkpoint 1 reached at block ${checkpointedBlockNumber}`);
328-
// Find the next proposer and prevent it from publishing checkpoints
328+
// Target a submission slot whose pipelined build has not started yet.
329329
const { slot: currentSlot } = test.epochCache.getEpochAndSlotNow();
330330
const { proposerIndex, slot: proposerSlotToNotPublish } = await findNextProposerIndex(
331331
test.epochCache,
332332
validators,
333-
SlotNumber(currentSlot + 1),
333+
SlotNumber(currentSlot + 2),
334334
);
335335
logger.warn(
336336
`Will skip checkpoint publishing for proposer ${proposerIndex} in slot ${proposerSlotToNotPublish} - current slot ${currentSlot}`,

0 commit comments

Comments
 (0)