Наша производственная система работает как кластер рабочих Zope, у которых есть сервер ZEO в качестве бэкэнда, что довольно обычно.
Поскольку у нас довольно много данных, наши экземпляры потребляют слишком много памяти, и у нас есть сторожевой таймер, который перезапускает их всякий раз, когда они превышают лимит. Код перезапуска в основном:
bin/supervisorctl reload
Всякий раз, когда это происходит, мы получаем довольно много писем от наших работников с трассировкой стека, например (и это полная трассировка стека):
Couldn't load state for 0x052aec
Traceback (most recent call last):
File "/home/service/.buildout/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 860, in setstate
self._setstate(obj)
File "/home/service/.buildout/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 901, in _setstate
p, serial = self._storage.load(obj._p_oid, '')
AttributeError: 'NoneType' object has no attribute 'load'
Я думал, что это нормально, пока не увидел этот вопрос, в котором указывалось, что это может произойти только с пользователями RelStorage, и мы не используем RelStorage. ...
Любая идея о том, указывает ли это на что-то, или мы можем (как мы уже делаем, хотя это беспокоит меня) просто автоматически помечать эти сообщения от наших работников как прочитанные в нашем почтовом клиенте?
Есть ли более приятный/мягкий способ сказать рабочему Zope о перезапуске? Что-то вроде "завершить запрос, с которым вы работаете, и перезапустить"
bin/zeo fg
иbin/instance fg
, а затем при выполнении запросаCtrl+C
'ing bin/instance также показывает эту трассировку - person gforcada   schedule 07.09.2015