diff --git a/.github/workflows/zombienet_polkadot.yml b/.github/workflows/zombienet_polkadot.yml index 99964cf3821a1..fc939fa032a43 100644 --- a/.github/workflows/zombienet_polkadot.yml +++ b/.github/workflows/zombienet_polkadot.yml @@ -292,32 +292,6 @@ jobs: local-dir: "${{ env.LOCAL_DIR }}/functional" # # - zombienet-polkadot-functional-0018-shared-core-idle-parachain: - needs: [preflight] - if: ${{ (needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_polkadot) && ! contains(needs.preflight.outputs.FLAKY_TESTS, 'zombienet-polkadot-functional-0018-shared-core-idle-parachain') }} - runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes) - timeout-minutes: 60 - container: - image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }} - env: - ZOMBIENET_INTEGRATION_TEST_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" - CUMULUS_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-parachain-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" - DEBUG: ${{ needs.preflight.outputs.DEBUG }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: cp_script - run: | - cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/functional - - - name: zombienet_test - uses: ./.github/actions/zombienet - with: - test: "0018-shared-core-idle-parachain.zndsl" - local-dir: "${{ env.LOCAL_DIR }}/functional" - # - # zombienet-polkadot-functional-0019-coretime-collation-fetching-fairness: needs: [preflight] if: ${{ (needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_polkadot) && ! contains(needs.preflight.outputs.FLAKY_TESTS, 'zombienet-polkadot-functional-0019-coretime-collation-fetching-fairness') }} @@ -882,3 +856,32 @@ jobs: ref-slug: ${{ needs.preflight.outputs.SOURCE_REF_SLUG }} test: "functional::approved_peer_mixed_validators::approved_peer_mixed_validators_test" prefix: "polkadot" + + # + # + zombienet-polkadot-shared-core-idle-parachain: + needs: [preflight] + if: ${{ (needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_polkadot) && ! contains(needs.preflight.outputs.FLAKY_TESTS, 'zombienet-polkadot-functional-spam-statement-distribution-requests') }} + runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes) + timeout-minutes: 60 + container: + image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }} + env: + # sdk tests are looking for POLKADOT_IMAGE + POLKADOT_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" + CUMULUS_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-parachain-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" + RUST_LOG: ${{ needs.preflight.outputs.RUST_LOG }} + ZOMBIE_PROVIDER: ${{ needs.preflight.outputs.ZOMBIE_PROVIDER }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: zombienet_test + uses: ./.github/actions/zombienet-sdk + with: + gh-token: ${{ secrets.GITHUB_TOKEN }} + build-id: ${{ needs.preflight.outputs.BUILD_RUN_ID }} + ref-slug: ${{ needs.preflight.outputs.SOURCE_REF_SLUG }} + test: "functional::shared_core_idle_parachain::shared_core_idle_parachain_test" + prefix: "polkadot" diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs index 3caf5c8ab01ab..f5aecd3cbe5ed 100644 --- a/polkadot/runtime/parachains/src/paras/mod.rs +++ b/polkadot/runtime/parachains/src/paras/mod.rs @@ -967,8 +967,10 @@ pub mod pallet { panic!("empty validation code is not allowed in genesis"); } Pallet::::initialize_para_now(&mut parachains, *id, genesis_args); - T::AssignCoretime::assign_coretime(*id) - .expect("Assigning coretime works at genesis; qed"); + if genesis_args.para_kind == ParaKind::Parachain { + T::AssignCoretime::assign_coretime(*id) + .expect("Assigning coretime works at genesis; qed"); + } } // parachains are flushed on drop } diff --git a/polkadot/zombienet-sdk-tests/tests/functional/mod.rs b/polkadot/zombienet-sdk-tests/tests/functional/mod.rs index 78fe6c43d9eb2..6bc12935bc884 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/mod.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/mod.rs @@ -5,5 +5,6 @@ mod approval_voting_coalescing; mod approved_peer_mixed_validators; mod async_backing_6_seconds_rate; mod duplicate_collations; +mod shared_core_idle_parachain; mod spam_statement_distribution_requests; mod sync_backing; diff --git a/polkadot/zombienet-sdk-tests/tests/functional/shared_core_idle_parachain.rs b/polkadot/zombienet-sdk-tests/tests/functional/shared_core_idle_parachain.rs new file mode 100644 index 0000000000000..a5b3da274f65c --- /dev/null +++ b/polkadot/zombienet-sdk-tests/tests/functional/shared_core_idle_parachain.rs @@ -0,0 +1,106 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Test that a parachain can keep producing blocks even if the other parachain with which it's +// sharing a core doesn't + +use anyhow::anyhow; + +use cumulus_zombienet_sdk_helpers::{assert_finality_lag, assert_finalized_para_throughput}; +use polkadot_primitives::Id as ParaId; +use serde_json::json; +use zombienet_sdk::{ + subxt::{self, ext::scale_value::value, OnlineClient, PolkadotConfig}, + subxt_signer::sr25519::dev, + NetworkConfigBuilder, +}; + +#[tokio::test(flavor = "multi_thread")] +async fn shared_core_idle_parachain_test() -> Result<(), anyhow::Error> { + let _ = env_logger::try_init_from_env( + env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"), + ); + + let images = zombienet_sdk::environment::get_images_from_env(); + + let config = NetworkConfigBuilder::new() + .with_relaychain(|r| { + let r = r + .with_chain("rococo-local") + .with_default_command("polkadot") + .with_default_image(images.polkadot.as_str()) + .with_default_args(vec![("-lparachain=debug").into()]) + .with_genesis_overrides(json!({ + "configuration": { + "config": { + "scheduler_params": { + "num_cores": 4, + "group_rotation_frequency": 4 + } + } + } + })) + .with_node(|node| node.with_name("validator-0")); + + (1..4).fold(r, |acc, i| acc.with_node(|node| node.with_name(&format!("validator-{i}")))) + }) + .with_parachain(|p| { + p.with_id(2000) + // Don't onboard as parachain, as this would automatically add one more core and + // assign it to the para. + .onboard_as_parachain(false) + .with_default_command("polkadot-parachain") + .with_default_image(images.cumulus.as_str()) + .with_default_args(vec![ + ("-lparachain=debug,aura=debug").into(), + "--authoring=slot-based".into(), + ]) + .with_collator(|n| n.with_name("collator-2000")) + }) + .build() + .map_err(|e| { + let errs = e.into_iter().map(|e| e.to_string()).collect::>().join(" "); + anyhow!("config errs: {errs}") + })?; + + let spawn_fn = zombienet_sdk::environment::get_spawn_fn(); + let network = spawn_fn(config).await?; + + let relay_node = network.get_node("validator-0")?; + let para_node_2000 = network.get_node("collator-2000")?; + + let relay_client: OnlineClient = relay_node.wait_client().await?; + let alice = dev::alice(); + + // Assign core 0 to be shared between paraid 2000 and another, non-existant paraid 2001. + let assign_core_call = subxt::tx::dynamic( + "Sudo", + "sudo", + vec![value! { + Coretime(assign_core { core: 0, begin: 0, assignment: ((Task(2000), 28800), (Task(2001), 28800)), end_hint: None() }) + }], + ); + relay_client + .tx() + .sign_and_submit_then_watch_default(&assign_core_call, &alice) + .await? + .wait_for_finalized_success() + .await?; + + log::info!("Assigned core 0 to be shared between paras"); + + // Check that para 2000 is essentially getting 12-second block time, while para 2001 does not + // produce anything. + assert_finalized_para_throughput( + &relay_client, + 15, + [(ParaId::from(2000), 5..9)].into_iter().collect(), + ) + .await?; + + assert_finality_lag(¶_node_2000.wait_client().await?, 5).await?; + + log::info!("Test finished successfully"); + + Ok(()) +} diff --git a/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.toml b/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.toml deleted file mode 100644 index af4315879f6e7..0000000000000 --- a/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.toml +++ /dev/null @@ -1,38 +0,0 @@ -[settings] -timeout = 1000 - -[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] -max_validators_per_core = 2 -num_cores = 4 -group_rotation_frequency = 4 - - -[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] -needed_approvals = 3 - -[relaychain] -default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" -chain = "rococo-local" -command = "polkadot" - -[[relaychain.node_groups]] -name = "validator" -args = ["-lruntime=debug,parachain=debug"] -count = 4 - -[[parachains]] -id = 2000 -register_para = false -onboard_as_parachain = false -add_to_genesis = false -chain = "glutton-westend-local-2000" -[parachains.genesis.runtimeGenesis.patch.glutton] -compute = "50000000" -storage = "2500000000" -trashDataCount = 5120 - -[parachains.collator] -name = "collator-2000" -image = "{{CUMULUS_IMAGE}}" -command = "polkadot-parachain" -args = ["-lparachain=debug", "--authoring", "slot-based"] diff --git a/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.zndsl b/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.zndsl deleted file mode 100644 index dce52505444e9..0000000000000 --- a/polkadot/zombienet_tests/functional/0018-shared-core-idle-parachain.zndsl +++ /dev/null @@ -1,11 +0,0 @@ -Description: Test that a parachain can keep producing blocks even if the other parachain with which it's sharing a core doesn't -Network: ./0018-shared-core-idle-parachain.toml -Creds: config - -validator: reports node_roles is 4 - -validator-0: js-script ./force-register-paras.js with "2000" return is 0 within 600 seconds -# assign core 0 to be shared by two paras, but only one exists -validator-0: js-script ./assign-core.js with "0,2000,28800,2001,28800" return is 0 within 600 seconds - -collator-2000: reports block height is at least 10 within 210 seconds diff --git a/prdoc/pr_8922.prdoc b/prdoc/pr_8922.prdoc new file mode 100644 index 0000000000000..e48b2ae614b5b --- /dev/null +++ b/prdoc/pr_8922.prdoc @@ -0,0 +1,11 @@ +title: "paras pallet: don't assign core if para_kind is ParaThread" + +doc: +- audience: Runtime Dev + description: |- + Only force assign core to genesis para if declared as parachain. + For parathread, proceed only with registering the para. + +crates: +- name: polkadot-runtime-parachains + bump: minor