Zope multitasking: retrying doesn't seem to help at all
I've hacked HTTPRequest.py in 2.1 beta to give me some status, and I'm still not sure that Zope's retrying operation is going to be any help, here. I'm not exceeding the retry count, and Zope is still returning wierd errors to my clients. Here's one run output from trying to shove lots of documents with different IDs into a single folder at once: ------ 1999-11-05T11:58:29 ERROR(200) ZODB Couldn't load state for '\000\000\000\000\00 0\000\006\202' ------ 1999-11-05T11:58:29 ERROR(200) ZODB Couldn't load state for '\000\000\000\000\00 0\000\006\202' No retry action whatsoever, and I got two 404 errors back instead of created folders. Here's another: ------ 1999-11-05T12:00:22 INFO(0) Z2 CONFLICT Competing writes at, /folder1/testfolder /manage_addProduct/OFSP/addDTMLDocument ------ 1999-11-05T12:00:22 INFO(0) Z2 CONFLICT Competing writes at, /folder1/testfolder /manage_addProduct/OFSP/addDTMLDocument retry count is 0 of 3 retrying... retry count is 0 of 3 retrying... ------ 1999-11-05T12:00:23 INFO(0) Z2 CONFLICT Competing writes at, /folder1/testfolder /manage_addProduct/OFSP/addDTMLDocument retry count is 0 of 3 retrying... ------ 1999-11-05T12:00:23 INFO(0) Z2 CONFLICT Competing writes at, /folder1/testfolder /manage_addProduct/OFSP/addDTMLDocument retry count is 0 of 3 retrying... Okay, so my code hacked into HTTPRequest is working. Note how I'm never exceeding a retry count. At the client end, I got four 400 responses this time, along the lines of: Invalid request The parameter, id, was omitted from the request. Make sure to specify all required parameters, and try the request again. Four Z2 conflicts, cool. Four retries, cool. Four errors to the client, not cool. Here are the mods to HTTPRequest: def supports_retry(self): stderr.write("retry count is %d of %d\n" % (self.retry_count, self.retry_max_count)) return self.retry_count < self.retry_max_count def retry(self): stderr.write("retrying...\n") self.retry_count=self.retry_count+1 r=self.__class__(stdin=self.stdin, environ=self._orig_env, response=self.response.retry() ) return r ... and an appropriate import at the top. Hmmm. You know, I can't see anything in the code which suggests that the creation of a new request object in retry() makes any attempt to set its retry_count. So, hacking in some new code: retry_max_count=3 def supports_retry(self): stderr.write("retry count is %d of %d\n" % (self.retry_count, self.retry_max_count)) return self.retry_count < self.retry_max_count def retry(self): stderr.write("retrying...\n") self.retry_count=self.retry_count+1 r=self.__class__(stdin=self.stdin, environ=self._orig_env, response=self.response.retry(), retry_count=self.retry_count ) return r def __init__(self, stdin, environ, response, clean=0, retry_count=0): # ... if retry_count: stderr.write("this is retry %d\n" % retry_count) self.retry_count = retry_count 1999-11-05T12:14:51 INFO(0) ZServer Monitor Server (V1.5) started on port 8099 ------ 1999-11-05T12:14:59 ERROR(200) ZODB Couldn't load state for '\000\000\000\000\00 0\000\006\265' ------ 1999-11-05T12:15:00 ERROR(200) ZODB Couldn't load state for '\000\000\000\000\00 0\000\006\265' ------ 1999-11-05T12:15:01 INFO(0) Z2 CONFLICT Competing writes at, /folder1/testfolder /manage_addProduct/OFSP/addDTMLDocument retry count is 0 of 3 retrying... this is retry 1 Looks like I'm still not exceeding my retry count. That run had two 404s and a 400. I guess the conflicts are the 400s and the 404s are something wierd. Anyone know what's going on, here? Regards, Garth. -- <gtk@well.com>
participants (1)
-
gtk