-
Notifications
You must be signed in to change notification settings - Fork 375
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
feat: add database cleanup logic, runs after each request #875
Conversation
1e98ed5
to
72be296
Compare
7bb4877
to
0729bf6
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.
LGTM - i'm assuming this has already been benchmarked / tested manually? if not, it would be good to test this locally by generated a bunch of outdated rows to be cleaned up.
Just finished testing, it seems to be working quite well though I needed to add one more index. But GitHub is broken again so I'll push when it comes back. |
0729bf6
to
0c939dc
Compare
Just finished testing, it seems to be working quite well though I needed to add one more index. |
🎉 This PR is included in version 2.66.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
## What kind of change does this PR introduce? This PR extends #875 to clean up MFA challenges as well so that they don't clog the database. ## How this was tested set `GOTRUE_DB_CLEANUP_ENABLED = true` 1. Sign up locally 2. Enroll a factor 3. `ab -p testfileforab -T application/json -H 'Authorization: Bearer <token>' -c 10 -n 100 http://localhost:9999/factors/0bca5d9c-157a-4a15-890c-2ad33415b4f3/challenge` 4. `update auth.mfa_challenges set created_at = created_at - interval '48 hours';` 5. Make about 7 requests to ensure there's a cleanup performed --------- Co-authored-by: joel@joellee.org <joel@joellee.org>
Certain database entities such as refresh tokens and sessions pile up though normal operation without being cleaned up. This PR attempts to solve the problem by using a `models.Cleanup` function which takes care of these entities. The cleanup runs after each request on non-idempotent HTTP methods (POST, PUT, DELETE, PATCH). It uses fast deletes and updates using [`FOR UPDATE SKIP LOCKED`](https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE) so that deletes don't wait for other transactions to complete. It runs after each request as this model scales better than a background job that runs periodically as it is using resources only when the API is being used externally, making database use proportional to work performed. Rows are deleted about 24-72 hours after they have expired to aid in debugging if ever necessary.
## What kind of change does this PR introduce? This PR extends supabase#875 to clean up MFA challenges as well so that they don't clog the database. ## How this was tested set `GOTRUE_DB_CLEANUP_ENABLED = true` 1. Sign up locally 2. Enroll a factor 3. `ab -p testfileforab -T application/json -H 'Authorization: Bearer <token>' -c 10 -n 100 http://localhost:9999/factors/0bca5d9c-157a-4a15-890c-2ad33415b4f3/challenge` 4. `update auth.mfa_challenges set created_at = created_at - interval '48 hours';` 5. Make about 7 requests to ensure there's a cleanup performed --------- Co-authored-by: joel@joellee.org <joel@joellee.org>
Certain database entities such as refresh tokens and sessions pile up though normal operation without being cleaned up. This PR attempts to solve the problem by using a `models.Cleanup` function which takes care of these entities. The cleanup runs after each request on non-idempotent HTTP methods (POST, PUT, DELETE, PATCH). It uses fast deletes and updates using [`FOR UPDATE SKIP LOCKED`](https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE) so that deletes don't wait for other transactions to complete. It runs after each request as this model scales better than a background job that runs periodically as it is using resources only when the API is being used externally, making database use proportional to work performed. Rows are deleted about 24-72 hours after they have expired to aid in debugging if ever necessary.
## What kind of change does this PR introduce? This PR extends supabase#875 to clean up MFA challenges as well so that they don't clog the database. ## How this was tested set `GOTRUE_DB_CLEANUP_ENABLED = true` 1. Sign up locally 2. Enroll a factor 3. `ab -p testfileforab -T application/json -H 'Authorization: Bearer <token>' -c 10 -n 100 http://localhost:9999/factors/0bca5d9c-157a-4a15-890c-2ad33415b4f3/challenge` 4. `update auth.mfa_challenges set created_at = created_at - interval '48 hours';` 5. Make about 7 requests to ensure there's a cleanup performed --------- Co-authored-by: joel@joellee.org <joel@joellee.org>
Certain database entities such as refresh tokens and sessions pile up though normal operation without being cleaned up. This PR attempts to solve the problem by using a `models.Cleanup` function which takes care of these entities. The cleanup runs after each request on non-idempotent HTTP methods (POST, PUT, DELETE, PATCH). It uses fast deletes and updates using [`FOR UPDATE SKIP LOCKED`](https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE) so that deletes don't wait for other transactions to complete. It runs after each request as this model scales better than a background job that runs periodically as it is using resources only when the API is being used externally, making database use proportional to work performed. Rows are deleted about 24-72 hours after they have expired to aid in debugging if ever necessary.
## What kind of change does this PR introduce? This PR extends supabase#875 to clean up MFA challenges as well so that they don't clog the database. ## How this was tested set `GOTRUE_DB_CLEANUP_ENABLED = true` 1. Sign up locally 2. Enroll a factor 3. `ab -p testfileforab -T application/json -H 'Authorization: Bearer <token>' -c 10 -n 100 http://localhost:9999/factors/0bca5d9c-157a-4a15-890c-2ad33415b4f3/challenge` 4. `update auth.mfa_challenges set created_at = created_at - interval '48 hours';` 5. Make about 7 requests to ensure there's a cleanup performed --------- Co-authored-by: joel@joellee.org <joel@joellee.org>
Certain database entities such as refresh tokens and sessions pile up though normal operation without being cleaned up. This PR attempts to solve the problem by using a
models.Cleanup
function which takes care of these entities.The cleanup runs after each request on non-idempotent HTTP methods (POST, PUT, DELETE, PATCH). It uses fast deletes and updates using
FOR UPDATE SKIP LOCKED
so that deletes don't wait for other transactions to complete.It runs after each request as this model scales better than a background job that runs periodically as it is using resources only when the API is being used externally, making database use proportional to work performed.
Rows are deleted about 24-72 hours after they have expired to aid in debugging if ever necessary.