Don't allow concurrent db actions as they may cause sqlite lockups.

This commit is contained in:
Tim 2015-09-28 14:52:00 +02:00
parent a5ef749bce
commit 138390ff59

View file

@ -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):