-
Notifications
You must be signed in to change notification settings - Fork 899
chore: fix concurrent CommitQuota
transactions for unrelated users/orgs
#15261
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
Changes from 1 commit
dce750d
4fd9760
6215603
9ccd0b2
784a98f
5f021ad
426eeb6
b69dd0f
ec8f799
f613f31
746203d
c0d05db
245f6df
422e694
685b21e
33dbd92
a99882a
6ce8bfe
3a9270d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,14 +18,19 @@ INNER JOIN groups ON | |
WITH latest_builds AS ( | ||
SELECT | ||
DISTINCT ON | ||
(workspace_id) id, | ||
workspace_id, | ||
daily_cost | ||
(wb.workspace_id) wb.id, | ||
wb.workspace_id, | ||
wb.daily_cost | ||
FROM | ||
workspace_builds wb | ||
-- This INNER JOIN prevents a | ||
INNER JOIN | ||
Emyrk marked this conversation as resolved.
Show resolved
Hide resolved
|
||
workspaces on wb.workspace_id = workspaces.id | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, so in the query plan you have now, it's doing this nested loop where it finds the workspace IDs, then for each workspace ID it's doing this bitmap query:
That is, it first scans the index to find the pages to load, then scans the pages with the Do you know whether this results in page locks for the transaction, or tuple locks (I'm assuming these are row-level locks)? Page locks have a greater likelihood of catching unrelated transactions. And, some suggestions:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I was under the impression it was row-level locks, but I admit that was a result of my experiments with very few rows. The docs seem to imply it could take out larger locks.
Originally there was a suspicion we were getting this error from different transactions interring with I thought about moving I think this index + sorting by build number would be a large win: As I look at this query more, I don't see why we need to inner join If we add the index According to the quote I pulled though, is the goal just to reduce the number of rows touched to prevent the lock from having to go more "coarse" to the page lock? The text implies the behavior depends on the memory availability. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I agree that we don't need to join to And yeah, my understanding is that with page locks, updating quota for an unrelated user could cause a serialization error if the builds happen to share a page. So it's undesirable to use page locks if we could get away with finer grained locking. I realize that postgres can use page locks for memory reasons, and maybe there isn't anything we can do about that, but I'm also wondering whether it automatically uses page locks when it does a bitmap query, rather than tuple locks if we were able to use the index. |
||
WHERE | ||
workspaces.owner_id = @owner_id | ||
ORDER BY | ||
workspace_id, | ||
created_at DESC | ||
wb.workspace_id, | ||
wb.created_at DESC | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be faster to use
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wondered about that too. I had a specific goal and did not want to start mutating the query too much to solicit feedback on different things. Can I throw this up in another PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah, that works |
||
) | ||
SELECT | ||
coalesce(SUM(daily_cost), 0)::BIGINT | ||
|
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 don't think the build ID is needed.
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 didn't try and change the query too much beyond the seq scan.
It looks like it was never used at all:
coder/coderd/database/queries/quotas.sql
Lines 11 to 30 in d75c469