2014-01-22 95 views
0

当我启动一个Zope实例时,在我的日志文件中出现一个奇怪的错误。该实例正在运行ZEO服务器,并且Zope安装是virtualenv(在/ home/myUser/opt中)。我得到了几个产品的错误,但Zope工作正常,并且安装了这些产品。下面是与产品BTreeFolder2一个例子:Zope:奇怪的“无法安装”错误

2014-01-22T12:38:13 ERROR Application Couldn't install BTreeFolder2 
Traceback (most recent call last): 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/Zope2-2.13.21-py2.7.egg/OFS/Application.py", line 693, in install_product 
    transaction.commit() 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/transaction-1.1.1-py2.7.egg/transaction/_manager.py", line 89, in commit 
    return self.get().commit() 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/transaction-1.1.1-py2.7.egg/transaction/_transaction.py", line 329, in commit 
    self._commitResources() 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/transaction-1.1.1-py2.7.egg/transaction/_transaction.py", line 446, in _commitResources 
    rm.tpc_vote(self) 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 781, in tpc_vote 
    s = vote(transaction) 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZEO/ClientStorage.py", line 1098, in tpc_vote 
    return self._check_serials() 
    File "/home/myUser/opt/Zope2-2.13.21/local/lib/python2.7/site-packages/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZEO/ClientStorage.py", line 929, in _check_serials 
    raise s 
ConflictError: database conflict error (oid 0x01, class OFS.Application.Application, serial this txn started with 0x03a449da3a7b1e44 2014-01-22 11:38:13.706468, serial currently committed 0x03a449da3af74dee 2014-01-22 11:38:13.820164) 

我想解决这个问题,即使它不会影响我的网站的功能,但我不知道去哪里找。有什么建议么? :)

或者这是否意味着缓存的对象必须更新ZEO服务器的数据?

回答

1

当一个Zope实例启动时,它将扩展(Products)注册到ZODB中。但是,当您运行共享ZEO服务器的多个实例时,它们大致同时启动,在此阶段会遇到冲突。这些冲突本质上是无害的,它们只发生,因为另一个实例成功安装持久组件。

解决方案是配置不注册产品的实例,除了一个(通常是多机群集中的每台机器一个);那么在重新启动时,只有其中一个实例进行注册,其余的运行相同的软件堆栈将不必。

请注意,在最近的Zope安装中,产品的持久部件已被弃用且大部分被禁用;如果您不使用通过Web的产品或ZClasses,您可能根本不需要启用此功能。

当您确实需要它时,请将zope.conf中的enable-product-installation配置设置为on仅限一个实例,其余为off。如果使用buildoutplone.recipe.zope2instance recipe,则可以在构建配方配置中指定此设置。

+0

感谢Martijn,经常这样,你让我的一天:)我仍然使用我的产品文件夹中的一些产品,所以在这种情况下,我还需要启用产品安装开关,但是我会禁用它在其他实例。但是,我猜这些产品必须出现在所有实例的产品文件夹中? – Rastaf