On 14/05/2004, at 10:06 AM, Chris McDonough wrote:
I am tempted to check the following into the 2.7 branch and HEAD:
- "error occurs in same transaction as main request" patch to Publish.py. See http://www.plope.com/Members/chrism/ publishpy_errorinmaintrainsaction.patch/file_view for the patch.
hmm... I suspect there are few holes in this... - Need to make sure there is no get_transaction().begin() in zpublisher_exception_hook() of lib/python/Zope/App/startup.py That begin() would mean that the error handling is not in fact part of the original transaction? - An exception within err_hook() (aside from a Retry) will mean that abort() is never called. Here is another attempt at publishpy_errorinmaintrainsaction.patch: Index: lib/python/ZPublisher/Publish.py =================================================================== RCS file: /cvs-repository/Zope/lib/python/ZPublisher/Publish.py,v retrieving revision 1.164.2.2 diff -u -r1.164.2.2 Publish.py --- lib/python/ZPublisher/Publish.py 17 Nov 2003 22:34:19 -0000 1.164.2.2 +++ lib/python/ZPublisher/Publish.py 15 May 2004 02:34:12 -0000 @@ -105,7 +105,6 @@ return response except: - if transactions_manager: transactions_manager.abort() # DM: provide nicer error message for FTP sm = None @@ -119,29 +118,36 @@ if err_hook is not None: - if parents: parents=parents[0] try: - return err_hook(parents, request, - sys.exc_info()[0], - sys.exc_info()[1], - sys.exc_info()[2], - ) - except Retry: - # We need to try again.... - if not request.supports_retry(): + if parents: parents=parents[0] + try: return err_hook(parents, request, sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2], ) - newrequest=request.retry() - request.close() # Free resources held by the request. - try: - return publish(newrequest, module_name, after_list, debug) - finally: - newrequest.close() + except Retry: + if not request.supports_retry(): + return err_hook(parents, request, + sys.exc_info()[0], + sys.exc_info()[1], + sys.exc_info()[2], + ) + finally: + if transactions_manager: transactions_manager.abort() + + + newrequest=request.retry() + request.close() # Free resources held by the request. + try: + return publish(newrequest, module_name, after_list, debug) + finally: + newrequest.close() + + else: + if transactions_manager: transactions_manager.abort() + raise - else: raise def publish_module_standard(module_name, Index: lib/python/Zope/App/startup.py =================================================================== RCS file: /cvs-repository/Zope/lib/python/Zope/App/startup.py,v retrieving revision 1.8.2.3 diff -u -r1.8.2.3 startup.py --- lib/python/Zope/App/startup.py 20 Dec 2003 04:48:36 -0000 1.8.2.3 +++ lib/python/Zope/App/startup.py 15 May 2004 02:34:13 -0000 @@ -176,8 +176,6 @@ published=app.__bobo_traverse__(REQUEST).__of__( RequestContainer(REQUEST)) - get_transaction().begin() # Just to be sure. - published=getattr(published, 'im_self', published) while 1: f=getattr(published, 'raise_standardErrorMessage', None)