Skip to content
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

Merged
merged 1 commit into from
May 9, 2023

Conversation

hf
Copy link
Contributor

@hf hf commented Dec 28, 2022

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.

@hf hf requested a review from a team as a code owner December 28, 2022 12:41
models/cleanup.go Outdated Show resolved Hide resolved
models/cleanup.go Outdated Show resolved Hide resolved
models/cleanup.go Outdated Show resolved Hide resolved
api/api.go Outdated Show resolved Hide resolved
models/cleanup.go Outdated Show resolved Hide resolved
models/cleanup.go Outdated Show resolved Hide resolved
models/cleanup.go Outdated Show resolved Hide resolved
@hf hf force-pushed the hf/add-database-cleanup branch from 7bb4877 to 0729bf6 Compare May 8, 2023 16:15
@hf hf requested review from kangmingtay and J0 May 8, 2023 16:15
Copy link
Member

@kangmingtay kangmingtay left a 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.

kangmingtay

This comment was marked as duplicate.

@hf
Copy link
Contributor Author

hf commented May 9, 2023

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.

@hf hf force-pushed the hf/add-database-cleanup branch from 0729bf6 to 0c939dc Compare May 9, 2023 13:06
@hf
Copy link
Contributor Author

hf commented May 9, 2023

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.

@hf hf merged commit aaad5bd into master May 9, 2023
@hf hf deleted the hf/add-database-cleanup branch May 9, 2023 13:16
@github-actions
Copy link
Contributor

github-actions bot commented May 9, 2023

🎉 This PR is included in version 2.66.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@J0 J0 mentioned this pull request May 15, 2023
J0 added a commit that referenced this pull request May 23, 2023
## 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>
uxodb pushed a commit to uxodb/auth that referenced this pull request Nov 13, 2024
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.
uxodb pushed a commit to uxodb/auth that referenced this pull request Nov 13, 2024
## 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>
LashaJini pushed a commit to LashaJini/auth that referenced this pull request Nov 13, 2024
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.
LashaJini pushed a commit to LashaJini/auth that referenced this pull request Nov 13, 2024
## 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>
LashaJini pushed a commit to LashaJini/auth that referenced this pull request Nov 15, 2024
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.
LashaJini pushed a commit to LashaJini/auth that referenced this pull request Nov 15, 2024
## 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants