[Zope] Zope & optimistic transactions.

Clark OBrien COBrien@isis-server.vuse.vanderbilt.edu
Mon, 5 Nov 2001 09:14:05 -0600


This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C1660C.8286AF30
Content-Type: text/plain;
	charset="iso-8859-1"


Chris,
I set up a test harness to exercise zopes optimistic transaction management.
My test immediatly caused a ZODB exception.

I am running zope 2.42. on win 2k, the scripts are attached.
Results below:

As you recall I posed the following question:

What if you had a directory structure like:
Folder1
    Folder-2
       Folder-3
          ...
            ..
                Folder-n
Each folder had an attribute foo and there were two scripts, script1 and
script2. 
script1 modified foo on one Folder only while script2 traversed all the
folders modifying the attribute foo on each one of them.
Would the script2 ever commit while the fist while script1 was continuously
called. This is interesting because a call to  script2 would never finish
before several calls to  script1 finished.

I set up a simple test with only 10 folders. I then wrote the script below
changeLevel2 that is my scri1 above and changeFolders that is my script2
above.
I ran changeLevel2 in a loop using the following code:
----------------------------------------script------------------------------
-----------------
import urllib
params = urllib.urlencode({'theText': 'Vitamin D'})
while 1:
 f = urllib.urlopen("http://localhost:8080/Test/changeLevel2?%s" % params)
 print f.read()
-----------------------------------------script-----------------------------
-------------------


I then ran the script changeFolders from my browsers.
The result was the following error message:

------------------------------------------------------------
ZODB.POSException.ConflictError

Sorry, a site error occurred.

Traceback (innermost last):
  File C:\zope\lib\python\ZPublisher\Publish.py, line 223, in publish_module
  File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
  File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
  File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
  File C:\zope\lib\python\ZPublisher\Publish.py, line 195, in publish
----------------------------------------------------------



 <<scripts.txt>> 

------_=_NextPart_000_01C1660C.8286AF30
Content-Type: text/plain;
	name="scripts.txt"
Content-Disposition: attachment;
	filename="scripts.txt"

-----------------------------changeFolder ------------------------------------------------------
#changeFolder
#params list:  theFolder,theText

theFolder.manage_changeProperties({'foo':theText})

----------------------------------end changeFolder-----------------------------------------------




-----------------------------------changeFolders--------------------------------------------------
#changeFolders
#Paramater list: myString
# this method changes the attribute foo on several folders.


newFolder = context.getChild("TestFolder" )
newFolder.manage_changeProperties({'foo':myString})
import string 

for i in range(1,10):
 newFolder = newFolder.getChild("TestFolder" )
 for i in range(1,10):
  # lets do something expansive
  #for j in range(1,100):
   #string.find("its a great day to code python","day")
  newFolder.manage_changeProperties({'foo':myString})


return "all properties changed"
----------------------------------------------end changeFolders----------------------------------------

---------------------------------------------changeLevel2------------------------------------------------
#changeLevel2
#paramater list: theText
theFolder = context.getChild("TestFolder" )
context.changeFolder(theFolder,theText)
return 'ok'
---------------------------------------------end changeLevel2--------------------------------------------




---------------------------------------------createFolders-----------------------------------------------
temp = context.manage_addFolder('TestFolder','TestFolder')
newFolder = context.getChild("TestFolder" )
newFolder.manage_addProperty("foo","this is a test string", "string")

for i in range(1,10):
 newFolder.manage_addFolder("TestFolder","TestFolder")
 newFolder = newFolder.getChild("TestFolder" )
 newFolder.manage_addProperty("foo","this is a test string", "string")
--------------------------------------------end createFolders -----------------------------------------------

---------------------------------getChild-------------------------------------------------------------------
#getChild
#param list: child

"""
getChild: Utility function

Returns ObjectManagerItem whose ID matches child parameter.
Context must be ObjectManager.
"""
for (oid, obj) in context.objectItems():
    if oid == child:
        return obj
else:
    return None
----------------------------------------end getChild -----------------------------------------------------

----------------------------------------makeNewFolder-----------------------------------------------------
#makeNewFolder
#param list: root

root.manage_addFolder('TestFolder','TestFolder')
root.manage_addProperty('foo','The world is round only to those who know it',"string")
return root.getChild('TestFolder')

--------------------------------------end makeNewFolder-----------------------------------------------











------_=_NextPart_000_01C1660C.8286AF30--