From f798ddd4922d793d5e6ccb7c4111810d549ff4f4 Mon Sep 17 00:00:00 2001 From: Gaspard d'Hautefeuille Date: Wed, 9 Jul 2025 07:55:37 +0200 Subject: [mod] migrate from Redis to Valkey (#4795) This patch migrates from `redis==5.2.1` [1] to `valkey==6.1.0` [2]. The migration to valkey is necessary because the company behind Redis has decided to abandon the open source license. After experiencing a drop in user numbers, they now want to run it under a dual license again. But this move demonstrates once again how unreliable the company is and how it treats open source developers. To review first, read the docs:: $ make docs.live Follow the instructions to remove redis: - http://0.0.0.0:8000/admin/settings/settings_redis.html Config and install a local valkey DB: - http://0.0.0.0:8000/admin/settings/settings_valkey.html [1] https://pypi.org/project/redis/ [2] https://pypi.org/project/valkey/ Co-authored-by: HLFH Co-authored-by: Markus Heiser --- searx/search/checker/background.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'searx/search/checker/background.py') diff --git a/searx/search/checker/background.py b/searx/search/checker/background.py index 7333e6ad0..1890c77d5 100644 --- a/searx/search/checker/background.py +++ b/searx/search/checker/background.py @@ -8,18 +8,18 @@ import os import signal from typing import Any, Dict, List, Literal, Optional, Tuple, TypedDict, Union -import redis.exceptions +import valkey.exceptions from searx import logger, settings, sxng_debug -from searx.redisdb import client as get_redis_client +from searx.valkeydb import client as get_valkey_client from searx.exceptions import SearxSettingsException from searx.search.processors import PROCESSORS from searx.search.checker import Checker from searx.search.checker.scheduler import scheduler_function -REDIS_RESULT_KEY = 'SearXNG_checker_result' -REDIS_LOCK_KEY = 'SearXNG_checker_lock' +VALKEY_RESULT_KEY = 'SearXNG_checker_result' +VALKEY_LOCK_KEY = 'SearXNG_checker_lock' CheckerResult = Union['CheckerOk', 'CheckerErr', 'CheckerOther'] @@ -77,23 +77,23 @@ def _get_interval(every: Any, error_msg: str) -> Tuple[int, int]: def get_result() -> CheckerResult: - client = get_redis_client() + client = get_valkey_client() if client is None: - # without Redis, the checker is disabled + # without Valkey, the checker is disabled return {'status': 'disabled'} - serialized_result: Optional[bytes] = client.get(REDIS_RESULT_KEY) + serialized_result: Optional[bytes] = client.get(VALKEY_RESULT_KEY) if serialized_result is None: - # the Redis key does not exist + # the Valkey key does not exist return {'status': 'unknown'} return json.loads(serialized_result) def _set_result(result: CheckerResult): - client = get_redis_client() + client = get_valkey_client() if client is None: - # without Redis, the function does nothing + # without Valkey, the function does nothing return - client.set(REDIS_RESULT_KEY, json.dumps(result)) + client.set(VALKEY_RESULT_KEY, json.dumps(result)) def _timestamp(): @@ -102,9 +102,9 @@ def _timestamp(): def run(): try: - # use a Redis lock to make sure there is no checker running at the same time + # use a Valkey lock to make sure there is no checker running at the same time # (this should not happen, this is a safety measure) - with get_redis_client().lock(REDIS_LOCK_KEY, blocking_timeout=60, timeout=3600): + with get_valkey_client().lock(VALKEY_LOCK_KEY, blocking_timeout=60, timeout=3600): logger.info('Starting checker') result: CheckerOk = {'status': 'ok', 'engines': {}, 'timestamp': _timestamp()} for name, processor in PROCESSORS.items(): @@ -118,7 +118,7 @@ def run(): _set_result(result) logger.info('Check done') - except redis.exceptions.LockError: + except valkey.exceptions.LockError: _set_result({'status': 'error', 'timestamp': _timestamp()}) logger.exception('Error while running the checker') except Exception: # pylint: disable=broad-except @@ -149,9 +149,9 @@ def initialize(): logger.info('Checker scheduler is disabled') return - # make sure there is a Redis connection - if get_redis_client() is None: - logger.error('The checker requires Redis') + # make sure there is a Valkey connection + if get_valkey_client() is None: + logger.error('The checker requires Valkey') return # start the background scheduler -- cgit v1.2.3