Skip to content

Deflake round 2 nodewise recovery#30779

Open
joe-redpanda wants to merge 14 commits into
redpanda-data:devfrom
joe-redpanda:deflake_round_2_nodewise_recovery
Open

Deflake round 2 nodewise recovery#30779
joe-redpanda wants to merge 14 commits into
redpanda-data:devfrom
joe-redpanda:deflake_round_2_nodewise_recovery

Conversation

@joe-redpanda

@joe-redpanda joe-redpanda commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Fixes my prior attempted deflake of nodewise recovery.

The issue is as follows:
Clusters bootstrap with 1 node initially, and then grow to their target size by joining new nodes.
Cloud topic internal topics start eagerly rather than lazily like other topics.

The cloud topics internal topics may bootstrap while the cluster is still single node, at which point rather than honoring internal_replication, they fall back to rf=1.

The issue, though, is that reconciliation of the cloud topics internal topics happens only once every (hardcoded) 10 minutes, and does NOT shortcut on membership changes.

As a result, if the cloud topics internal topic bootstraps with rf=1, it will be stuck like that for 10 minutes.

My prior change modified the nodewise recover test to wait for the cluster to be 'settled' aka for there to be no reconfigurations and for the cloud topics internal topics to have reached rf=3: this settling evidently could take up to 10 minutes, which way overwhelmed the timeout of 2 minutes I had assigned.

This PR rectifies the above by having internal reconciliation shortcut when membership changes and moving cloud topics internal topic over to the health manager which reconciles the others

This involved a few other changes and cleanups:

  1. internal topic reconciliation is now performed in a single_fiber_executor so we can cancel and re-submit reconciliation without accidentally running 2 at the same time
  2. internal topic reconciliation now cancels and spawns a new reconciliation loop on raft0 changes to allow the above to work properly
  3. parallelizes the reconciliation of all the topics
  4. adds a little jitter to the timing

Addendum:
Adds in a similar fix to what was in nodewise recovery tests to shadow linking chaos tests.
Adds the admin function to wait for internal topic replication before launching into a bunch of node decommissions.

Backports Required

  • none - not a bug fix
  • none - this is a backport
  • none - issue does not exist in previous branches
  • none - papercut/not impactful enough to backport
  • v26.1.x
  • v25.3.x
  • v25.2.x

Release Notes

Improvements

  • cloud topics more quickly reach their target replication factor on bootstrap

@joe-redpanda

Copy link
Copy Markdown
Contributor Author

/ci-repeat 5 dt-repeat=20 tests/rptest/tests/partition_force_reconfiguration_test.py::NodeWiseRecoveryTest.test_recovery_local_data_missing

@joe-redpanda
joe-redpanda marked this pull request as ready for review June 11, 2026 23:40
Copilot AI review requested due to automatic review settings June 11, 2026 23:40

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Updates the cloud topics L1 domain supervisor’s internal-topic reconciliation so it responds immediately to raft0 leadership and cluster membership changes, avoiding long delays (10min polling interval) where internal cloud-topics metastore topics can remain at an undesired replication factor after bootstrap/scale-out.

Changes:

  • Trigger internal topic reconciliation on controller (raft0) leadership changes and members-table updates, rather than relying solely on periodic polling.
  • Run reconciliation only on the raft0 leader to avoid redundant reconfiguration attempts from multiple nodes.
  • Serialize and safely cancel/restart reconciliation work using ssx::single_fiber_executor to prevent concurrent reconciliation runs.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
src/v/cloud_topics/level_one/domain/domain_supervisor.cc Adds event-driven reconciliation triggers, leader-gating, and a single-fiber executor to cancel/resubmit reconciliation safely.
src/v/cloud_topics/level_one/domain/BUILD Adds build deps needed for partition leader notifications and single_fiber_executor.

Comment thread src/v/cloud_topics/level_one/domain/domain_supervisor.cc Outdated
@vbotbuildovich

vbotbuildovich commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

Retry command for Build#85684

please wait until all jobs are finished before running the slash command

/ci-repeat 1
skip-redpanda-build
skip-units
skip-rebase
tests/rptest/tests/datalake/custom_partitioning_test.py::DatalakeCustomPartitioningTest.test_many_partitions@{"catalog_type":"rest_jdbc","cloud_storage_type":1}
tests/rptest/tests/cluster_linking_e2e_test.py::ShadowLinkingReplicationTests.test_auto_prefix_trimming@{"source_cluster_spec":{"cluster_type":"redpanda"},"storage_mode":"cloud","with_failures":true}

@vbotbuildovich

vbotbuildovich commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

CI test results

test results on build#85684
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(FAIL) ShadowLinkingReplicationTests test_auto_prefix_trimming {"source_cluster_spec": {"cluster_type": "redpanda"}, "storage_mode": "cloud", "with_failures": true} integration https://buildkite.com/redpanda/redpanda/builds/85684#019eb91c-b203-45b4-8511-02735bdfbf66 8/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0093, p0=0.0037, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingReplicationTests&test_method=test_auto_prefix_trimming
FAIL DatalakeCustomPartitioningTest test_many_partitions {"catalog_type": "rest_jdbc", "cloud_storage_type": 1} integration https://buildkite.com/redpanda/redpanda/builds/85684#019eb91c-b206-4c97-bef1-8c3d1ca63082 0/1 https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=DatalakeCustomPartitioningTest&test_method=test_many_partitions
test results on build#86554
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(FAIL) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-cloud-topic"} integration https://buildkite.com/redpanda/redpanda/builds/86554#019f1aab-9586-4a74-bea1-077a9673da11 9/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FLAKY(PASS) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-tiered-storage"} integration https://buildkite.com/redpanda/redpanda/builds/86554#019f1aa7-98a0-4457-bb6c-058f7dd8b193 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "cloud_combos"} integration https://buildkite.com/redpanda/redpanda/builds/86554#019f1aab-9585-43ba-b456-35b9fbc7994d 5/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0188, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/86554#019f1aab-9586-4a74-bea1-077a9673da11 16/21 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0195, p0=0.0006, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
test results on build#86626
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(FAIL) EndToEndCloudTopicsTest test_get_size {"storage_mode": "cloud"} integration https://buildkite.com/redpanda/redpanda/builds/86626#019f2010-ab65-40bb-b379-ef33932b5791 9/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=EndToEndCloudTopicsTest&test_method=test_get_size
FLAKY(PASS) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-tiered-cloud-topic"} integration https://buildkite.com/redpanda/redpanda/builds/86626#019f2010-ab64-45cf-b57d-ce795e469f34 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/86626#019f2015-654c-4c5d-86e6-17e53bec1356 0/1 https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/86626#019f2010-ab66-4177-a550-7a1bd5b8f0e2 17/21 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0176, p0=0.0050, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
test results on build#86779
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(FAIL) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-local"} integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f361-4a0f-ba72-5ddf585a63fe 7/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FLAKY(PASS) SIPartitionMovementTest test_cross_shard {"cloud_storage_type": 2, "num_to_upgrade": 0, "with_cloud_topics": false} integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f35d-41e9-87bb-348a5d2bff0f 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SIPartitionMovementTest&test_method=test_cross_shard
FLAKY(FAIL) SIPartitionMovementTest test_cross_shard {"cloud_storage_type": 1, "num_to_upgrade": 0, "with_cloud_topics": false} integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f360-44ed-8979-58d6e5ab35df 9/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SIPartitionMovementTest&test_method=test_cross_shard
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f356-4340-bf62-c0721dd27364 0/1 https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) TieredStorageTest test_tiered_storage {"cloud_storage_type_and_url_style": [1, "virtual_host"], "test_case": {"name": "(TS_Read == True, SegmentRolledByTimeout == True)"}} integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f35a-4a38-8c54-e71c2caad7ab 8/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=TieredStorageTest&test_method=test_tiered_storage
FLAKY(PASS) IdempotentProducerRecoveryTest test_java_client_recovery_on_producer_eviction null integration https://buildkite.com/redpanda/redpanda/builds/86779#019f397e-f35c-4294-acbe-88a575e13815 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0054, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=IdempotentProducerRecoveryTest&test_method=test_java_client_recovery_on_producer_eviction
test results on build#87223
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FAIL MasterTestSuite quota_manager_fetch_throttling unit https://buildkite.com/redpanda/redpanda/builds/87223#019f6be3-fd94-46a1-b0e3-d63dc24a0986 0/1
FLAKY(PASS) SIPartitionMovementTest test_cross_shard {"cloud_storage_type": 2, "num_to_upgrade": 0, "with_cloud_topics": true} integration https://buildkite.com/redpanda/redpanda/builds/87223#019f6c00-93ae-4895-9de9-693a29114046 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SIPartitionMovementTest&test_method=test_cross_shard
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "cloud_combos"} integration https://buildkite.com/redpanda/redpanda/builds/87223#019f6c00-93b5-40de-b5bd-0712c0d66332 25/31 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0304, p0=0.0020, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(PASS) TopicRecoveryTest test_prevent_recovery {"cloud_storage_type": 2} integration https://buildkite.com/redpanda/redpanda/builds/87223#019f6c00-93b1-4948-9841-033291063abe 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=TopicRecoveryTest&test_method=test_prevent_recovery
test results on build#87417
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/87417#019f80d7-8370-41ab-bb54-c5544f65f859 9/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL src/v/raft/tests/basic_raft_fixture_test src/v/raft/tests/basic_raft_fixture_test unit https://buildkite.com/redpanda/redpanda/builds/87417#019f80b7-9511-4d8c-a933-092c0678b81d 0/1
test results on build#87503
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(PASS) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-local"} integration https://buildkite.com/redpanda/redpanda/builds/87503#019f86dc-5965-41f6-99fb-833f738164ee 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/87503#019f86dc-5962-4880-9804-eb91c07d4915 7/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/87503#019f86dc-5964-48b1-8324-14c999ef4d01 0/1 https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/87503#019f86dc-5965-4ea6-8aa1-06c4f08ad023 8/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
test results on build#87583
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FAIL MasterTestSuite per_entity_partition_mutations_record_throughput unit https://buildkite.com/redpanda/redpanda/builds/87583#019f8b64-e2eb-4b41-a7f6-28f10826f339 0/1
FLAKY(PASS) FollowerFetchingTest test_basic_follower_fetching {"fetch_from": "fetch-from-local"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b8a-5205-4bb3-8f3b-0eeb19120dbe 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0000, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=FollowerFetchingTest&test_method=test_basic_follower_fetching
FLAKY(PASS) ShadowLinkRoleSyncScaleTest test_role_sync_at_scale {"members_per_role": 1, "num_roles": 5000} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead5-467f-a990-8bab2be92f80 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0133, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkRoleSyncScaleTest&test_method=test_role_sync_at_scale
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead4-436b-8b82-f5a3083205eb 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b8a-5205-4609-928c-85ebf803de90 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "cloud_combos"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead5-467f-a990-8bab2be92f80 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "cloud_combos"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b8a-5205-4637-8aa0-b9d68157bdd9 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FAIL ShadowLinkingRandomOpsTest test_node_operations {"failures": false, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b8a-5205-4bb3-8f3b-0eeb19120dbe 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "basic"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead7-49a3-9c24-d2451fa8a2ff 5/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "cloud_combos"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead8-41b2-b952-d6e8d5ea1ca2 8/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) ShadowLinkingRandomOpsTest test_node_operations {"failures": true, "workload_set": "flipping"} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b8a-5207-4a2b-bd3c-bb6fc038f9f2 7/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingRandomOpsTest&test_method=test_node_operations
FLAKY(FAIL) UpgradeBackToBackTest test_upgrade_with_all_workloads {"single_upgrade": false} integration https://buildkite.com/redpanda/redpanda/builds/87583#019f8b70-ead9-4155-88b4-8b492004e9cc 7/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0144, p0=0.0003, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=UpgradeBackToBackTest&test_method=test_upgrade_with_all_workloads

@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch from 151fa2f to 1ec6529 Compare June 12, 2026 21:43
Comment thread src/v/cluster/health_manager.cc
Comment thread src/v/cluster/health_manager.cc Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch 3 times, most recently from e6e6c3b to 4a28210 Compare June 12, 2026 22:27
Comment thread src/v/cluster/health_manager.cc Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch from 4a28210 to 917d435 Compare June 12, 2026 22:53
@joe-redpanda

Copy link
Copy Markdown
Contributor Author

/ci-repeat 5 dt-repeat=20 tests/rptest/tests/partition_force_reconfiguration_test.py::NodeWiseRecoveryTest.test_recovery_local_data_missing

@joe-redpanda
joe-redpanda requested a review from andrwng June 12, 2026 23:42

@dotnwat dotnwat left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

i can't quite tell if this pr needs to be split up into separate commits, or if the hunks need to be moved around a bit so that the diff doesn't have so many interleaved changes. otherwise, a live walkthrough might be helpful.

Comment thread src/v/cluster/health_manager.h Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
Comment thread src/v/cluster/health_manager.cc Outdated
use simple_time_jitter for the sleep between reconcile passes instead
of a fixed interval.
subscribe to the node-local abort source so shutdown cancels the
executor as soon as it begins rather than waiting for stop() to drain,
and refuse to submit new runs once an abort has been requested.
the reconcile loop already sleeps once between passes; a 10s sleep
after every replication factor bump only delayed the remaining topics
in the pass. one sleep per pass, not one per topic.
thread the executor's abort source through do_reconcile into
ensure_topic_replication so draining the executor (or a later
resubmission) stops an in-flight pass at the next topic instead of
letting it run to completion.
replace the conservative one-topic-at-a-time chain with a parallel
pass over all internal topics, waited on in bulk.
adds notifications on raft0 leadership & node add / remove changes
which interrupt any in-flight run and launch another reconciliation
round through the single fiber executor.

the reconcile loop now exits on non-leaders instead of sleeping and
polling again: a later leadership change notification resubmits it.
add metastore reconciliation to the topics managed by health manager
The health_manager now reconciles the cloud-topics metastore topic's
replication factor
Comment thread src/v/cluster/health_manager.cc
@vbotbuildovich

vbotbuildovich commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Retry command for Build#87503

please wait until all jobs are finished before running the slash command

/ci-repeat 1
skip-redpanda-build
skip-units
skip-rebase
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":false,"workload_set":"basic"}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":true,"workload_set":"flipping"}

Comment thread tests/rptest/util.py Outdated
backoff_sec: float = 2,
logger: Logger | None = None,
) -> None:
"""Wait until every health-manager-managed internal topic that currently

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this is way too much prose make this terse

Comment thread tests/rptest/util.py Outdated
are created lazily are skipped until they exist.
"""

def all_at_target() -> bool:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this probably belongs in the admin client

Comment thread tests/rptest/util.py Outdated

def wait_for_internal_topic_replication(
admin: "Admin",
replication_factor: int = 3,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

can we scrape this from redpanda's settings

@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch from 4547472 to 01e01f1 Compare July 22, 2026 18:47
Comment thread tests/rptest/util.py Outdated
]


def wait_for_internal_topic_replication(

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

again this should go in the admin client

@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch from 01e01f1 to 214eb70 Compare July 22, 2026 18:54
Comment thread tests/rptest/services/admin.py Outdated
) -> None:
"""Wait for every existing health-manager-managed internal topic to
reach the target replication factor. Skips topics not yet created and
ignores in-flight reconfigurations, so it is safe to call under load. An

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

why are you talking about what this DOESN't do

# cloud-topics metastore, born rf=1) have reached their target
# replication factor before we start decommissioning nodes. An rf=1
# internal partition cannot be evacuated from a draining node, so a
# decommission that races the health manager's rf reconciliation stalls

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This comment should be a one line on 'wait for internal topics to bootstrap to full replication factor or decommission will stall'

@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch 2 times, most recently from a5b507f to 1b290ce Compare July 22, 2026 19:11
, _as(as) {}

ss::future<> health_manager::start() {
_as_sub = _as.local().subscribe(

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

the abort source should be getting cancelled on stop

nothing has consumed the boolean since the sequential reconcile chain
was replaced with a parallel pass; each topic's outcome is already
logged.
Add three Admin methods for reasoning about internal-topic replication:

- internal_topic_replication_factor(): reads the
  internal_topic_replication_factor cluster config.
- all_partitions_have_replicas(topic, rf): whether every partition of a
  topic has at least rf replicas; a missing topic is vacuously satisfied.
- wait_for_internal_topic_replication(): wait for every existing
  health-manager-managed internal topic (listed in
  HEALTH_MANAGER_INTERNAL_TOPICS, mirroring the internal_topics array in
  cluster/health_manager.cc) to become fully replicated at the target rf.
  get_partitions reports the target replica set as soon as a move is
  issued, so this also requires the topic to have no in-flight
  reconfiguration; reconfigurations of other topics are ignored, so it is
  safe to call under load.

An rf=1 internal partition cannot be evacuated off a draining node, so
callers use this before decommissioning.
ShadowLinkingRandomOpsTest.test_node_operations started the workload and
node-operation loop with no barrier, so a decommission could target the
node holding the sole rf=1 replica of the cloud-topics metastore
(ct_l1_domain) before the health manager reconciled it up. That partition
cannot be evacuated, so the decommission stalls and the test fails with
"decommissioning stopped making progress".

Wait for the health-manager-managed internal topics to reach their target
replication factor before the node-ops loop. This only waits on
internal-topic rf, not for the cluster to quiesce, so the workload's
in-flight reconfigurations keep running -- the flux is the point of this
test.
@joe-redpanda
joe-redpanda force-pushed the deflake_round_2_nodewise_recovery branch from 1b290ce to 2642add Compare July 22, 2026 19:53
@joe-redpanda
joe-redpanda requested a review from dotnwat July 22, 2026 20:32
@joe-redpanda

Copy link
Copy Markdown
Contributor Author

@dotnwat split the changes to health manager. swatted some additional bugs in the same vein. I'm probably going to leave this until after we cut the new release branch so these can bake, changing health monitor has kicked the rug and sent all the bugs scurrying.

@vbotbuildovich

vbotbuildovich commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

Retry command for Build#87583

please wait until all jobs are finished before running the slash command

/ci-repeat 1
skip-redpanda-build
skip-units
skip-rebase
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":true,"workload_set":"basic"}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":false,"workload_set":"cloud_combos"}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":false,"workload_set":"basic"}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":true,"workload_set":"cloud_combos"}
tests/rptest/tests/upgrade_test.py::UpgradeBackToBackTest.test_upgrade_with_all_workloads@{"single_upgrade":false}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":false,"workload_set":"flipping"}
tests/rptest/tests/shadow_linking_rnot_test.py::ShadowLinkingRandomOpsTest.test_node_operations@{"failures":true,"workload_set":"flipping"}

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants