David Fraser
davidf at sjsoft.com
Mon Apr 26 17:20:47 EST 2004
Stéphane Bidoul wrote: >Hi, > >I'm having problems with server cleanup callbacks >(on windows, with apache 2.0.49 and mod_python 3.1.3): > >For instance, with > >def endChild(data): > f = file("test.log","a") > try: > print >> f, "endChild", data > finally: > f.close() > >firstTime = 1 > >def handler(req): > if firstTime: > global firstTime > req.server.register_cleanup(req,endChild,("endChild data",) > firstTime = 0 > >Sometimes, the endChild function runs normally, >but sometimes, I get this in apache error.log: > >[notice] Child 1284: Exit event signaled. Child process is ending. >[notice] Child 1284: Released the start mutex >[notice] Child 1284: Waiting for 250 worker threads to exit. >[notice] Child 1284: All worker threads have exited. >[error] python_cleanup: Error calling cleanup object <function endChild at >0x005FFC30> >[error] exceptions.IOError: file() constructor not accessible in >restricted mode >[notice] Child 1284: Child process is exiting >[notice] Parent: Child process exited successfully. > >Why is python thinking it is in restricted mode? >I'm prepared to launch my debugger, but I've no clue >where to search first, so any hint is most welcome. > >Thanks in advance. > >-sbi > > Hi I reported this on the python-dev list recently, and have quoted the thread below. Not much info seems to be available, but basically the code is being called with a different interpreter to the one used to create some objects or something like that. I'd appreciate any further info you find out David > Just for reference, these are the URLs and info I've found on this > problem. > There doesn't seem to be much info at all in the Python docs / > newsgroups. > I have been trying to set up a testcase but at the moment it crashes > Apache just trying to call a simple servercleanup (with pass) so I > need to work at it a bit... > > http://4suite.org/docs/FAQ.xml > >> Why do I get codec or other strange errors when running under >> mod_python? >> >> There is a known problem with mod_python in Python 2.2 and older. >> mod_python is running in restricted mode, and this is considered by >> the mod_python folks to be a bug. Anything which introspects (like >> 4Suite) or does anything a restricted interpreter can't do will fail >> with a cryptic exception. The solution is to upgrade to Python 2.3, >> and use a recent build of mod_python (3.1 or newer). > > > http://mail.python.org/pipermail/python-list/1999-April/000903.html > (1999 discussion of this problem) > >> This alleviates the problem and makes it work. Outside of not >> finalizing interpreters (which alleviates it somewhat, but makes the >> code run in restricted mode since __builtins__ of the unpickled objects >> isn't the same as the "current" __builtins__), I don't know of any other >> way to fix this. >> > http://groups.google.com/groups?th=bfe053aba305ba1c&seekm=35A102B1.182B68A2%40starmedia.net#link1 > > (1998 discussion of this problem) > >> In the course of playing with the pyapache, I've run into the situation >> where the interpreter complains about being in restricted mode. What >> I've been able to figure out is this: if the __builtins__ of the current >> frame is different than the __builtins__ of the current top frame (read >> as current thread), it is in restricted mode. Is this correct? > > http://groups.google.com/groups?th=fdeaf811901bc4f&seekm=mt2.0-17287-914742573%40news.informatik.uni-bonn.de > > (ancient announcement of httpady) > >> 1. A bug related to the way multiple intrpreters were implemented >> that would >> occasionally use objects created in one interpreter in another. The >> bug would manifest >> itself by Python complaining that __dict__ is not available in >> restricted mode. >> > > > > David Fraser wrote: > >> mod_python 3.1.3 running on Windows >> Thanks for the explanation, that makes sense why I couldn't find the >> code... >> I'll try and compare the request and server implementations of >> setting the cleanup function and work out why this is happening... >> >> David >> >> Gregory (Grisha) Trubetskoy wrote: >> >>> What version of mod_python is this? >>> >>> Restricted mode is a strange beast, in that there isn't really anything >>> like a "restricted mode" flag, but it looks at a pointer somwhere >>> (don't >>> remember now), and if it's not what is expected, it concludes that >>> it's in >>> restricted mode. So this behaviour is actually a sign of a bug where an >>> object is created in one subinterpreter but is running in another... >>> These >>> bugs can be hard to track down. >>> >>> Grisha >>> >>> >>> On Tue, 6 Apr 2004, David Fraser wrote: >>> >>> >>> >>>> Hi >>>> >>>> It seems that server cleanup functions registered with >>>> server.register_cleanup run in restricted mode. >>>> I'm trying to use them to close a database connection and being run in >>>> restricted mode causes problems. >>>> I can't see in the code where this gets set, but I get the >>>> following error: >>>> [Tue Apr 06 17:16:01 2004] [error] python_cleanup: Error calling >>>> cleanup >>>> object <bound method jLogbookMultiServer.onshutdown of >>>> <jLogbook.python.jlogbook.jLogbookMultiServer object at 0x00A62670>> >>>> [Tue Apr 06 17:16:01 2004] [error] exceptions.RuntimeError: >>>> instance.__dict__ not accessible in restricted mode >>>> >>>> Is there a reason that the server functions needed to be run in >>>> restricted mode, or is there a better way I should do this? >>>> >>>> David >>>
|