[Zope3-dev] Fix for request retry on ConflictError

2006-07-18 Thread Sven Schomaker

Hi all,

the retry of a request in case of a ConflictError in Zope 3.2.1 fails
with a NotFound error, while looking up the requested view in
zope/app/traversing/namespace.py (line 362).

It seems as the newly created request (in request.retry()) does
somehow not satisfy the adapter prerequisites to successfully
look up a view in zope.component.queryMultiadapter.

I did not dig too deep to find out what exactly goes wrong in the old
statement used to create the new request instance, but I suppose
somehow not all specifications (interfaces) of the original request
are set up on the new request. Nevertheless I came up with a (quick)
fix in zope/publisher/http.py that circumvents the issue.

I don't know whether this is already fixed in the trunk or the fix
appeals to the devs with check-in permissions, but maybe someone
wants to look at it and check it in (or comes up with a better/more
precise one:)).


greetings,

Sven Schomaker


Index: http.py
===
--- http.py (revision 178)
+++ http.py (working copy)
@@ -15,6 +15,7 @@

$Id: http.py 41004 2005-12-23 21:01:20Z jim $

+from copy import copy
import re, time, random
from cStringIO import StringIO
from urllib import quote, unquote, splitport
@@ -435,13 +436,12 @@
'See IPublisherRequest'
count = getattr(self, '_retry_count', 0)
self._retry_count = count + 1
-
-new_response = self.response.retry()
-request = self.__class__(
+request = copy(self)
+request.__init__(
# Use the cache stream as the new input stream.
body_instream=self._body_instream.getCacheStream(),
environ=self._orig_env,
-response=new_response,
+response=self.response.retry(),
)
request.setPublication(self.publication)
request._retry_count = self._retry_count

___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com



Re: [Zope3-dev] Fix for request retry on ConflictError

2006-07-18 Thread Jim Fulton

PLease submit a collector issue at:

  http://www.zope.org/Collectors/Zope3-dev

A test would be especially helpful.

Jim

On Jul 18, 2006, at 4:28 AM, Sven Schomaker wrote:


Hi all,

the retry of a request in case of a ConflictError in Zope 3.2.1 fails
with a NotFound error, while looking up the requested view in
zope/app/traversing/namespace.py (line 362).

It seems as the newly created request (in request.retry()) does
somehow not satisfy the adapter prerequisites to successfully
look up a view in zope.component.queryMultiadapter.

I did not dig too deep to find out what exactly goes wrong in the old
statement used to create the new request instance, but I suppose
somehow not all specifications (interfaces) of the original request
are set up on the new request. Nevertheless I came up with a (quick)
fix in zope/publisher/http.py that circumvents the issue.

I don't know whether this is already fixed in the trunk or the fix
appeals to the devs with check-in permissions, but maybe someone
wants to look at it and check it in (or comes up with a better/more
precise one:)).


greetings,

Sven Schomaker


Index: http.py
===
--- http.py (revision 178)
+++ http.py (working copy)
@@ -15,6 +15,7 @@

$Id: http.py 41004 2005-12-23 21:01:20Z jim $

+from copy import copy
import re, time, random
from cStringIO import StringIO
from urllib import quote, unquote, splitport
@@ -435,13 +436,12 @@
'See IPublisherRequest'
count = getattr(self, '_retry_count', 0)
self._retry_count = count + 1
-
-new_response = self.response.retry()
-request = self.__class__(
+request = copy(self)
+request.__init__(
# Use the cache stream as the new input stream.
body_instream=self._body_instream.getCacheStream(),
environ=self._orig_env,
-response=new_response,
+response=self.response.retry(),
)
request.setPublication(self.publication)
request._retry_count = self._retry_count

___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/jim%40zope.com



--
Jim Fulton  mailto:[EMAIL PROTECTED]Python 
Powered!
CTO (540) 361-1714  
http://www.python.org
Zope Corporationhttp://www.zope.com http://www.zope.org



___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com



Re: [Zope3-dev] Fix for request retry on ConflictError

2006-07-18 Thread Sven Schomaker

Jim Fulton wrote:

PLease submit a collector issue at:

  http://www.zope.org/Collectors/Zope3-dev

A test would be especially helpful.


Yeehaw, I was afraid someone would ask for such a thing.
I must admit I actually wasn't able to write it up to now,
since I'm not too familiar with all the traversal stuff and
the like and howto setup a test for that issue.

Poor me - I figured out the solution by torturing our app
with a bunch of simultaneous requests and provoking
some ConflictErrors.

Since that is not helpful at all, someone may help me on
writing a formal test?

greetings,

Sven


Jim

On Jul 18, 2006, at 4:28 AM, Sven Schomaker wrote:


Hi all,

the retry of a request in case of a ConflictError in Zope 3.2.1 fails
with a NotFound error, while looking up the requested view in
zope/app/traversing/namespace.py (line 362).

It seems as the newly created request (in request.retry()) does
somehow not satisfy the adapter prerequisites to successfully
look up a view in zope.component.queryMultiadapter.

I did not dig too deep to find out what exactly goes wrong in the old
statement used to create the new request instance, but I suppose
somehow not all specifications (interfaces) of the original request
are set up on the new request. Nevertheless I came up with a (quick)
fix in zope/publisher/http.py that circumvents the issue.

I don't know whether this is already fixed in the trunk or the fix
appeals to the devs with check-in permissions, but maybe someone
wants to look at it and check it in (or comes up with a better/more
precise one:)).


greetings,

Sven Schomaker


Index: http.py
===
--- http.py (revision 178)
+++ http.py (working copy)
@@ -15,6 +15,7 @@

$Id: http.py 41004 2005-12-23 21:01:20Z jim $

+from copy import copy
import re, time, random
from cStringIO import StringIO
from urllib import quote, unquote, splitport
@@ -435,13 +436,12 @@
'See IPublisherRequest'
count = getattr(self, '_retry_count', 0)
self._retry_count = count + 1
-
-new_response = self.response.retry()
-request = self.__class__(
+request = copy(self)
+request.__init__(
# Use the cache stream as the new input stream.
body_instream=self._body_instream.getCacheStream(),
environ=self._orig_env,
-response=new_response,
+response=self.response.retry(),
)
request.setPublication(self.publication)
request._retry_count = self._retry_count

___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/jim%40zope.com



--
Jim Fultonmailto:[EMAIL PROTECTED]Python Powered!
CTO (540) 361-1714http://www.python.org
Zope Corporationhttp://www.zope.comhttp://www.zope.org






--
__Addressed by:_

Sven Holger Cochise Schomaker, Dipl.-Inf. (FH)

Linie M - Metall Form Farbe - GmbH
Industriestrae 8
63674 Altenstadt (Hessen)
Germany

Tel.: +49 (0)6047 97121
Fax: +49 (0)6047 97122

Mail: [EMAIL PROTECTED]

Public Key: hkp://subkeys.pgp.net

Key ID: F04D3E4F

Key fingerprint: 79BD FBEB F6AE 7005 8374  
320A 0D13 F202 F04D 3E4F


___

___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com



Re: [Zope3-dev] Fix for request retry on ConflictError

2006-07-18 Thread Jim Fulton

A test is not required, although it would be helpful.

There may, possibly, be existing tests that you could extend.

Also, you shouldn't generate a real ZODB conflict error to test this.
Rather, you should generate a conflict error in your test directly.

Jim

On Jul 18, 2006, at 9:46 AM, Sven Schomaker wrote:


Jim Fulton wrote:

PLease submit a collector issue at:

  http://www.zope.org/Collectors/Zope3-dev

A test would be especially helpful.


Yeehaw, I was afraid someone would ask for such a thing.
I must admit I actually wasn't able to write it up to now,
since I'm not too familiar with all the traversal stuff and
the like and howto setup a test for that issue.

Poor me - I figured out the solution by torturing our app
with a bunch of simultaneous requests and provoking
some ConflictErrors.

Since that is not helpful at all, someone may help me on
writing a formal test?

greetings,

Sven


Jim

On Jul 18, 2006, at 4:28 AM, Sven Schomaker wrote:


Hi all,

the retry of a request in case of a ConflictError in Zope 3.2.1  
fails

with a NotFound error, while looking up the requested view in
zope/app/traversing/namespace.py (line 362).

It seems as the newly created request (in request.retry()) does
somehow not satisfy the adapter prerequisites to successfully
look up a view in zope.component.queryMultiadapter.

I did not dig too deep to find out what exactly goes wrong in the  
old

statement used to create the new request instance, but I suppose
somehow not all specifications (interfaces) of the original request
are set up on the new request. Nevertheless I came up with a (quick)
fix in zope/publisher/http.py that circumvents the issue.

I don't know whether this is already fixed in the trunk or the fix
appeals to the devs with check-in permissions, but maybe someone
wants to look at it and check it in (or comes up with a better/more
precise one:)).


greetings,

Sven Schomaker


Index: http.py
===
--- http.py (revision 178)
+++ http.py (working copy)
@@ -15,6 +15,7 @@

$Id: http.py 41004 2005-12-23 21:01:20Z jim $

+from copy import copy
import re, time, random
from cStringIO import StringIO
from urllib import quote, unquote, splitport
@@ -435,13 +436,12 @@
'See IPublisherRequest'
count = getattr(self, '_retry_count', 0)
self._retry_count = count + 1
-
-new_response = self.response.retry()
-request = self.__class__(
+request = copy(self)
+request.__init__(
# Use the cache stream as the new input stream.
body_instream=self._body_instream.getCacheStream(),
environ=self._orig_env,
-response=new_response,
+response=self.response.retry(),
)
request.setPublication(self.publication)
request._retry_count = self._retry_count

___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/jim%40zope.com



--
Jim Fultonmailto:[EMAIL PROTECTED]Python Powered!
CTO (540) 361-1714http://www.python.org
Zope Corporationhttp://www.zope.comhttp://www.zope.org






--
__Addressed by:_

Sven Holger Cochise Schomaker, Dipl.-Inf. (FH)

Linie M - Metall Form Farbe - GmbH
Industriestrae 8
63674 Altenstadt (Hessen)
Germany

Tel.: +49 (0)6047 97121
Fax: +49 (0)6047 97122

Mail: [EMAIL PROTECTED]

Public Key: hkp://subkeys.pgp.net

Key ID: F04D3E4F

Key fingerprint: 79BD FBEB F6AE 7005 8374  320A  
0D13 F202 F04D 3E4F


___



--
Jim Fulton  mailto:[EMAIL PROTECTED]Python 
Powered!
CTO (540) 361-1714  
http://www.python.org
Zope Corporationhttp://www.zope.com http://www.zope.org



___
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com