Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CacheBackend: Redis Exceptions are not catched #341

Closed
Flauschbaellchen opened this issue Dec 12, 2022 · 4 comments · Fixed by #340
Closed

CacheBackend: Redis Exceptions are not catched #341

Flauschbaellchen opened this issue Dec 12, 2022 · 4 comments · Fixed by #340

Comments

@Flauschbaellchen
Copy link
Contributor

While using the cache backend health check, I've found that the check itself sometimes raises exceptions which are not catched.

from health_check.cache.backends import CacheBackend
health_cache.run_check()
if not health_cache.status:
  # do something

If the redis server itself was not initialized or not reachable, it resulted in the following exception:

File "/usr/local/lib/python3.10/site-packages/health_check/backends.py", line 30, in run_check
  self.check_status()
File "/usr/local/lib/python3.10/site-packages/health_check/cache/backends.py", line 19, in check_status
  cache.set("djangohealtcheck_test", "itworks")
File "/usr/local/lib/python3.10/site-packages/django_redis/cache.py", line 38, in _decorator
  raise e.__cause__
File "/usr/local/lib/python3.10/site-packages/django_redis/client/default.py", line 175, in set
  return bool(client.set(nkey, nvalue, nx=nx, px=timeout, xx=xx))
File "/usr/local/lib/python3.10/site-packages/redis/commands/core.py", line 2220, in set
  return self.execute_command("SET", *pieces, **options)
File "/usr/local/lib/python3.10/site-packages/redis/client.py", line 1235, in execute_command
  conn = self.connection or pool.get_connection(command_name, **options)
File "/usr/local/lib/python3.10/site-packages/redis/connection.py", line 1387, in get_connection
  connection.connect()
File "/usr/local/lib/python3.10/site-packages/redis/connection.py", line 617, in connect
  raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 111 connecting to redis:6379. Connection refused.

This is because redis.exceptions.ConnectionError does not subclasses builtin ConnectionError which would be catched within the health-check:
https://github.com/redis/redis-py/blob/master/redis/exceptions.py

The health-check should be extended to catch this kind of errors.

Pull-Request: #340

@Flauschbaellchen
Copy link
Contributor Author

@jefftriplett @frankwiles Sorry to bump this issue 🙇 , but could you take a look at it and the referenced PR?

@Flauschbaellchen
Copy link
Contributor Author

Flauschbaellchen commented Jan 30, 2023

Oww, I just saw that @violuke mentioned it in his own issue #354. The already existing (and closed as wont-fix) issue #240 somehow slipped by search.
However, not catching this error results in an error which is further raised to the top.

This might be not a problem (even if not a really "nice" solution) when used in live/ready/startup probes of K8s - but in my case I also use it in some other parts of the main application to check if certain actions can take place (background migrations etc).
Not catching this error would result in a broken application.

I would expect that the health-check would gracefully handle this, as this exception is a sign of "backend not working".
A health-check which itself raises an exception is not really useful.

Thus, I would like to start the discussion again, if the RedisError could be catched.
I've proposed my solution in the referenced PR, maybe this also resolved the discussion about "what to do if Redis is not used"? - because the PR would handle this case gracefully, too.

@jefftriplett
Copy link
Member

I'll see if I can carve out some time this week. I'm new to the project and trying not to overstep. I think it might be helpful to stage a test so we can address as many concerns as possible. This should be doable with redis.

@abedimhosein
Copy link

I have same problem with Redis CacheBackend
redis raise redis.exceptions.ConnectionError, but django-health-check catches default python ConnectionError.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants