fix: ensure embedded postgres cleanup in TestMain#239
Merged
tianzhou merged 1 commit intopgplex:mainfrom Jan 15, 2026
Merged
Conversation
Remove os.Exit() calls from TestMain functions to allow deferred Stop() calls to execute. In Go, os.Exit() terminates immediately without running deferred functions, causing embedded postgres processes to leak after test runs. Go 1.15+ automatically handles the exit code when TestMain returns, making explicit os.Exit() unnecessary. Ref: golang/go#34129
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes a resource leak issue where embedded PostgreSQL processes were not being cleaned up after test runs. The fix removes os.Exit() calls from TestMain functions in 4 test files, allowing deferred Stop() calls to execute properly. Since Go 1.15+, the testing framework automatically handles exit codes when TestMain returns without calling os.Exit(), making this change both safe and correct.
Changes:
- Removed
os.Exit()calls and simplifiedTestMainto just callm.Run()in 4 test files - Allows deferred cleanup functions (
defer sharedEmbeddedPG.Stop()) to execute properly - Prevents orphaned PostgreSQL processes after test package runs
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| internal/plan/plan_test.go | Removed os.Exit() to allow deferred postgres cleanup in TestMain |
| internal/diff/diff_test.go | Removed os.Exit() to allow deferred postgres cleanup in TestMain |
| cmd/migrate_integration_test.go | Removed os.Exit() to allow deferred postgres cleanup in TestMain |
| cmd/apply/apply_integration_test.go | Removed os.Exit() to allow deferred postgres cleanup in TestMain |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
alecthomas
pushed a commit
to alecthomas/pgschema
that referenced
this pull request
Jan 26, 2026
Remove os.Exit() calls from TestMain functions to allow deferred Stop() calls to execute. In Go, os.Exit() terminates immediately without running deferred functions, causing embedded postgres processes to leak after test runs. Go 1.15+ automatically handles the exit code when TestMain returns, making explicit os.Exit() unnecessary. Ref: golang/go#34129
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
os.Exit()calls fromTestMainfunctions to allow deferredStop()calls to execute properlyProblem
The
TestMainfunctions in 4 test files were callingos.Exit(code)afterm.Run(). In Go,os.Exit()terminates the program immediately without running deferred functions. This meantdefer sharedEmbeddedPG.Stop()never executed, leaving orphaned postgres processes after each test package run.Solution
Go 1.15+ automatically handles the exit code when
TestMainreturns without callingos.Exit(). By simply removing theos.Exit()calls, the deferred cleanup now executes properly.Ref: golang/go#34129
Test plan
ps aux | grep postgres)go test ./...go build ./...passes