From 32cef44179f22ffe5bad966d2abedd8f9f77e55e Mon Sep 17 00:00:00 2001 From: snickerjp Date: Fri, 14 Nov 2025 14:49:13 +0000 Subject: [PATCH 1/4] Add datasource type exclusion from schema refresh - Add SCHEMAS_REFRESH_EXCLUDED_TYPES setting with default 'results,python' - Add type-based exclusion check in refresh_schemas() - Prevents unnecessary errors for datasources without schema support --- redash/settings/__init__.py | 3 +++ redash/tasks/queries/maintenance.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/redash/settings/__init__.py b/redash/settings/__init__.py index b59846844e..d3322dac58 100644 --- a/redash/settings/__init__.py +++ b/redash/settings/__init__.py @@ -51,6 +51,9 @@ SCHEMAS_REFRESH_SCHEDULE = int(os.environ.get("REDASH_SCHEMAS_REFRESH_SCHEDULE", 30)) SCHEMAS_REFRESH_TIMEOUT = int(os.environ.get("REDASH_SCHEMAS_REFRESH_TIMEOUT", 300)) +SCHEMAS_REFRESH_EXCLUDED_TYPES = set_from_string( + os.environ.get("REDASH_SCHEMAS_REFRESH_EXCLUDED_TYPES", "results,python") +) AUTH_TYPE = os.environ.get("REDASH_AUTH_TYPE", "api_key") INVITATION_TOKEN_MAX_AGE = int(os.environ.get("REDASH_INVITATION_TOKEN_MAX_AGE", 60 * 60 * 24 * 7)) diff --git a/redash/tasks/queries/maintenance.py b/redash/tasks/queries/maintenance.py index bca3168c38..5ee6e2e362 100644 --- a/redash/tasks/queries/maintenance.py +++ b/redash/tasks/queries/maintenance.py @@ -205,6 +205,8 @@ def refresh_schemas(): ) elif ds.id in blacklist: logger.info("task=refresh_schema state=skip ds_id=%s reason=blacklist", ds.id) + elif ds.type in settings.SCHEMAS_REFRESH_EXCLUDED_TYPES: + logger.info("task=refresh_schema state=skip ds_id=%s reason=type_excluded", ds.id) elif ds.org.is_disabled: logger.info("task=refresh_schema state=skip ds_id=%s reason=org_disabled", ds.id) else: From 6be5135aea1da8df3fac1789e33a00580e5d38f8 Mon Sep 17 00:00:00 2001 From: snickerjp Date: Fri, 14 Nov 2025 14:52:11 +0000 Subject: [PATCH 2/4] Add test for datasource type exclusion --- tests/tasks/test_refresh_schemas.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/tasks/test_refresh_schemas.py b/tests/tasks/test_refresh_schemas.py index 0b68fbb2c0..382754ae9e 100644 --- a/tests/tasks/test_refresh_schemas.py +++ b/tests/tasks/test_refresh_schemas.py @@ -1,5 +1,6 @@ from mock import patch +from redash import settings from redash.tasks import refresh_schemas from tests import BaseTestCase @@ -23,3 +24,11 @@ def test_skips_paused_data_sources(self): with patch("redash.tasks.queries.maintenance.refresh_schema.delay") as refresh_job: refresh_schemas() refresh_job.assert_called() + + def test_skips_excluded_datasource_types(self): + ds = self.factory.data_source + + with patch.object(settings, "SCHEMAS_REFRESH_EXCLUDED_TYPES", {ds.type}): + with patch("redash.tasks.queries.maintenance.refresh_schema.delay") as refresh_job: + refresh_schemas() + refresh_job.assert_not_called() From b2ef5e7c2a29651d7a1c0d9720c42b680c70c2f5 Mon Sep 17 00:00:00 2001 From: snickerjp Date: Fri, 14 Nov 2025 15:49:51 +0000 Subject: [PATCH 3/4] Fix ruff W293: Remove whitespace from blank line --- tests/tasks/test_refresh_schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tasks/test_refresh_schemas.py b/tests/tasks/test_refresh_schemas.py index 382754ae9e..2386ea703e 100644 --- a/tests/tasks/test_refresh_schemas.py +++ b/tests/tasks/test_refresh_schemas.py @@ -27,7 +27,7 @@ def test_skips_paused_data_sources(self): def test_skips_excluded_datasource_types(self): ds = self.factory.data_source - + with patch.object(settings, "SCHEMAS_REFRESH_EXCLUDED_TYPES", {ds.type}): with patch("redash.tasks.queries.maintenance.refresh_schema.delay") as refresh_job: refresh_schemas() From f17396247b3111920ae7407403dc145c22cddcc2 Mon Sep 17 00:00:00 2001 From: snickerjp Date: Sun, 16 Nov 2025 17:40:07 +0000 Subject: [PATCH 4/4] Change default SCHEMAS_REFRESH_EXCLUDED_TYPES to empty string - Remove hardcoded 'results,python' default - Allow operators to opt-in to exclusion via environment variable - Code makes no assumptions about which types should be excluded --- redash/settings/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/redash/settings/__init__.py b/redash/settings/__init__.py index d3322dac58..aff139f429 100644 --- a/redash/settings/__init__.py +++ b/redash/settings/__init__.py @@ -51,9 +51,7 @@ SCHEMAS_REFRESH_SCHEDULE = int(os.environ.get("REDASH_SCHEMAS_REFRESH_SCHEDULE", 30)) SCHEMAS_REFRESH_TIMEOUT = int(os.environ.get("REDASH_SCHEMAS_REFRESH_TIMEOUT", 300)) -SCHEMAS_REFRESH_EXCLUDED_TYPES = set_from_string( - os.environ.get("REDASH_SCHEMAS_REFRESH_EXCLUDED_TYPES", "results,python") -) +SCHEMAS_REFRESH_EXCLUDED_TYPES = set_from_string(os.environ.get("REDASH_SCHEMAS_REFRESH_EXCLUDED_TYPES", "")) AUTH_TYPE = os.environ.get("REDASH_AUTH_TYPE", "api_key") INVITATION_TOKEN_MAX_AGE = int(os.environ.get("REDASH_INVITATION_TOKEN_MAX_AGE", 60 * 60 * 24 * 7))