Skip to content

Commit

Permalink
Reduce catalog brains tendancy to eat conflict errors which could res…
Browse files Browse the repository at this point in the history
…ult 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.
  • Loading branch information
caseman committed Mar 23, 2004
1 parent c699415 commit 1849ca6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 18 deletions.
33 changes: 16 additions & 17 deletions CatalogBrains.py
Expand Up @@ -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."""
Expand Down
2 changes: 1 addition & 1 deletion tests/testCatalog.py
Expand Up @@ -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

Expand Down

0 comments on commit 1849ca6

Please sign in to comment.