force celery to use StrictRedis

Viewed 519

I am all the sudden getting the following error in celery.

  File "/opt/app-root/lib/python3.6/site-packages/celery/canvas.py", line 636, in __call__                                                              
    return self.apply_async((), {'body': body} if body else {}, **options)                                                                              
  File "/opt/app-root/lib/python3.6/site-packages/celery/canvas.py", line 631, in apply_async                                                           
    parent = _chord(self.tasks, body, args, **options)                                                                                                  
  File "/opt/app-root/lib/python3.6/site-packages/celery/app/task.py", line 420, in __call__                                                            
    return self.run(*args, **kwargs)                                                                                                                    
  File "/opt/app-root/lib/python3.6/site-packages/celery/app/builtins.py", line 348, in run                                                             
    max_retries=max_retries, propagate=propagate, result=results,                                                                                       
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/base.py", line 537, in _apply_chord_incr                                              
    self.save_group(group_id, self.app.GroupResult(group_id, result))                                                                                   
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/base.py", line 340, in save_group                                                     
    return self._save_group(group_id, result)                                                                                                           
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/base.py", line 510, in _save_group                                                    
    self.encode({'result': result.as_tuple()}))                                                                                                         
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/redis.py", line 161, in set                                                           
    return self.ensure(self._set, (key, value), **retry_policy)                                                                                         
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/redis.py", line 150, in ensure                                                        
    **retry_policy                                                                                                                                      
  File "/opt/app-root/lib/python3.6/site-packages/kombu/utils/__init__.py", line 246, in retry_over_time                                                
    return fun(*args, **kwargs)                                                                                                                         
  File "/opt/app-root/lib/python3.6/site-packages/celery/backends/redis.py", line 170, in _set                                                          
    pipe.execute()                                                                                                                                      
  File "/opt/app-root/lib/python3.6/site-packages/redis/client.py", line 3443, in execute                                                               
    return execute(conn, stack, raise_on_error)                                                                                                         
  File "/opt/app-root/lib/python3.6/site-packages/redis/client.py", line 3358, in _execute_transaction                                                  
    self.raise_first_error(commands, response)                                                                                                          
  File "/opt/app-root/lib/python3.6/site-packages/redis/client.py", line 3392, in raise_first_error                                                     
    raise r                                                                                                                                             
redis.exceptions.ResponseError: Command # 1 (SETEX b'celery-taskset-meta-20008ab9-37ac-45ae-adce-7085204e0df1' b'\x80\x02}q\x00X\x06\x00\x00\x00resultq\
x01X$\x00\x00\x0020008ab9-37ac-45ae-adce-7085204e0df1q\x02]q\x03(X$\x00\x00\x0041384a3d-b60b-41ce-b39b-10e33815e21eq\x04N\x86q\x05N\x86q\x06X$\x00\x00\x
008182743f-c9fb-48b1-a023-c54dd1431b64q\x07N\x86q\x08N\x86q\tX$\x00\x00\x005fd2949c-2141-4196-8cdd-c16f8a70d1faq\nN\x86q\x0bN\x86q\x0cX$\x00\x00\x00a7aa
bcb6-3784-4a16-b0f4-2ea8b67f2b42q\rN\x86q\x0eN\x86q\x0fX$\x00\x00\x00ee5b8d57-8477-4a84-bb3c-7d52e52dc662q\x10N\x86q\x11N\x86q\x12X$\x00\x00\x00406eda60
-1454-47a9-ba0d-2affa77c62eeq\x13N\x86q\x14N\x86q\x15X$\x00\x00\x00048a5f5f-d2da-4205-99e2-66e91d0f0969q\x16N\x86q\x17N\x86q\x18e\x86q\x19s.' 86400) of 
pipeline caused error: value is not an integer or out of range  

From other posts I have gathered that this is because of strictredis vs redis. I have not been able to find any documentation on how to set celery to use strictredis.

My celery configuration is like this.

import os
from config import debug

if not os.environ.get('REDIS_HOST'):
    REDIS_HOST = '127.0.0.1'
else:
    REDIS_HOST = os.environ.get('REDIS_HOST')
REDIS_PASSWORD = 'foobared' if not os.environ.get('REDIS_PASSWORD') else os.environ.get('REDIS_PASSWORD')

CELERY_ANNOTATIONS = {'tasks.account_lookup': {'rate_limit': '40/m'},
                      'tasks.query': {'rate_limit': '40/m'},
                      'tasks.messages_query': {'rate_limit': '40/m'},
                      'tasks.email': {'rate_limit': '2/s'},
                      'tasks.userpull':{'rate_limit': '1/s'}}
CELERY_TIMEZONE = 'America/Chicago'
CELERY_IMPORTS = ['myapp']
CELERY_BROKER_URL = 'redis://:{0}@{1}:6379/0'.format(REDIS_PASSWORD, REDIS_HOST)
BROKER_URL = 'redis://:{0}@{1}:6379/0'.format(REDIS_PASSWORD, REDIS_HOST)
CELERY_RESULT_BACKEND = 'redis://:{0}@{1}:6379/0'.format(REDIS_PASSWORD, REDIS_HOST)
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
debug = True if os.getenv('CELERY_DEBUG') == 'True' else False
if debug:
    CELERY_ALWAYS_EAGER = True
    CELERY_EAGER_PROPAGATES_EXCEPTIONS = True

I am not sure why this has changed as redis server nor my code has had any changes.

1 Answers

Found out that this is due to the version of redis that pip had installed. Apparently redis==3.0.0.post1 uses (key,expire,value) and redis==2.10.6 uses (key,value,expire). I had neglected to lock my version so when I re-released my code, redis module was updated.

Related