[ZODB-Dev] newbie ZEO first try. ConflictError.
Laurence Rowe
l at lrowe.co.uk
Thu Nov 26 15:23:18 EST 2009
With that setup, you would expect a lot of conflicts, you are
continually writing to the same object from more than one client. You
will see many fewer conflicts if the different clients wrote to
different objects or updated an object with conflict resolution (for
instance inserting into a BTree).
You may find the example application at
http://docs.zope.org/zodb/zodbguide/zeo.html#sample-application-chatter-py
helpful. I've updated the conflict handling and links, but it will
take a few hours for the update to be published to the website. In the
meantime it may be downloaded from svn:
http://svn.zope.org/zodbdocs/trunk/zodbguide/chatter.py?view=auto
helpful.
Laurence
2009/11/26 tsmiller <tsmiller at gnixterhouse.com>:
>
> Laurence,
> Thank you for your very quick reply. I did as you suggested and now the
> ConflictError is now handled. And that is a most excellent thing because
> now ConflictError is raised every time. So it still seems to be confused.
> I am trying to figure out if I will be able to use ZEO in my application.
>
> Now my program reads:
>
> while True:
> root[ "one" ] = time.asctime()
> while True:
> try:
> print "Try to commit transaction"
> transaction.commit()
> print "root is", root
> except POSException.ConflictError:
> print "we have a conflict"
> transaction.abort()
> time.sleep(.2)
> else:
> break
>
> time.sleep(10)
>
>
> And the output is:
>
> // the program is only running once here
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:37:53 2009'}
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:03 2009'}
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:13 2009'}
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:23 2009'}
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:33 2009'}
>
> // after I start a second copy, the first copy always has a conflict ( the
> second copy does not get this conflict error).
> Try to commit transaction
> we have a conflict
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:35 2009'}
> Try to commit transaction
> we have a conflict
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:46 2009'}
> Try to commit transaction
> we have a conflict
> Try to commit transaction
> root is {'one': 'Thu Nov 26 11:38:56 2009'}
> Try to commit transaction
> we have a conflict
>
> thanks,
> tom
>
>
>
> Laurence Rowe wrote:
>>
>> You must be prepared to abort and retry the whole transaction:
>>
>> while True:
>> while True:
>> try:
>> root[ "one" ] = time.asctime()
>> transaction.commit()
>> except POSException.ConflictError:
>> transaction.abort()
>> time.sleep(.2)
>> else:
>> break
>>
>> time.sleep(10)
>>
>>
>> Laurence
>>
>> 2009/11/26 tsmiller <tsmiller at gnixterhouse.com>:
>>>
>>> ZODB Developers,
>>>
>>> Can you please tell me what I am doing wrong in my first simple attempt
>>> to
>>> make use of ZEO. My ZODB and ZEO are both the same version (3.6.0).
>>>
>>> First, I start my ZEO server and it looks like it starts properly:
>>>
>>> python2.4 /usr/lib/python2.4/site-packages/ZEO/runzeo.py -a
>>> localhost:9100
>>> -f /home/tom/zeo/test.fs
>>>
>>> ------
>>> 2009-11-26T00:05:14 INFO ZEO.runzeo (8192) opening storage '1' using
>>> FileStorage
>>> ------
>>> 2009-11-26T00:05:14 INFO ZEO.StorageServer (8192) StorageServer created
>>> RW
>>> with storages: 1:RW:/home/tom/zeo/test.fs
>>> ------
>>> 2009-11-26T00:05:14 INFO ZEO.zrpc (8192) listening on ('localhost', 9100)
>>>
>>>
>>> Second, I start my client, twice. The purpose is to write to the same
>>> test.fs file from both of them. The idea is to loop continuously,
>>> writing
>>> to test.fs from each program. If I only start the program once, it
>>> writes
>>> to test.fs fine. But the first time it tries to commit a transaction
>>> after
>>> starting a second copy of the program, it always gives an error.
>>>
>>> from ZEO import ClientStorage
>>> from ZODB import DB
>>> from ZODB import POSException
>>> import transaction
>>> import time
>>>
>>> addr = 'localhost', 9100
>>> storage = ClientStorage.ClientStorage( addr )
>>> db = DB(storage)
>>> conn = db.open()
>>> root = conn.root()
>>> while True:
>>> root[ "one" ] = time.asctime()
>>> while True:
>>> try:
>>> transaction.commit()
>>> except POSException.ConflictError:
>>> time.sleep(.2)
>>> else:
>>> break
>>>
>>> time.sleep(10)
>>>
>>>
>>> The traceback folows. The conflict error is not handled and I don't know
>>> why. I am sure that I am missing something simple.
>>>
>>> we have a conflict
>>> Traceback (most recent call last):
>>> File "zeotest.py", line 17, in ?
>>> transaction.commit()
>>> File "/usr/lib/python2.4/site-packages/transaction/_manager.py", line
>>> 96,
>>> in commit
>>> return self.get().commit(sub, deprecation_wng=False)
>>> File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
>>> line
>>> 370, in commit
>>> self._prior_operation_failed() # doesn't return
>>> File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
>>> line
>>> 250, in _prior_operation_failed
>>> raise TransactionFailedError("An operation previously failed, "
>>> ZODB.POSException.TransactionFailedError: An operation previously failed,
>>> with traceback:
>>>
>>> File "zeotest.py", line 17, in ?
>>> transaction.commit()
>>> File "/usr/lib/python2.4/site-packages/transaction/_manager.py", line
>>> 96,
>>> in commit
>>> return self.get().commit(sub, deprecation_wng=False)
>>> File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
>>> line
>>> 380, in commit
>>> self._saveCommitishError() # This raises!
>>> File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
>>> line
>>> 378, in commit
>>> self._commitResources()
>>> File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
>>> line
>>> 433, in _commitResources
>>> rm.commit(self)
>>> File "/usr/lib/python2.4/site-packages/ZODB/Connection.py", line 484, in
>>> commit
>>> self._commit(transaction)
>>> File "/usr/lib/python2.4/site-packages/ZODB/Connection.py", line 518, in
>>> _commit
>>> raise ConflictError(object=obj)
>>> ConflictError: database conflict error (oid 0x00, class
>>> persistent.mapping.PersistentMapping)
>>>
>>>
>>> thanks,
>>>
>>> tom
>>>
>>>
>>> --
>>> View this message in context:
>>> http://old.nabble.com/newbie-ZEO-first-try.--ConflictError.-tp26532984p26532984.html
>>> Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com.
>>>
>>> _______________________________________________
>>> For more information about ZODB, see the ZODB Wiki:
>>> http://www.zope.org/Wikis/ZODB/
>>>
>>> ZODB-Dev mailing list - ZODB-Dev at zope.org
>>> https://mail.zope.org/mailman/listinfo/zodb-dev
>>>
>> _______________________________________________
>> For more information about ZODB, see the ZODB Wiki:
>> http://www.zope.org/Wikis/ZODB/
>>
>> ZODB-Dev mailing list - ZODB-Dev at zope.org
>> https://mail.zope.org/mailman/listinfo/zodb-dev
>>
>>
>
> --
> View this message in context: http://old.nabble.com/newbie-ZEO-first-try.--ConflictError.-tp26532984p26533587.html
> Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com.
>
> _______________________________________________
> For more information about ZODB, see the ZODB Wiki:
> http://www.zope.org/Wikis/ZODB/
>
> ZODB-Dev mailing list - ZODB-Dev at zope.org
> https://mail.zope.org/mailman/listinfo/zodb-dev
>
More information about the ZODB-Dev
mailing list