Skip to content

Commit 2c36dd1

Browse files
committed
update
1 parent e0f1ca9 commit 2c36dd1

File tree

2 files changed

+31
-20
lines changed

2 files changed

+31
-20
lines changed

backend/onyx/background/celery/tasks/doc_permission_syncing/tasks.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from redis import Redis
1616
from redis.exceptions import LockError
1717
from redis.lock import Lock as RedisLock
18-
from sqlalchemy.exc import IntegrityError
1918
from sqlalchemy.orm import Session
2019

2120
from ee.onyx.db.connector_credential_pair import get_all_auto_sync_cc_pairs
@@ -463,20 +462,11 @@ def update_external_document_permissions_task(
463462

464463
try:
465464
with get_session_with_tenant(tenant_id) as db_session:
466-
try:
467-
# Add the users to the DB if they don't exist
468-
batch_add_ext_perm_user_if_not_exists(
469-
db_session=db_session,
470-
emails=list(external_access.external_user_emails),
471-
)
472-
except IntegrityError:
473-
db_session.rollback()
474-
task_logger.error(
475-
"IntegrityError (likely 'UniqueViolation') occurred while adding users. "
476-
f"Emails: {list(external_access.external_user_emails)}. Retrying once."
477-
)
478-
return False
479-
465+
batch_add_ext_perm_user_if_not_exists(
466+
db_session=db_session,
467+
emails=list(external_access.external_user_emails),
468+
continue_on_error=True,
469+
)
480470
# Then upsert the document's external permissions
481471
created_new_doc = upsert_document_external_perms(
482472
db_session=db_session,

backend/onyx/db/users.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from fastapi_users.password import PasswordHelper
77
from sqlalchemy import func
88
from sqlalchemy import select
9+
from sqlalchemy.exc import IntegrityError
910
from sqlalchemy.orm import Session
1011
from sqlalchemy.sql import expression
1112
from sqlalchemy.sql.elements import ColumnElement
@@ -20,8 +21,11 @@
2021
from onyx.db.models import SamlAccount
2122
from onyx.db.models import User
2223
from onyx.db.models import User__UserGroup
24+
from onyx.setup import setup_logger
2325
from onyx.utils.variable_functionality import fetch_ee_implementation_or_noop
2426

27+
logger = setup_logger()
28+
2529

2630
def validate_user_role_update(requested_role: UserRole, current_role: UserRole) -> None:
2731
"""
@@ -274,7 +278,7 @@ def _generate_ext_permissioned_user(email: str) -> User:
274278

275279

276280
def batch_add_ext_perm_user_if_not_exists(
277-
db_session: Session, emails: list[str]
281+
db_session: Session, emails: list[str], continue_on_error: bool = False
278282
) -> list[User]:
279283
lower_emails = [email.lower() for email in emails]
280284
found_users, missing_lower_emails = _get_users_by_emails(db_session, lower_emails)
@@ -283,10 +287,27 @@ def batch_add_ext_perm_user_if_not_exists(
283287
for email in missing_lower_emails:
284288
new_users.append(_generate_ext_permissioned_user(email=email))
285289

286-
db_session.add_all(new_users)
287-
db_session.commit()
288-
289-
return found_users + new_users
290+
try:
291+
db_session.add_all(new_users)
292+
db_session.commit()
293+
except IntegrityError:
294+
db_session.rollback()
295+
logger.warning(
296+
"IntegrityError occurred during batch insert. Falling back to individual inserts."
297+
)
298+
if not continue_on_error:
299+
raise
300+
for user in new_users:
301+
try:
302+
db_session.add(user)
303+
db_session.commit()
304+
except IntegrityError:
305+
db_session.rollback()
306+
logger.warning(f"Skipping duplicate user: {user.email}")
307+
continue
308+
# Fetch all users again to ensure we have the most up-to-date list
309+
all_users, _ = _get_users_by_emails(db_session, lower_emails)
310+
return all_users
290311

291312

292313
def delete_user_from_db(

0 commit comments

Comments
 (0)