From e6e20d166978aa9b472a494f13d6a728273f103f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alban=20F=C3=A9ron?= Date: Sat, 11 Sep 2021 16:21:04 +0200 Subject: [PATCH] Work around race when creating ClientPrefs Closes #220 --- supysonic/api/__init__.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/supysonic/api/__init__.py b/supysonic/api/__init__.py index bbc0998..3794c26 100644 --- a/supysonic/api/__init__.py +++ b/supysonic/api/__init__.py @@ -11,7 +11,7 @@ import binascii import uuid from flask import request from flask import Blueprint -from pony.orm import ObjectNotFound +from pony.orm import ObjectNotFound, TransactionIntegrityError from pony.orm import commit from ..db import ClientPrefs, Folder @@ -83,8 +83,15 @@ def get_client_prefs(): try: request.client = ClientPrefs[request.user, client] except ObjectNotFound: - request.client = ClientPrefs(user=request.user, client_name=client) - commit() + try: + request.client = ClientPrefs(user=request.user, client_name=client) + commit() + except TransactionIntegrityError: + # We might have hit a race condition here, another request already created + # the ClientPrefs. Issue #220 + # Reload the user or Pony will complain about different transactions + request.user = UserManager.get(request.user.id) + request.client = ClientPrefs[request.user, client] def get_entity(cls, param="id"):