Opened 3 years ago
Closed 3 years ago
#34212 closed Bug (fixed)
Redis cache client uses a read connection for incr operation
| Reported by: | Ilari Sahi | Owned by: | Leo Tom |
|---|---|---|---|
| Component: | Core (Cache system) | Version: | 4.1 |
| Severity: | Normal | Keywords: | redis cache incr |
| Cc: | Daniyal Abbasi, Nick Pope | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | yes | UI/UX: | no |
Description
RedisCacheClient uses a read only connection for the incr operation:
https://github.com/django/django/blob/main/django/core/cache/backends/redis.py#L133
However, it is a write operation, at least according to Amazon ElastiCache Redis server. redis-py raises a ReadOnlyError exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 46, in _wrapper
return bound_method(*args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/ratelimit/decorators.py", line 18, in _wrapped
ratelimited = is_ratelimited(request=request, group=group, fn=fn,
File "/usr/local/lib/python3.10/site-packages/ratelimit/core.py", line 119, in is_ratelimited
usage = get_usage(request, group, fn, key, rate, method, increment)
File "/usr/local/lib/python3.10/site-packages/ratelimit/core.py", line 205, in get_usage
count = cache.incr(cache_key)
File "/usr/local/lib/python3.10/site-packages/django/core/cache/backends/redis.py", line 214, in incr
return self._cache.incr(key, delta)
File "/usr/local/lib/python3.10/site-packages/django/core/cache/backends/redis.py", line 136, in incr
return client.incr(key, delta)
File "/usr/local/lib/python3.10/site-packages/redis/commands/core.py", line 1852, in incrby
return self.execute_command("INCRBY", name, amount)
File "/usr/local/lib/python3.10/site-packages/redis/client.py", line 1258, in execute_command
return conn.retry.call_with_retry(
File "/usr/local/lib/python3.10/site-packages/redis/retry.py", line 46, in call_with_retry
return do()
File "/usr/local/lib/python3.10/site-packages/redis/client.py", line 1259, in <lambda>
lambda: self._send_command_parse_response(
File "/usr/local/lib/python3.10/site-packages/redis/client.py", line 1235, in _send_command_parse_response
return self.parse_response(conn, command_name, **options)
File "/usr/local/lib/python3.10/site-packages/redis/client.py", line 1275, in parse_response
response = connection.read_response()
File "/usr/local/lib/python3.10/site-packages/redis/connection.py", line 827, in read_response
raise response
Exception Type: ReadOnlyError at ...
Exception Value: You can't write against a read only replica.
In incr-function, get_client should be called with write argument as True.
Change History (6)
comment:1 by , 3 years ago
| Cc: | added |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:2 by , 3 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 3 years ago
| Needs tests: | set |
|---|
comment:5 by , 3 years ago
| Needs tests: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Note:
See TracTickets
for help on using tickets.
Good catch!