Fix idle in transaction leaks in Open WebUI (#20868)
* fix: add ScopedSession.remove() to prevent idle transaction leaks The HTTP middleware was calling ScopedSession.commit() but not ScopedSession.remove(), causing database connections to remain "checked out" from the pool indefinitely. This resulted in "idle in transaction" connections in PostgreSQL that could persist for 30-50+ minutes. With SQLAlchemy's scoped_session: - commit() commits but keeps the session active - remove() is required to return the connection to the pool This fix adds the missing remove() call, ensuring connections are properly returned after each HTTP request. Also includes IDLE_TRANSACTION_ANALYSIS.md documenting the full root cause analysis and additional recommendations. * Delete IDLE_TRANSACTION_ANALYSIS.md --------- Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1384,7 +1384,13 @@ app.add_middleware(APIKeyRestrictionMiddleware)
|
||||
async def commit_session_after_request(request: Request, call_next):
|
||||
response = await call_next(request)
|
||||
# log.debug("Commit session after request")
|
||||
ScopedSession.commit()
|
||||
try:
|
||||
ScopedSession.commit()
|
||||
finally:
|
||||
# CRITICAL: remove() returns the connection to the pool.
|
||||
# Without this, connections remain "checked out" and accumulate
|
||||
# as "idle in transaction" in PostgreSQL.
|
||||
ScopedSession.remove()
|
||||
return response
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user