Skip to content

test(lockservice): retry indeterminate txn timeout checks - #26587

Merged
XuPeng-SH merged 3 commits into
matrixorigin:mainfrom
gouhongshen:agent/issue-26575
Aug 3, 2026
Merged

test(lockservice): retry indeterminate txn timeout checks#26587
XuPeng-SH merged 3 commits into
matrixorigin:mainfrom
gouhongshen:agent/issue-26575

Conversation

@gouhongshen

Copy link
Copy Markdown
Contributor

What type of PR is this?

  • API-change
  • BUG
  • Improvement
  • Documentation
  • Feature
  • Test and CI
  • Code Refactoring

Which issue(s) this PR fixes:

Fixes #26575

What this PR does / why we need it:

Root cause

Lockservice active-transaction recovery intentionally uses a separate MORPC
client with a 500ms backend-create budget. The failing CI log shows that cold
connection timing out after 500.241548ms. Production correctly treats that
observation as indeterminate: it retains the transaction and retries during a
later timeout scan. TestCheckTxnTimeout instead required the transaction to be
removed by one scan, so scheduler delay in a valid recovery path failed the
test.

At the failing commit, that assertion also exited the topology callback before
the service and allocator cleanup statements. Their RPC goroutines remained
active and caused the later TestIssue5176 and
TestUnlockInRollingRestartCN leak reports; the latter test's log contains the
previous test's service ID. Main has since merged #26555, which installs the
topology cleanup before the callback and closes it from a defer. This PR does
not duplicate that already-merged cleanup fix.

Changes

  • Make TestCheckTxnTimeout assert the production contract: an indeterminate
    scan may retain the transaction, but subsequent scans must eventually remove
    it after authoritative inactive and cannot-commit fence results.
  • Exercise the exact observed morpc.ErrBackendCreateTimeout in the existing
    deterministic error-then-confirmed-inactive unit test.

The 500ms recovery policy remains unchanged. There are no production-code,
API, wire-format, or performance changes.

Verification

Environment: Go 1.26.4, Darwin/arm64, controlled MatrixOne CGo test wrapper.

  • Original three tests in order, non-race, -count=10: pass
  • TestValidTxnCheckErrorThenConfirmedInactive, non-race, -count=100: pass
  • Adaptive focused race stress (30s budget per test):
    • TestCheckTxnTimeout: T=1.16s, N=25
    • TestValidTxnCheckErrorThenConfirmedInactive: T=0s, N=100
    • TestIssue5176: T=0.09s, N=100
    • TestUnlockInRollingRestartCN: T=2.08s, N=14
  • Full ./pkg/lockservice, non-race: pass (113.574s)
  • Full ./pkg/lockservice, race: pass (121.847s)
  • go list, go build, and go vet for ./pkg/lockservice: pass

BVT is not applicable because the affected contract is an internal Go recovery
scanner and test-topology lifecycle, with no SQL-visible behavior.

Residual risk

The test retains its existing 10s outer bound and still fails if recovery never
obtains an authoritative result. It only permits the transient first-scan
timeout that production explicitly handles by retrying.

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@XuPeng-SH XuPeng-SH 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.

Reviewed head 90ef785. The retry matches the production state machine: a failed active-txn observation is indeterminate and retains ownership; only a later authoritative inactive result plus cannot-commit fencing permits removal. The loop remains serial and bounded, preserves the 10s failure oracle, and the deterministic unit now exercises the exact backend-create-timeout value. I traced the RPC/cleanup wait-for path and found no unbounded or duplicate-cleanup edge. Focused tests pass for 20 non-race and 10 race repetitions.

@mergify mergify Bot added the queued label Aug 3, 2026
@mergify

mergify Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • Entered queue2026-08-03 01:52 UTC · Rule: main · triggered by rule Automatic queue on approval for main
  • 🟠 Checks running · in-place
  • 🚫 Left the queue2026-08-03 01:57 UTC · at 4258c3af1bbbe5949f9cd12ac56e499f79316487

This pull request spent 4 minutes 19 seconds in the queue, with no time running CI.

Waiting for
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone CI / SCA Test on Linux/arm64
    • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • check-success = Matrixone CI / SCA Test on Linux/arm64
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-skipped = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-success = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
All conditions
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone CI / SCA Test on Linux/arm64
    • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • check-success = Matrixone CI / SCA Test on Linux/arm64
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PROXY)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-skipped = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
    • check-success = Matrixone UT Coverage / UT Coverage on Ubuntu/x86
  • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
  • github-review-approved [🛡 GitHub branch protection]

Reason

Pull request #26587 has been dequeued

Pull request from fork cannot be queued. This pull request comes from a fork, and Mergify needs the author's permission to update its branch.

The author needs to enable "Allow edits from maintainers" on this pull request.

Hint

You should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it.
If you do update this pull request, it will automatically be requeued once the queue conditions match again.
If you think this was a flaky issue instead, you can requeue the pull request, without updating it, by posting a @mergifyio queue comment.

Tick the box to put this pull request back in the merge queue (same as @mergifyio queue).

  • Requeue this pull request

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

Labels

dequeued kind/bug Something isn't working kind/test-ci size/S Denotes a PR that changes [10,99] lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: lockservice UT intermittently fails with morpc leaks and timeout assertion

3 participants