vitess
vitess copied to clipboard
fix: Cleanup `ResourcePool` & Include Mutex Lock for `refreshPool`
Description
This PR cleans up the resource leakage from TestReopen and TestShrink, which causes flaky tests across ./go/pools/resource_pool_test.go. During my local run, TestIdleTimeout ended up failing with
resource_pool_test.go:407:
Error Trace: /home/zq2/vitess/go/pools/resource_pool_test.go:407
Error: Not equal:
expected: int(2)
actual : int64(6)
Test: TestIdleTimeout
Properly closing the resource pool helped to resolve the first issue but surfaces data race from refreshPool:
WARNING: DATA RACE
Write at 0x00c0000b9e68 by goroutine 38:
runtime.racewrite()
<autogenerated>:1 +0x1e
vitess.io/vitess/go/pools.(*poolRefresh).stop()
/home/zq2/vitess/go/pools/refresh_pool.go:98 +0xc6
vitess.io/vitess/go/pools.(*ResourcePool).Close()
/home/zq2/vitess/go/pools/resource_pool.go:147 +0x7e
vitess.io/vitess/go/pools.TestReopen()
/home/zq2/vitess/go/pools/resource_pool_test.go:369 +0x30b
testing.tRunner()
/usr/local/go/src/testing/testing.go:1934 +0x21c
testing.(*T).Run.gowrap1()
/usr/local/go/src/testing/testing.go:1997 +0x44
Previous read at 0x00c0000b9e68 by goroutine 42:
runtime.raceread()
<autogenerated>:1 +0x1e
vitess.io/vitess/go/pools.(*poolRefresh).startRefreshTicker()
/home/zq2/vitess/go/pools/refresh_pool.go:71 +0xf9
vitess.io/vitess/go/pools.(*ResourcePool).reopen()
/home/zq2/vitess/go/pools/resource_pool.go:185 +0x258
vitess.io/vitess/go/pools.(*poolRefresh).startRefreshTicker.func1.gowrap2()
/home/zq2/vitess/go/pools/refresh_pool.go:82 +0x42
...
Thus, a mutex lock for refreshPool.go is included here as well.
Related Issue(s)
related to #18965
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
AI Disclosure
This PR was written with the help of Claude Sonnet 4.5
Review Checklist
Hello reviewers! :wave: 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
Jobsshould be named in order to mark it asrequired. - [ ] 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
_vttables 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.
- [ ]
vtctlcommand output order should be stable andawk-able.