From 3f610048647da1b40aa2be0fa0d1ed9774acb3f4 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Thu, 4 Jun 2026 19:37:32 +0000 Subject: [PATCH] fix(mcp): compute per-user env var lock key without hashtextextended pg_advisory_xact_lock keyed via hashtextextended requires PostgreSQL 11+; older clusters fail on every merge_user_env_vars call. Derive a stable 64-bit signed key from (user_id, server_id) with blake2b in Python and pass it straight to pg_advisory_xact_lock, so the lock works on every supported PostgreSQL version and no longer depends on an internal hash function --- litellm/proxy/_experimental/mcp_server/db.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/db.py b/litellm/proxy/_experimental/mcp_server/db.py index 4aaf899d6ae..c7ee56e37e6 100644 --- a/litellm/proxy/_experimental/mcp_server/db.py +++ b/litellm/proxy/_experimental/mcp_server/db.py @@ -1,5 +1,6 @@ import base64 import binascii +import hashlib import json from datetime import datetime, timedelta, timezone from typing import Any, Dict, Iterable, List, Optional, Set, Union, cast @@ -1272,11 +1273,13 @@ async def merge_user_env_vars( so an admin retiring a user-scoped variable also clears its stored value. """ allowed = set(allowed_names) + lock_key = int.from_bytes( + hashlib.blake2b(f"{user_id}:{server_id}".encode(), digest_size=8).digest(), + "big", + signed=True, + ) async with prisma_client.db.tx() as tx: - await tx.query_raw( - "SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", - f"{user_id}:{server_id}", - ) + await tx.query_raw("SELECT pg_advisory_xact_lock($1::bigint)", lock_key) row = await tx.litellm_mcpuserenvvars.find_unique( where={"user_id_server_id": {"user_id": user_id, "server_id": server_id}} )