Discussion:
zodb transaction rollback
(too old to reply)
Malika LBAOUCH
2009-04-23 08:49:25 UTC
Permalink
Bonjour,

Lorsque je crée des documents avec la méthode invokefactory il arrive que
mon traitement plante au bout d'un certain temps.

Il me présente le message The id "LCOL-2009-087_1240345985" is invalid - it
is already in use alors que l'id est sensé être unique étant généré avec la
date et l'heure à la seconde près.
Je voudrais pouvoir commiter la transaction de création d'un document pour
éviter qu'il ne fasse un rollback de la création de tous les documents
précédents celui qui plante.
Auriez vous un exemple de ce type de réalisation? merci d'avance.

Traceback (most recent call last):
File "/usr/local/zope/zope274_base/lib/python/ZPublisher/Publish.py", line
101, in publish
request, bind=1)
File "/usr/local/zope/zope274_base/lib/python/ZPublisher/mapply.py", line
88, in mapply
if debug is not None: return debug(object,args,context)
File "/usr/local/zope/zope274_base/lib/python/ZPublisher/Publish.py", line
39, in call_object
result=apply(object,args) # Type s<cr> to step into published object.
File
"/usr/local/zope/zope274_base/lib/python/Products/ExternalMethod/ExternalMethod.py",
line 225, in __call__
try: return f(*args, **kw)
File
"/usr/local/zope/zope274_instance_i1/Products/AcossDocs/Extensions/geredocjuridique.py",
line 914, in genereDoc
translator.genereDoc()
File
"/usr/local/zope/zope274_instance_i1/Products/AcossDocs/Extensions/geredocjuridique.py",
line 168, in genereDoc
targetFolder.invokeFactory('lettre_juridique', new_id)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/CPSTypes.py",
line 60, in invokeFactory
newid = wftool.invokeFactoryFor(self, type_name, id, *args, **kw)
File
"/usr/local/zope/zope274_instance_i1/Products/CPSCore/CPSWorkflowTool.py",
line 247, in invokeFactoryFor
kwargs=kw)
File
"/usr/local/zope/zope274_instance_i1/Products/CPSCore/CPSWorkflowTool.py",
line 365, in _createObject
type_name, id)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/ProxyTool.py",
line 112, in createEmptyProxy
docid=docid)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/ProxyTool.py",
line 714, in constructContent
ob = self._constructInstance_fti(container, ti, id, *args, **kw)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/ProxyTool.py",
line 691, in _constructInstance_fti
newid = meth(id, *args, **kw)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/ProxyBase.py",
line 1305, in addProxyDocument
container._setObject(id, ob)
File
"/usr/local/zope/zope274_instance_i1/Products/CPSCore/OrderedFolderSupportPatch.py",
line 92, in _setObject
res = self._old_ordfold_setObject(id, object, roles, user, set_owner)
File "/usr/local/zope/zope274_base/lib/python/OFS/ObjectManager.py", line
248, in _setObject
v=self._checkId(id)
File "/usr/local/zope/zope274_instance_i1/Products/CPSCore/CPSBase.py",
line 85, in _checkId
PortalFolder.inheritedAttribute('_checkId')(self, id, allow_dup)
File "/usr/local/zope/zope274_base/lib/python/OFS/ObjectManager.py", line
81, in checkValidId
raise BadRequest, (
BadRequest: The id "LCOL-2009-087_1240345985" is invalid - it is already in
use.

ci-joints les paramères de config niveau caches zope et zodb (config zeo
avec 2 clients zope)
Peut être que ça peut expliquer les temps de réponse extremement longs avant
le plantage (1h30 pour créer 15 documents sans arriver au bout puisque le
rollback zope annule la transaction...).

Environment : Zope/(Zope 2.7.4-0, python 2.3.4, linux2) ZServer/1.1 CPS/3.2
data.fs de 15 GO
Le cache ZODB : 30 000 objets
Le cache client zope : 100 MB sur chacun des 2 clients sur les instances i1
(machines prod10 et prod04)
50 MB sur chacun des 2 clients
sur les instances i2 (machines prod10 et prod04)


Malika LB.
ACOSS
Racinet Georges
2009-04-23 12:21:54 UTC
Permalink
Post by Malika LBAOUCH
Bonjour,
Bonjour Malika !
Post by Malika LBAOUCH
Lorsque je crée des documents avec la méthode invokefactory il
arrive que mon traitement plante au bout d'un certain temps.
Il me présente le message The id "LCOL-2009-087_1240345985" is
invalid - it is already in use alors que l'id est sensé être unique
étant généré avec la date et l'heure à la seconde près.
Quelle qu'en soit la cause, il a sans doute raison à ce stade. Il
faudrait de toute façon régler ce problème dans ton code, par exemple
en testant si l'id en question est déjà pris, et en s'autorisant à
rajouter un chiffre de plus si ce n'est le cas. C'est ce que fait par
exemple le cpsdocument_create_do, en passant par le script computeId,
que tu peux trouver dans CPSDefault.
Post by Malika LBAOUCH
Je voudrais pouvoir commiter la transaction de création d'un
document pour éviter qu'il ne fasse un rollback de la création de
tous les documents précédents celui qui plante.
Auriez vous un exemple de ce type de réalisation? merci d'avance.
Ça peut se faire, mais ne réglera pas le problème de création, ça
devrait aussi calmer (un peu) les conflits.

en Zope 2.7 c'était
get_transaction().commit()

la fonction get_transaction() est normalement toujours dispo dans le
contexte
Je ne sais plus s'il faut enchaîner avec une recréation explicite de
transaction avec get_transaction().begin(). Essaye avec et sans sur
une instance de tests/développement.

Pour info, en Zope 2.8 et 2.9, c'est
import transaction
transaction.commit()

Tout ça est à faire en code non restreint, mais il semble bien que ce
soit ton cas (produit AcossDocs).
Post by Malika LBAOUCH
ci-joints les paramères de config niveau caches zope et zodb (config
zeo avec 2 clients zope)
Peut être que ça peut expliquer les temps de réponse extremement
longs avant le plantage (1h30 pour créer 15 documents sans arriver
au bout puisque le rollback zope annule la transaction...).
Sur une telle longueur, je dirais a priori qu'il doit y avoir des
conflits, ce qui ne fait bien sûr qu'aggraver les chose. Quoi qu'il
en soit, les 15 Go c'est peut-être beaucoup, je suppose que les
fichiers attachés sont stockés directement en ZODB ?

En tout cas une chose est sûre, ton instance est malade, et 1h30, ça
n'est pas tolérable, même si ça redescend à 30 mn avec une gestion
explicite de transaction.

--
Georges Racinet, http://www.racinet.fr
Zope/CPS/Plone expertise, assistance & development
GPG: 0x4862FFF7

Loading...