mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-11 15:56:07 -07:00
Don't allow concurrent db actions as they may cause sqlite lockups.
This commit is contained in:
parent
a5ef749bce
commit
138390ff59
1 changed files with 28 additions and 19 deletions
|
@ -18,7 +18,10 @@ from plexpy import logger
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import os
|
import os
|
||||||
import plexpy
|
import plexpy
|
||||||
|
import time
|
||||||
|
import threading
|
||||||
|
|
||||||
|
db_lock = threading.Lock()
|
||||||
|
|
||||||
def drop_session_db():
|
def drop_session_db():
|
||||||
monitor_db = MonitorDatabase()
|
monitor_db = MonitorDatabase()
|
||||||
|
@ -58,31 +61,37 @@ class MonitorDatabase(object):
|
||||||
self.connection.row_factory = sqlite3.Row
|
self.connection.row_factory = sqlite3.Row
|
||||||
|
|
||||||
def action(self, query, args=None, return_last_id=False):
|
def action(self, query, args=None, return_last_id=False):
|
||||||
|
|
||||||
if query is None:
|
if query is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
sql_result = None
|
with db_lock:
|
||||||
|
sql_result = None
|
||||||
|
attempts = 0
|
||||||
|
|
||||||
try:
|
while attempts < 5:
|
||||||
with self.connection as c:
|
try:
|
||||||
if args is None:
|
with self.connection as c:
|
||||||
sql_result = c.execute(query)
|
if args is None:
|
||||||
else:
|
sql_result = c.execute(query)
|
||||||
sql_result = c.execute(query, args)
|
else:
|
||||||
|
sql_result = c.execute(query, args)
|
||||||
|
# Our transaction was successful, leave the loop
|
||||||
|
break
|
||||||
|
|
||||||
except sqlite3.OperationalError, e:
|
except sqlite3.OperationalError, e:
|
||||||
if "unable to open database file" in e.message or "database is locked" in e.message:
|
if "unable to open database file" in e.message or "database is locked" in e.message:
|
||||||
logger.warn('Database Error: %s', e)
|
logger.warn('Database Error: %s', e)
|
||||||
else:
|
attempts += 1
|
||||||
logger.error('Database error: %s', e)
|
time.sleep(1)
|
||||||
raise
|
else:
|
||||||
|
logger.error('Database error: %s', e)
|
||||||
|
raise
|
||||||
|
|
||||||
except sqlite3.DatabaseError, e:
|
except sqlite3.DatabaseError, e:
|
||||||
logger.error('Fatal Error executing %s :: %s', query, e)
|
logger.error('Fatal Error executing %s :: %s', query, e)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
return sql_result
|
return sql_result
|
||||||
|
|
||||||
def select(self, query, args=None):
|
def select(self, query, args=None):
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue