Fix concurrent role creation with exception handling only (no advisory locks)#326
Closed
pyramation wants to merge 2 commits into
Closed
Fix concurrent role creation with exception handling only (no advisory locks)#326pyramation wants to merge 2 commits into
pyramation wants to merge 2 commits into
Conversation
- Catch both duplicate_object and unique_violation exceptions - No advisory locks - relies on exception handling alone - Applied to all role creation code paths: - bootstrap-roles.sql (anonymous, authenticated, administrator) - bootstrap-test-roles.sql (app_user, app_admin) - LaunchQLInit.bootstrapDbRoles() - DbAdmin.createUserRole() This approach handles the unique_violation error that occurs under concurrent CREATE ROLE execution without using advisory locks. This allows comparison of exception-only vs lock-based approaches. Co-Authored-By: Dan Lynch <pyramation@gmail.com>
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
…locks) - Add IF NOT EXISTS checks before every CREATE ROLE statement - Add membership pre-checks before every GRANT statement - NO advisory locks (exceptions-only variant) - Keep both exception handlers (duplicate_object OR unique_violation) - Defense-in-depth: pre-check + exceptions (no locks) This pedantic approach ensures safety against concurrent role creation and membership grant races without using advisory locks. Co-Authored-By: Dan Lynch <pyramation@gmail.com>
devin-ai-integration Bot
added a commit
that referenced
this pull request
Nov 18, 2025
This test demonstrates the race condition that occurs when multiple processes attempt to create the same PostgreSQL role simultaneously. On the main branch, this test FAILS with unique_violation error when multiple concurrent CREATE ROLE statements hit the pg_authid_rolname_index. The test includes: - Concurrent role creation test (reproduces the bug) - Performance benchmarks at concurrency levels 2, 4, 8 - Concurrent GRANT operations test - High concurrency stress test with retries This PR intentionally fails on main to demonstrate the problem. Compare against PR #325 (with locks) and PR #326 (no locks) to see fixes. Co-Authored-By: Dan Lynch <pyramation@gmail.com>
Closed
5 tasks
4 tasks
Contributor
Latest UpdatesAdded comprehensive pre-existence checks to all CREATE ROLE and GRANT statements for defense-in-depth:
Related PRs
TestingThe concurrent test in PR #327 should PASS with this fix applied. Link to Devin run: https://app.devin.ai/sessions/2c33cab4511f4a7897e29001895487df |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fix concurrent role creation with exception handling only (no advisory locks)
Summary
This PR addresses the intermittent CI error
ERROR: duplicate key value violates unique constraint "pg_authid_rolname_index"by catching bothduplicate_objectANDunique_violationexceptions in all role creation code paths.Key difference from PR #325: This PR does NOT use advisory locks - it relies solely on exception handling to deal with concurrent role creation attempts.
Root Cause: Under concurrent execution,
CREATE ROLEcan hit thepg_authid_rolname_indexunique constraint before PostgreSQL's duplicate object detection runs, resulting inunique_violation(error code 23505) instead ofduplicate_object(error code 42710).This Solution: Updated exception handlers to catch both error codes across all 4 role creation code paths:
bootstrap-roles.sql(anonymous, authenticated, administrator)bootstrap-test-roles.sql(app_user, app_admin)LaunchQLInit.bootstrapDbRoles()(custom users)DbAdmin.createUserRole()(pgsql-test users)Review & Testing Checklist for Human
lql admin-users add --test --yesin 5+ parallel shells) to verify this approach handles the race conditionunique_violationhere doesn't accidentally mask other unrelated unique constraint violationsRecommended Test Plan
Notes
Link to Devin run: https://app.devin.ai/sessions/2c33cab4511f4a7897e29001895487df
Requested by: Dan Lynch (@pyramation)