Zope ZODB Pack ошибка - PullRequest
       19

Zope ZODB Pack ошибка

0 голосов
/ 28 февраля 2011

При попытке упаковать ZODB моего экземпляра zope я получаю эту ошибку:

2011-02-28 10:47:21 ERROR ZODB.DB packing
Traceback (most recent call last):
  File "/usr/local/www/cstools/parts/zope2/lib/python/ZODB/DB.py", line 618, in pack
    self._storage.pack(t, referencesf)
  File "/usr/local/www/cstools/parts/zope2/lib/python/ZEO/ClientStorage.py", line 865, in pack
    return self._server.pack(t, wait)
  File "/usr/local/www/cstools/parts/zope2/lib/python/ZEO/ServerStub.py", line 161, in pack
    self.rpc.call('pack', t, wait)
  File "/usr/local/www/cstools/parts/zope2/lib/python/ZEO/zrpc/connection.py", line 539, in call
    raise inst # error raised by server
AttributeError: 'NoneType' object has no attribute 'append'
2011-02-28 10:47:21 ERROR Zope.SiteErrorLog https://conservationtoolstest.tnc.org:54321/Control_Panel/Database/main/manage_pack
Traceback (innermost last):
  Module ZPublisher.Publish, line 115, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 41, in call_object
  Module <string>, line 3, in _facade
  Module AccessControl.requestmethod, line 64, in _curried
  Module App.ApplicationManager, line 430, in manage_pack
  Module ZODB.DB, line 618, in pack
  Module ZEO.ClientStorage, line 865, in pack
  Module ZEO.ServerStub, line 161, in pack
  Module ZEO.zrpc.connection, line 539, in call
AttributeError: 'NoneType' object has no attribute 'append'

Передано методу вызова:

call(self, method, *args)

self:  <ManagedClientConnection ('<IP REMOVED>', 8100)>
method:  pack
args: (1298908370.5440209, 1)

Из журнала zeoserver.log:

(11117) Error raised in delayed method
Traceback (most recent call last):
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZEO/StorageServer.py", line 1247, in run
    result = self._method(*self._args)
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZEO/StorageServer.py", line 416, in _pack_impl
    self.storage.pack(time, referencesf)
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/FileStorage/FileStorage.py", line 1247, in pack
    opos = p.pack()
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/FileStorage/fspack.py", line 481, in pack
    self.gc.findReachable()
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/FileStorage/fspack.py", line 227, in findReachable
    self.findReachableAtPacktime([z64])
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/FileStorage/fspack.py", line 303, in findReachableAtPacktime
    todo.extend(self.findrefs(pos))
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/FileStorage/fspack.py", line 376, in findrefs
    return referencesf(self._file.read(dh.plen))
  File "/usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/serialize.py", line 622, in referencesf
    u.noload()
AttributeError: 'NoneType' object has no attribute 'append'

И, наконец, вот привязанные версии:

buildout.dumppickedversions=0.4
elementtree=1.2.6-20050316
hexagonit.recipe.cmmi=1.1.1
hexagonit.recipe.download=1.2.1
html5lib=0.11.1
infrae.subversion=1.1
ipython=0.8.4
lxml=2.1.5
MySQL-python=1.2.2
PILwoTk = 1.1.6.4
plone.recipe.command=1.0
plone.recipe.distros=1.3
plone.recipe.zope2install=2.2
plone.recipe.zope2instance=2.3.1
plone.recipe.zope2zeoserver=0.13
py=0.9.0
python-ldap=2.3.4
pisa=3.0.32
reportlab=2.4
SessionCrumbler=0.2
setuptools = 0.6c11
simplejson=2.0.9
topp.helpers=1.0
zc.buildout=1.1.1
z3c.recipe.staticlxml=0.7.1
zc.recipe.egg=1.1.0
zc.recipe.cmmi=1.1.5
ZODB3=3.8.1
ZConfig=2.6.1
zdaemon=2.0.2
zest.recipe.mysql=0.7
zlib=1.2.4
zope.interface=3.4.1
zope.proxy=3.4.0
zope.testing=3.5.1

Может кто-нибудь помочь мне понять, почему это происходит?

Спасибо! :)

1 Ответ

1 голос
/ 28 февраля 2011

Примечание: это пересмотренный ответ после того, как вопрос был обновлен с отслеживанием и информацией о версии

Ваш пакет завершается сбоем во время сбора мусора из-за поврежденного рассола в базе данных ZODB.Вы можете убедиться в этом, запустив скрипт fsrefs.py на вашем Data.fs.Если у вас есть zopepy или аналогичная часть в вашей сборке (скрипт, который просто запускает аргументы в виде скрипта Python с расширением sys.path со всеми вашими яйцами), вы можете сделать это:

bin/zopepy /usr/local/www/cstools/buildout-cache/eggs/ZODB3-3.8.1-py2.4-linux-i686.egg/ZODB/scripts/fsrefs.py var/filestorage/Data.fs

Это полный путь к скрипту fsrefs.py.Это только подтвердит, если есть ошибка рассола.Скорее всего, это проблема старой транзакции, которая вас больше не волнует, и вы можете исправить эту проблему, отредактировав модуль serialize.py, чтобы игнорировать эту конкретную ошибку рассола.Вы найдете путь к нему в конце вашей трассировки.

Отредактируйте функцию referencesf (строка 608 и далее), чтобы перехватить рассматриваемое исключение.Первоначально верх этой функции выглядит следующим образом:

refs = []
u = cPickle.Unpickler(cStringIO.StringIO(p))
u.persistent_load = refs
u.noload()
u.noload()

Измените его на:

refs = []
u = cPickle.Unpickler(cStringIO.StringIO(p))
u.persistent_load = refs
u.noload()
try:
    u.noload()
except AttributeError:
    print "Ignoring AttributeError during garbage collection unpickling."
    pass

Риск состоит в том, что алгоритм сбора мусора не обнаружит набор объектов, которые все ещеиспользуется и, следовательно, слишком много, но этот риск уменьшается с возрастом транзакции.Риск кажется минимальным, после того, как весь этот рассол уже сломан, и любой код приложения не сможет достичь любого объекта, на который есть ссылка в любом случае.

...