[Zope] SESSION updates don't always take

Chris Kratz chris.kratz at vistashare.com
Wed Mar 9 15:40:39 EST 2005


Hello all,

We have run into intermittent problems where the updates to items in the 
SESSION object are not always saved.  

I've boiled the problem down to the following set of steps.

1. The SESION object stores a list of items, in the test case, it is a list 
with a single number.
2. We use a function to mutate that list directly by passing in a reference to 
the list, ie function(SESSION['listName'])
3. The function makes changes to the list directly.

It seems that when a single user is using the system, this works consistently 
about 99% of the time.  But, for some reason, when a second test case running 
on a different machine/browser starts up, almost always we get an immediate 
inconsistency between what should be in the session and what is actually 
there in the first test case.  Now, it will happen running a solo version of 
the test case as well, just far more rarely.  Note that running two test 
cases inside of tabs in firefox will immediately become inconsistent because 
they share the same session object within zope.  But running two browsers (ie 
& firefox) or just using 2 different machines as the clients will trigger the 
problem.

I also found that if I make any other unrelated change to the session object 
using SESSION.set() it appears to fix the problem.  

My hunch is that by manipulating the list directly without using session.set, 
we are causing a situation where sometimes the SESSION variable doesn't get 
marked as dirty and saved.  Are there any other ideas out there why we would 
be seeing the behavior we are seeing?

Thanks,

-Chris

Zope 2.7.3 on python 2.3.4 
Linux kernel 2.6.8

**************************************************************************
WARNING, this test case may stress the server it runs against due to 
auto-reloading once per second.
**************************************************************************

1. Create DTML document by copying in the contents attached.
2. Create a python script with the contents attached.
3. View the page in two completely different browsers (to trigger separate 
zope sessions)
4. The pages will run automatically reloading once a second and checking what 
is in the session to what it thinks should be in the session.

I get an inconsistency within 50 runs on at least one of the browsers.  Often 
within 10 runs one of them finds an inconsistency.

--------------  testSessionBug (DTML Doc) --------------
<!-- initialize first time in -->
<dtml-if numTests><dtml-else>
   <dtml-call "REQUEST.set('numTests', 0)">
   <dtml-call "SESSION.set('numTests', [0])">
</dtml-if>

<html><head>
</head><body>
<h2><dtml-var title_or_id></h2>
<p>

<dtml-if "SESSION.has_key('numTests') and numTests<>0 and 
int(SESSION['numTests'][0])<>int(numTests)">
   <b>Found Session List inconsistency</b>  <br>


   SESSION=<dtml-var "SESSION['numTests'][0]"><br>
   Should be=<dtml-var numTests>

<dtml-else>
   <dtml-var numTests> complete without error.
   <!-- Increment counter -->
   <dtml-call "REQUEST.set('numTests', int(numTests)+1)">

   <!-- Write to SESSION -->
   <dtml-call "writeToSession(REQUEST.SESSION['numTests'], numTests)">

   <!-- Update other variable, enable to keep from having a inconsistencies.  
-->
   <d-call "SESSION.set('test',1)">
   
   <!-- Javascript to reload page -->
   <script Language="javascript">
      setTimeout('self.location="testSessionBug?numTests=<dtml-var 
numTests>"', 1000);
   </script>
</dtml-if> 

<br><br>
<a href="testSessionBug">Start Over</a>

</p>
</body></html>

--------------  writeToSession (python script) --------------
## Script (Python) "writeToSession"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=valList, val
##title=
##
valList[0]=val
-- 
Chris Kratz


More information about the Zope mailing list