From 1849ca63876740eb47fcb774efba05dacf7406c8 Mon Sep 17 00:00:00 2001 From: Casey Duncan Date: Tue, 23 Mar 2004 21:26:38 +0000 Subject: [PATCH] Reduce catalog brains tendancy to eat conflict errors which could result in rand om loss of valid results in high-concurrency situations. This problem is especially bad for applications (like CMF) that rely on catalog results as a way to get a list of objects to act on. --- CatalogBrains.py | 33 ++++++++++++++++----------------- tests/testCatalog.py | 2 +- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/CatalogBrains.py b/CatalogBrains.py index 1318e14b..ccddbbde 100644 --- a/CatalogBrains.py +++ b/CatalogBrains.py @@ -30,25 +30,24 @@ def getPath(self): return self.aq_parent.getpath(self.data_record_id_) def getURL(self, relative=0): - """Try to generate a URL for this record""" - try: - return self.REQUEST.physicalPathToURL(self.getPath(), relative) - except: - return self.getPath() + """Generate a URL for this record""" + # XXX The previous implementation attempted to eat errors coming from + # REQUEST.physicalPathToURL. Unfortunately it also ate + # ConflictErrors (from getPath), which is bad. Staring at the + # relevent code in HTTPRequest.py it's unclear to me what could be + # raised by it so I'm removing the exception handling here all + # together. If undesired exceptions get raised somehow we should + # avoid bare except band-aids and find a real solution. + return self.REQUEST.physicalPathToURL(self.getPath(), relative) def getObject(self, REQUEST=None): - """Try to return the object for this record""" - try: - obj = self.aq_parent.unrestrictedTraverse(self.getPath()) - if not obj: - if REQUEST is None: - REQUEST = self.REQUEST - obj = self.aq_parent.resolve_url(self.getPath(), REQUEST) - return obj - except: - zLOG.LOG('CatalogBrains', zLOG.INFO, 'getObject raised an error', - error=sys.exc_info()) - pass + """Return the object for this record + + Will return None if the object cannot be found via its cataloged path + (i.e., it was deleted or moved without recataloging), or if the user is + not authorized to access an object along the path. + """ + return self.aq_parent.restrictedTraverse(self.getPath(), None) def getRID(self): """Return the record ID for this object.""" diff --git a/tests/testCatalog.py b/tests/testCatalog.py index 2369f25e..22e332d9 100755 --- a/tests/testCatalog.py +++ b/tests/testCatalog.py @@ -462,7 +462,7 @@ def setUp(self): self._catalog.aq_parent = objRS(200) def testRangeSearch(self): - for i in range(10000): + for i in range(1000): m = random.randrange(0,20000) n = m + 1000