-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Fix: nextest cleanup race condition #3334
Conversation
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.
Looks decent so far. Requesting changes so when you hit "request review" I know to check back.
@bonega another thought is, instead of generating an arbitrary database name, we could generate one based on the path of the test function that's running. If the database name is always the same, then there's no real extra cleanup step necessary besides dropping and recreating the database before running the test and dropping it afterward. And it would make it a lot easier to find and inspect the database in question. I would honestly make it always clean up the test database afterward unless an environment variable is set; the existing behavior seems to just confuse and annoy people more than anything. Bikeshedding: Do you know of any test runners that execute the same function multiple times concurrently? I think we could even handle that by holding a lock on the row in the test-databases table as a mutex. Arguably though, that table wouldn't even need to exist. I think the main reason I didn't just do this originally was because I didn't want to have to think of a way to convert a path to a database name. However, as it turns out, MySQL and Postgres both allow (quoted) database names to contain any character besides The biggest potential issue is that both databases have a length limit of 64 and 63 characters, respectively, so we'd have to either abbreviate or just truncate. I guess truncating makes the most sense. 63 characters is quite a lot for a path, it's unlikely to collide in most situations. If there is a collision, the mutual exclusion would just make the tests execute serially. And we could always make the attribute take an argument to override the database name. |
Hey, just giving a heads-up that I am super busy with moving apartment, will take a closer look on this in a couple of days. |
@bonega do you have time to look at my last comment? |
It is starting to wind down now, think I will have time today or tomorrow |
@abonander I will do some prototyping and see if it seems workable. |
To get the module path you'll probably need to make |
Hey, Sorry for being unresponsive. I have checked around a little. By doing a truncate and lock I fear that we might regress the performance for some of the current users. |
@bonega we could instead hash the path. A SHA-256 hash is incredibly unlikely to collide and can be encoded in 64 hex characters, so in Base64 (with dash and underscore) would be more like... 40? I think deterministic naming is the right answer here, because then each test function can be wholly responsible for its own database and doesn't need any sort of memoization. |
9e20181
to
1a9845f
Compare
1a9845f
to
ca1c710
Compare
@abonander Hey, I am getting back into shape now. Is this in the direction of what you wanted? |
b27a056
to
ba296be
Compare
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.
Some nits, otherwise it looks all right.
Ok(Some(num_deleted)) | ||
}) | ||
} | ||
|
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.
Reminder to check this trait implementation for proper quoting of the database name. It doesn't look like it does it.
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.
@bonega don't forget this. Even with URL_SAFE
the database name still needs to be quoted because it may contain dashes.
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.
I checked and it seems to work.
A test in examples/postgres/axum-social-with-tests
has the test_path
: comment::test_create_comment
Which becomes the database name of _sqlx_test_hsAQWz-87IRR7sjnVDeMcHtoDLU3QyT6yWizSbWKFvNwoBt6Q60I
It is deleted correctly even though it contains dashes.
I see now that you're referencing the mysql implementation which I haven't started yet.
I will try and do it and the sqlite today.
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.
Just to update that I am fighting with running the tests on (both my branch and main)
@abonander I still can't run the tests locally but I see that this is passing in CI. |
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.
One blocking change ({db_name:?}
), one non-blocking (cleanup_test_dbs()
).
Also, what failure are you getting locally? I can't help without any details.
@s373r Thank you. |
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.
Added comments
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.
LGTM
@abonander , could you please merge the PR? |
@abonander how could we help getting this PR merged? |
@abonander bump on this; would be great to get this merged, thanks! |
fixes #2123 #[sqlx::test] should play nicely with nextest
Nextest provides a
NEXTEST_RUN_ID
that we can use to clear up tests belonging to the same cargo invocation.See for a more general fix for cargo test runners.
Currently I haven't implemented support for mysql and sqlite, I'm looking for feedback before going ahead and doing that.