fix: use short-lived DB sessions in RBAC permission checks#2319
fix: use short-lived DB sessions in RBAC permission checks#2319crivetimihai wants to merge 1 commit intomainfrom
Conversation
c79a5b3 to
47397a6
Compare
Rebased and Extended FixThis PR has been rebased onto Original IssueThe original PR removed Changes Made1. Core RBAC Changes (
|
47397a6 to
0ba41b5
Compare
Fix AddedIssue: User Context Detection Could Misidentify Request PayloadsLocation: Problem: The RBAC decorators ( |
Design Note:
|
Remove db parameter from get_current_user_with_permissions() and update permission decorators to use fresh_db_session() for short-lived permission checks. This prevents database connections from being held during slow downstream operations, avoiding connection pool exhaustion under high load. Changes: - Remove db: Session = Depends(get_db) from get_current_user_with_permissions() - Remove "db" key from user context return value - Update require_permission, require_admin, require_any_permission decorators to use fresh_db_session() for permission checks - Update PermissionChecker class to use fresh_db_session() in each method - Update test fixtures to remove "db" from mock user contexts - Add fresh_db_session mocks to unit tests Closes #2318 Signed-off-by: Mihai Criveti <crivetimihai@gmail.com>
|
0ba41b5 to
63fba73
Compare
|
Closing — this experimental approach needs rethinking. Will revisit if DB session issues resurface. |
…pool exhaustion Replace next(get_db()) with fresh_db_session() context manager in all three database access points within TokenScopingMiddleware. Extract query logic into dedicated helper methods (_query_team_membership and _query_resource_ownership) for cleaner session lifecycle management. Previously each request held 2+ concurrent connections (middleware + endpoint handler), causing QueuePool exhaustion under load. With this fix the middleware connection is returned to the pool before the endpoint handler runs. Applies the same pattern established in PR IBM#2326 and PR IBM#2319. Closes IBM#2330 Signed-off-by: Brad McNew <brad@axite.ai>
Summary
dbparameter fromget_current_user_with_permissions()to prevent holding DB sessions for entire request lifecyclefresh_db_session()for short-lived permission checksProblem
Under high load (4000 concurrent users), the RBAC middleware was holding database sessions for entire request lifetimes, causing:
Changes
mcpgateway/middleware/rbac.pydbfrom function signature/return; usefresh_db_session()in decoratorsmcpgateway/admin.pydbparameter instead ofuser["db"]"db"from mock user contexts; addfresh_db_sessionmocksTest plan
Closes #2318