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,22 +61,28 @@ 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
with db_lock:
sql_result = None sql_result = None
attempts = 0
while attempts < 5:
try: try:
with self.connection as c: with self.connection as c:
if args is None: if args is None:
sql_result = c.execute(query) sql_result = c.execute(query)
else: else:
sql_result = c.execute(query, args) 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)
attempts += 1
time.sleep(1)
else: else:
logger.error('Database error: %s', e) logger.error('Database error: %s', e)
raise raise