Skip to content

test: feature_governance.py intermittent vote/superblock assertions #7328

Open

Description

@thepastaclaw

feature_governance.py intermittent vote/superblock assertions

Summary

feature_governance.py appears to be intermittently failing around governance
vote propagation / superblock readiness. In #7327 CI, the
linux64_sqlite-test / Test source job failed because one node only had 24
votes when the test expected all nodes to have 25.

Latest CI occurrence

Traceback excerpt:

File "test/functional/feature_governance.py", line 314, in run_test
  assert_equal(node.gobject("count")["votes"], 25)
AssertionError: not(24 == 25)

The log reached:

Should see same YES and NO vote count for both triggers on all nodes now
Should have 25 votes on all nodes

then failed on the raw gobject("count")["votes"] == 25 assertion. This looks
timing/sync-sensitive: the preceding trigger Yes/No count waits had succeeded,
but the aggregate vote count was still one vote short on at least one node.

Scope check for #7327

#7327 only changes:

test/functional/feature_dip3_v19.py
test/functional/test_framework/test_framework.py

The framework change adds an optional spork_sync_timeout parameter to
activate_by_name() while keeping the existing default timeout. Neither
feature_governance.py nor its direct wait_for_sporks_same() call uses this
helper path. The modified feature_dip3_v19.py test passed in the same failing
linux64_sqlite job.

Local reproduction signal

A local develop run also showed feature_governance.py instability, though at
a later assertion:

python3 test/functional/feature_governance.py --timeout-factor=4

failed with:

File "test/functional/feature_governance.py", line 342, in run_test
  self.check_superblock()
File "test/functional/feature_governance.py", line 59, in check_superblock
  assert_equal(payments_found, 2)
AssertionError: not(0 == 2)

That local failure is not the same assertion, but it supports that this test is
not stable independently of #7327's DIP3 v19-only change.

Suggested next steps

  • Add explicit waiting around the final aggregate gobject("count")["votes"]
    check instead of asserting immediately after per-trigger count waits; and/or
  • investigate why the superblock payment assertion can fail after the earlier
    governance vote checks appear to pass.

Activity

  1. thepastaclaw commented on Jul 8, 2026

    @thepastaclaw
    CollaboratorAuthor

    Another occurrence from #7416:

    Failure mode matches this issue exactly: after Should see same YES and NO vote count for both triggers on all nodes now, the test reached Should have 25 votes on all nodes and failed at test/functional/feature_governance.py:313:

    assert_equal(node.gobject("count")["votes"], 25)
    AssertionError: not(24 == 25)
    

    Scope note: #7416's current PR diff is limited to src/llmq/net_quorum.cpp and test/functional/p2p_quorum_data.py, so this governance vote-count failure is unrelated to that PR's QDATA vector-bound changes. The later #7416 head 4157ce53e6ae2b41ced3d1217bca0a0970d151d2 passed the full visible CI matrix, including linux64-test / Test source.

  2. thepastaclaw commented on Jul 8, 2026

    @thepastaclaw
    CollaboratorAuthor

    Another occurrence from #7433:

    Failure mode matches this issue: after Should see same YES and NO vote count for both triggers on all nodes now, the test reached Should have 25 votes on all nodes and failed at test/functional/feature_governance.py:313:

    assert_equal(node.gobject("count")["votes"], 25)
    AssertionError: not(24 == 25)
    

    Scope note: #7433 is the Bitcoin Core v0.26 backport batch 3 draft. Its PR diff does not touch test/functional/feature_governance.py. The only src/net_processing.cpp changes are the bitcoin#27625 transaction relay/mapRelay changes around non-mempool tx relay and most-recent-block transaction lookup; they do not change governance object/vote handling. A local rerun of the failing command on the PR branch passed:

    python3 test/functional/feature_governance.py --legacy-wallet --configfile=/Users/claw/Projects/dash/worktrees/backport-0.26-batch-3-refresh/test/config.ini --tmpdir=/private/tmp/dash_tracker1918_feature_governance_pr --portseed=19180 --timeout-factor=4
  3. thepastaclaw commented on Jul 18, 2026

    @thepastaclaw
    CollaboratorAuthor

    New occurrence on #7401 at exact head 45821d0:

    • Failing multiprocess job: https://github.com/dashpay/dash/actions/runs/29400920523/job/87311315049
    • Test: feature_governance.py --legacy-wallet
    • Failure: line 303 timed out waiting for the isolated trigger YesCount to reach 1 after the test reconnected and resynchronized the isolated node; the effective wait was 20 seconds.
    • The descriptor variant passed in the same multiprocess job, and the legacy-wallet test passed on the exact same head in both linux64-test and linux64_ubsan-test.
    • The exact-head PR diff is limited to DKG queueing/validation files and focused DKG tests; it does not touch feature_governance.py or governance vote propagation.

    This matches the existing intermittent governance vote-propagation/synchronization failure family. The PR branch was left unchanged.

  4. thepastaclaw commented on Jul 24, 2026

    @thepastaclaw
    CollaboratorAuthor

    Another occurrence from #7479 at exact head bc52f0a9c79cc584342142fdf613d961b7df19b6:

    assert_equal(node.gobject("count")["votes"], 25)
    AssertionError: not(24 == 25)
    

    The descriptor test exhausted all three runner attempts with this same intermittent missing-vote condition, while the legacy-wallet variant passed in the same job.

    Scope evidence: #7479's actual merge-base/GitHub PR diff is limited to wallet coin-selection, wallet GUI/RPC/test adaptations, and its wallet transaction benchmark. It does not touch feature_governance.py or governance vote propagation. Attempt 2 then passed the full matrix at the identical head, including linux64_ubsan-test / Test source: https://github.com/dashpay/dash/actions/runs/30008651352/attempts/2

    This is another instance of the pre-existing vote-propagation/synchronization flake tracked here. The PR branch was left unchanged.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions