Special case sqlite to not use transactions

This commit is contained in:
tcely authored and GitHub committed 2025-04-09 08:25:41 -04:00
1 parent 0ab7a260c2
commit 8a911d0a7c
1 file changed
+20 -13
+20 -13
View File
@@ -16,7 +16,7 @@ from PIL import Image
from django.conf import settings
from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import DatabaseError, IntegrityError
from django.db import connection, DatabaseError, IntegrityError
from django.db.transaction import atomic
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
@@ -200,6 +200,16 @@ def migrate_queues():
return qs.update(queue=Val(TaskQueue.NET))
def save_model(instance):
if 'sqlite' == connection.vendor:
# a transaction here causes too many
# database is locked errors
instance.save()
else:
with atomic():
instance.save()
def schedule_media_servers_update():
with atomic():
# Schedule a task to update media servers
@@ -261,7 +271,7 @@ def index_source_task(source_id):
# Reset any errors
# TODO: determine if this affects anything
source.has_failed = False
source.save()
save_model(source)
# Index the source
videos = source.index_media()
if not videos:
@@ -272,7 +282,7 @@ def index_source_task(source_id):
f'is reachable')
# Got some media, update the last crawl timestamp
source.last_crawl = timezone.now()
source.save()
save_model(source)
num_videos = len(videos)
log.info(f'Found {num_videos} media items for source: {source}')
fields = lambda f, m: m.get_metadata_field(f)
@@ -303,7 +313,7 @@ def index_source_task(source_id):
if published_dt is not None:
media.published = published_dt
try:
media.save()
save_model(media)
except IntegrityError as e:
log.error(f'Index media failed: {source} / {media} with "{e}"')
else:
@@ -477,7 +487,7 @@ def download_media_metadata(media_id):
media.duration = media.metadata_duration
# Don't filter media here, the post_save signal will handle that
media.save()
save_model(media)
log.info(f'Saved {len(media.metadata)} bytes of metadata for: '
f'{source} / {media}: {media_id}')
@@ -606,7 +616,7 @@ def download_media(media_id):
media.downloaded_hdr = cformat['is_hdr']
else:
media.downloaded_format = 'audio'
media.save()
save_model(media)
# If selected, copy the thumbnail over as well
if media.source.copy_thumbnails:
if not media.thumb_file_exists:
@@ -704,8 +714,7 @@ def save_all_media_for_source(source_id):
for mn, media in enumerate(mqs, start=1):
if media.uuid not in saved_later:
update_task_status(task, tvn_format.format(mn))
with atomic():
media.save()
save_model(media)
# Reset task.verbose_name to the saved value
update_task_status(task, None)
@@ -722,8 +731,7 @@ def refesh_formats(media_id):
log.debug(f'Failed to refresh formats for: {media.source} / {media.key}: {e!s}')
pass
else:
with atomic():
media.save()
save_model(media)
@background(schedule=dict(priority=20, run_at=60), queue=Val(TaskQueue.FS), remove_existing_tasks=True)
@@ -780,17 +788,16 @@ def wait_for_media_premiere(media_id):
return
now = timezone.now()
if media.published < now:
# the download tasks start after the media is saved
media.manual_skip = False
media.skip = False
# start the download tasks
media.save()
else:
media.manual_skip = True
media.title = _(f'Premieres in {hours(media.published - now)} hours')
media.save()
task = get_media_premiere_task(media_id)
if task:
update_task_status(task, f'available in {hours(media.published - now)} hours')
save_model(media)
@background(schedule=dict(priority=1, run_at=300), queue=Val(TaskQueue.FS), remove_existing_tasks=False)
def delete_all_media_for_source(source_id, source_name):