redis.exceptions.LockError: Невозможно снять разблокированную блокировку после перезапуска сельдерея - PullRequest
0 голосов
/ 11 сентября 2018

иногда после перезапуска celerybeat я получаю следующую ошибку, я настроил celerybeat как службу с redis,

sude service celerybeat restart

Ниже приведена трассировка исключения

Traceback (most recent call last):
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 484, in start
    time.sleep(interval)
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/apps/beat.py", line 148, in _sync
    beat.sync()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 493, in sync
    self.scheduler.close()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redbeat/schedulers.py", line 272, in close
    self.lock.release()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 135, in release
    self.do_release(expected_token)
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 264, in do_release
    raise LockError("Cannot release a lock that's no longer owned")
redis.exceptions.LockError: Cannot release a lock that's no longer owned

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/apps/beat.py", line 112, in start_scheduler
    beat.start()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 490, in start
    self.sync()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 493, in sync
    self.scheduler.close()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redbeat/schedulers.py", line 272, in close
    self.lock.release()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 133, in release
    raise LockError("Cannot release an unlocked lock")
redis.exceptions.LockError: Cannot release an unlocked lock

Исключение не происходит каждый раз, и я не заметил каких-либо проблем, вызванных этим, celerybeat отлично работает даже после этого исключения. Поскольку это производственная среда, я хочу безопасно с ней справиться.

1 Ответ

0 голосов
/ 15 октября 2018

Я заметил то же самое в моих журналах, потому что причина в том, что тайм-аут redis был короче, чем задача, поэтому он попытался снять блокировку после истечения срока ее действия, например:

with redis_client.lock('some_key', timeout=5):
    time.sleep(10)

redis.exceptions.LockError: Невозможно снять блокировку, которой больше не принадлежит

...