-
Notifications
You must be signed in to change notification settings - Fork 936
fix: Re-enable parallel run of Postgres-backed tests #119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Codecov Report
@@ Coverage Diff @@
## main #119 +/- ##
==========================================
- Coverage 74.72% 72.14% -2.59%
==========================================
Files 53 91 +38
Lines 550 3773 +3223
Branches 59 59
==========================================
+ Hits 411 2722 +2311
- Misses 127 831 +704
- Partials 12 220 +208
Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This makes me exceptionally happy!
Just two minor things.
@kylecarbs and I were debugging a gnarly postgres issue over the weekend, and unfortunately it looks like it is still coming up occassionally: https://github.com/coder/coder/runs/5014420662?check_suite_focus=true#step:8:35 - so thought this might be a good testing Monday task.
Intermittently, the test would fail with something like a
401
- invalid e-mail, or a409
- initial user already created. This was quite surprising, because the tests are designed to spin up their own, isolated database.We tried a few things to debug this...
Attempt 1: Log out the generated port numbers when running the docker image.
Based on the errors, it seemed like one test must be connecting to another test's database - that would explain why we'd get these conflicts! However, logging out the port number that came from docker always gave a unique number... and we couldn't find evidence of one database connecting to another.
Attempt 2: Store the database in unique, temporary folder.
@kylecarbs and I found that the there was a volume for the postgres data... so @kylecarbs implemented mounting the volume to a unique, per-test temporary folder in #89
It sounded really promising... but unfortunately we hit the issue again!
Attempt 3... this PR
After we hit the failure again, we noticed in the

docker ps
logs something quite strange:When the docker image is run - it creates two port bindings, an IPv4 and an IPv6 one. These should be the same - but surprisingly, they can sometimes be different. It isn't deterministic, and seems to be more common when there are multiple containers running. Importantly, they can overlap as in the above image.
Turns out, it seems this is a docker bug: moby/moby#42442 - which may be fixed in newer versions.
To work around this bug, we have to manipulate the port bindings (like you would with
-p
) at the command line. We can do this withdocker
/dockertest
, but it means we have to get a free port ahead of time to know which port to map.With that fix in - the

docker ps
is a little more sane:...and hopefully means we can safely run the containers in parallel again.