Skip to content

smartconnpool: fix MaxLifetime jitter#20118

Merged
arthurschreiber merged 1 commit into
mainfrom
smartconnpool-maxlifetime-fixes
May 18, 2026
Merged

smartconnpool: fix MaxLifetime jitter#20118
arthurschreiber merged 1 commit into
mainfrom
smartconnpool-maxlifetime-fixes

Conversation

@arthurschreiber
Copy link
Copy Markdown
Member

@arthurschreiber arthurschreiber commented May 16, 2026

Description

Fixes two smartconnpool MaxLifetime edge cases:

  • Use the full int64 nanosecond duration when adding lifetime jitter. The old uint32 cast truncated jitter for lifetimes above roughly 4.29s and could panic on exact multiples of 2^32 ns.
  • Treat non-positive MaxLifetime values as disabled so a negative duration cannot produce bogus jitter through rand.Int64N.

This is a behavior correction: for long MaxLifetime values, pooled connections can now live anywhere in the intended [MaxLifetime, 2*MaxLifetime) range. Before this PR, those same values effectively lived in a much narrower range close to MaxLifetime, weakening the anti-herd protection and making connection recycling more synchronized.

Related Issue(s)

Extracted from #20081.

Backport Justification

This is a small, isolated smartconnpool correctness fix with no API changes, migrations, or deployment steps. It restores the intended MaxLifetime jitter behavior and avoids panic/bogus-jitter edge cases for invalid or unlucky duration values.

Backporting is useful because released branches can otherwise recycle pooled connections more synchronously than configured for common minute/hour-scale lifetimes. The practical implication is that after this fix, connections may be kept open longer than before, up to nearly 2*MaxLifetime, but that is the documented/intended jitter window rather than a new feature.

Checklist

  • "Backport to:" labels have been added if this change should be back-ported to release branches
  • If this change is to be back-ported to previous releases, a justification is included in the PR description
  • Tests were added or are not required
  • Did the new or modified tests pass consistently locally and on CI?
  • Documentation was added or is not required

Deployment Notes

No deployment steps required.

AI Disclosure

This PR was written by Codex with direction from Arthur.

Signed-off-by: Arthur Schreiber <arthur@planetscale.com>
Copilot AI review requested due to automatic review settings May 16, 2026 12:19
@vitess-bot vitess-bot Bot added NeedsWebsiteDocsUpdate What it says NeedsDescriptionUpdate The description is not clear or comprehensive enough, and needs work NeedsIssue A linked issue is missing for this Pull Request NeedsBackportReason If backport labels have been applied to a PR, a justification is required labels May 16, 2026
@github-actions github-actions Bot added this to the v25.0.0 milestone May 16, 2026
@vitess-bot
Copy link
Copy Markdown
Contributor

vitess-bot Bot commented May 16, 2026

Review Checklist

Hello reviewers! 👋 Please follow this checklist when reviewing this Pull Request.

General

  • Ensure that the Pull Request has a descriptive title.
  • Ensure there is a link to an issue (except for internal cleanup and flaky test fixes), new features should have an RFC that documents use cases and test cases.

Tests

  • Bug fixes should have at least one unit or end-to-end test, enhancement and new features should have a sufficient number of tests.

Documentation

  • Apply the release notes (needs details) label if users need to know about this change.
  • New features should be documented.
  • There should be some code comments as to why things are implemented the way they are.
  • There should be a comment at the top of each new or modified test to explain what the test does.

New flags

  • Is this flag really necessary?
  • Flag names must be clear and intuitive, use dashes (-), and have a clear help text.

If a workflow is added or modified:

  • Each item in Jobs should be named in order to mark it as required.
  • If the workflow needs to be marked as required, the maintainer team must be notified.

Backward compatibility

  • Protobuf changes should be wire-compatible.
  • Changes to _vt tables and RPCs need to be backward compatible.
  • RPC changes should be compatible with vitess-operator
  • If a flag is removed, then it should also be removed from vitess-operator and arewefastyet, if used there.
  • vtctl command output order should be stable and awk-able.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes two MaxLifetime jitter edge cases in smartconnpool: avoids uint32 truncation/panic for lifetimes ≥ ~4.29s and treats non-positive values as disabled.

Changes:

  • Switch jitter computation to rand.Int64N over the full int64 nanosecond range.
  • Treat maxLifetime <= 0 as disabled.
  • Add tests covering jitter range and negative-disable behavior.

Reviewed changes

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

File Description
go/pools/smartconnpool/pool.go Use Int64N and guard against non-positive maxLifetime.
go/pools/smartconnpool/pool_test.go Tests for jitter distribution and negative-disable.

@arthurschreiber arthurschreiber added Type: Bug Component: VTTablet Backport to: release-23.0 Needs to be backport to release-23.0 Backport to: release-24.0 Needs to be backport to release-24.0 labels May 16, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented May 16, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.36%. Comparing base (70c7a72) to head (1bc2b56).
⚠️ Report is 261 commits behind head on main.

❗ There is a different number of reports uploaded between BASE (70c7a72) and HEAD (1bc2b56). Click for more details.

HEAD has 1 upload less than BASE
Flag BASE (70c7a72) HEAD (1bc2b56)
1 0
Additional details and impacted files
@@             Coverage Diff             @@
##             main   #20118       +/-   ##
===========================================
- Coverage   69.67%   52.36%   -17.32%     
===========================================
  Files        1614        8     -1606     
  Lines      216793      911   -215882     
===========================================
- Hits       151044      477   -150567     
+ Misses      65749      434    -65315     
Flag Coverage Δ
partial 52.36% <100.00%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@arthurschreiber arthurschreiber removed NeedsDescriptionUpdate The description is not clear or comprehensive enough, and needs work NeedsWebsiteDocsUpdate What it says NeedsIssue A linked issue is missing for this Pull Request NeedsBackportReason If backport labels have been applied to a PR, a justification is required labels May 16, 2026
@arthurschreiber arthurschreiber merged commit 46b0828 into main May 18, 2026
191 of 201 checks passed
@arthurschreiber arthurschreiber deleted the smartconnpool-maxlifetime-fixes branch May 18, 2026 18:48
arthurschreiber pushed a commit that referenced this pull request May 20, 2026
Signed-off-by: Arthur Schreiber <arthur@planetscale.com>
Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com>
arthurschreiber pushed a commit that referenced this pull request May 20, 2026
Signed-off-by: Arthur Schreiber <arthur@planetscale.com>
Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backport to: release-23.0 Needs to be backport to release-23.0 Backport to: release-24.0 Needs to be backport to release-24.0 Component: VTTablet Type: Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants