From b0dcba46229ae089d3a1ea53c21dffe1de18bcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Redrejo?= Date: Wed, 29 Jun 2022 18:47:30 +0200 Subject: [PATCH 1/3] don't presume redis is the default cache --- kolibri/utils/main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kolibri/utils/main.py b/kolibri/utils/main.py index bb4857a5c98..ff9f0ba662c 100644 --- a/kolibri/utils/main.py +++ b/kolibri/utils/main.py @@ -236,6 +236,10 @@ def _post_django_initialization(): settings.CACHES["process_cache"]["TIMEOUT"], **settings.CACHES["process_cache"]["OPTIONS"] ) + except AttributeError: + # DatabaseCache, no actions needed supposing + # kolibri manage createcachetable has been executed previously + pass def _upgrades_after_django_setup(updated, version): From 4390a5763da9d70311dc5b38f619b21a4fb88091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Redrejo?= Date: Wed, 29 Jun 2022 18:48:11 +0200 Subject: [PATCH 2/3] replace settings.AUTH_USER_MODEL by the real model in Kolibri --- kolibri/core/bookmarks/migrations/0001_initial.py | 4 ++-- kolibri/core/device/migrations/0012_syncqueue.py | 4 ++-- kolibri/core/device/migrations/0013_usersyncstatus.py | 4 ++-- kolibri/core/exams/migrations/0005_individualsyncableexam.py | 4 ++-- .../exams/migrations/0006_nullable_creator_assigned_by.py | 4 ++-- .../core/lessons/migrations/0003_individualsyncablelesson.py | 4 ++-- .../migrations/0004_nullable_created_by_assigned_by.py | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/kolibri/core/bookmarks/migrations/0001_initial.py b/kolibri/core/bookmarks/migrations/0001_initial.py index 6172a5be8bf..bf6e4201618 100644 --- a/kolibri/core/bookmarks/migrations/0001_initial.py +++ b/kolibri/core/bookmarks/migrations/0001_initial.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): dependencies = [ ("kolibriauth", "0019_collection_no_mptt"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + migrations.swappable_dependency("kolibriauth.FacilityUser"), ] operations = [ @@ -57,7 +57,7 @@ class Migration(migrations.Migration): "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ], diff --git a/kolibri/core/device/migrations/0012_syncqueue.py b/kolibri/core/device/migrations/0012_syncqueue.py index 2b5b580ef9d..f8db062edfc 100644 --- a/kolibri/core/device/migrations/0012_syncqueue.py +++ b/kolibri/core/device/migrations/0012_syncqueue.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + migrations.swappable_dependency("kolibriauth.FacilityUser"), ("device", "0011_devicesettings_subset_of_users_device"), ] @@ -36,7 +36,7 @@ class Migration(migrations.Migration): "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ], diff --git a/kolibri/core/device/migrations/0013_usersyncstatus.py b/kolibri/core/device/migrations/0013_usersyncstatus.py index 0c2354f5e1d..40dcd9c2b29 100644 --- a/kolibri/core/device/migrations/0013_usersyncstatus.py +++ b/kolibri/core/device/migrations/0013_usersyncstatus.py @@ -12,7 +12,7 @@ class Migration(migrations.Migration): dependencies = [ ("morango", "0016_store_deserialization_error"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + migrations.swappable_dependency("kolibriauth.FacilityUser"), ("device", "0012_syncqueue"), ] @@ -43,7 +43,7 @@ class Migration(migrations.Migration): "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ], diff --git a/kolibri/core/exams/migrations/0005_individualsyncableexam.py b/kolibri/core/exams/migrations/0005_individualsyncableexam.py index e3d2cb15148..8c0c3b2d57d 100644 --- a/kolibri/core/exams/migrations/0005_individualsyncableexam.py +++ b/kolibri/core/exams/migrations/0005_individualsyncableexam.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): dependencies = [ ("kolibriauth", "0019_collection_no_mptt"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + migrations.swappable_dependency("kolibriauth.FacilityUser"), ("exams", "0004_exam_add_dates_opened_created_and_archived"), ] @@ -58,7 +58,7 @@ class Migration(migrations.Migration): "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ], diff --git a/kolibri/core/exams/migrations/0006_nullable_creator_assigned_by.py b/kolibri/core/exams/migrations/0006_nullable_creator_assigned_by.py index a13f43993e4..30815beb96a 100644 --- a/kolibri/core/exams/migrations/0006_nullable_creator_assigned_by.py +++ b/kolibri/core/exams/migrations/0006_nullable_creator_assigned_by.py @@ -22,7 +22,7 @@ class Migration(migrations.Migration): null=True, on_delete=django.db.models.deletion.CASCADE, related_name="exams", - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), migrations.AlterField( @@ -32,7 +32,7 @@ class Migration(migrations.Migration): null=True, on_delete=django.db.models.deletion.CASCADE, related_name="assigned_exams", - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ] diff --git a/kolibri/core/lessons/migrations/0003_individualsyncablelesson.py b/kolibri/core/lessons/migrations/0003_individualsyncablelesson.py index e41fd1058b3..8816d38b7a4 100644 --- a/kolibri/core/lessons/migrations/0003_individualsyncablelesson.py +++ b/kolibri/core/lessons/migrations/0003_individualsyncablelesson.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): dependencies = [ ("kolibriauth", "0019_collection_no_mptt"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + migrations.swappable_dependency("kolibriauth.FacilityUser"), ("lessons", "0002_auto_20180221_1115"), ] @@ -58,7 +58,7 @@ class Migration(migrations.Migration): "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ], diff --git a/kolibri/core/lessons/migrations/0004_nullable_created_by_assigned_by.py b/kolibri/core/lessons/migrations/0004_nullable_created_by_assigned_by.py index 7f3e704c803..06a2aa8f6b0 100644 --- a/kolibri/core/lessons/migrations/0004_nullable_created_by_assigned_by.py +++ b/kolibri/core/lessons/migrations/0004_nullable_created_by_assigned_by.py @@ -22,7 +22,7 @@ class Migration(migrations.Migration): null=True, on_delete=django.db.models.deletion.CASCADE, related_name="lessons_created", - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), migrations.AlterField( @@ -32,7 +32,7 @@ class Migration(migrations.Migration): null=True, on_delete=django.db.models.deletion.CASCADE, related_name="assigned_lessons", - to=settings.AUTH_USER_MODEL, + to="kolibriauth.FacilityUser", ), ), ] From cf67b537ab136f2688a1a7c0399daed61b8a6da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Redrejo?= Date: Tue, 5 Jul 2022 11:25:33 +0200 Subject: [PATCH 3/3] Applying feedback from PR review --- .../device/migrations/0003_contentcachekey.py | 13 +++++++- kolibri/utils/main.py | 30 +++++++++---------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/kolibri/core/device/migrations/0003_contentcachekey.py b/kolibri/core/device/migrations/0003_contentcachekey.py index 4ef603838a6..02cb61f1250 100644 --- a/kolibri/core/device/migrations/0003_contentcachekey.py +++ b/kolibri/core/device/migrations/0003_contentcachekey.py @@ -2,21 +2,32 @@ # Generated by Django 1.11.10 on 2018-09-05 17:20 from __future__ import unicode_literals +import sqlite3 import time from django.db import migrations from django.db import models +from django.db import transaction +from django.db.utils import OperationalError +from django.db.utils import ProgrammingError def create_content_cache_key(apps, schema_editor): from kolibri.core.device.models import ContentCacheKey - ContentCacheKey.update_cache_key() + try: + with transaction.atomic(): + ContentCacheKey.update_cache_key() + except (OperationalError, ProgrammingError, sqlite3.OperationalError): + # let's not run this on a database cache + # that might not have been created yet + pass class Migration(migrations.Migration): dependencies = [("device", "0002_devicesettings_default_facility")] + atomic = False operations = [ migrations.CreateModel( diff --git a/kolibri/utils/main.py b/kolibri/utils/main.py index ff9f0ba662c..3078b6bb41e 100644 --- a/kolibri/utils/main.py +++ b/kolibri/utils/main.py @@ -25,6 +25,7 @@ from kolibri.core.upgrade import matches_version from kolibri.core.upgrade import run_upgrades from kolibri.core.utils.cache import process_cache +from kolibri.deployment.default.cache import CACHES from kolibri.deployment.default.sqlite_db_names import ADDITIONAL_SQLITE_DATABASES from kolibri.plugins.utils import autoremove_unavailable_plugins from kolibri.plugins.utils import check_plugin_config_file_location @@ -224,22 +225,19 @@ def _upgrades_before_django_setup(updated, version): def _post_django_initialization(): - if OPTIONS["Cache"]["CACHE_BACKEND"] != "redis": - try: - process_cache.cull() - except SQLite3DatabaseError: - shutil.rmtree(process_cache.directory, ignore_errors=True) - os.mkdir(process_cache.directory) - process_cache._cache = FanoutCache( - process_cache.directory, - settings.CACHES["process_cache"]["SHARDS"], - settings.CACHES["process_cache"]["TIMEOUT"], - **settings.CACHES["process_cache"]["OPTIONS"] - ) - except AttributeError: - # DatabaseCache, no actions needed supposing - # kolibri manage createcachetable has been executed previously - pass + if "process_cache" in CACHES: # usually it means not using redis + if "DatabaseCache" not in CACHES["process_cache"]["BACKEND"]: + try: + process_cache.cull() + except SQLite3DatabaseError: + shutil.rmtree(process_cache.directory, ignore_errors=True) + os.mkdir(process_cache.directory) + process_cache._cache = FanoutCache( + process_cache.directory, + settings.CACHES["process_cache"]["SHARDS"], + settings.CACHES["process_cache"]["TIMEOUT"], + **settings.CACHES["process_cache"]["OPTIONS"] + ) def _upgrades_after_django_setup(updated, version):