Commit aea53b96 authored by Vincent Pelletier's avatar Vincent Pelletier

Split security handling and unlocking into 2 separate try..except levels, for...

Split security handling and unlocking into 2 separate try..except levels, for the sake of robustness.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@19176 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 88936b55
......@@ -558,41 +558,43 @@ class ActivityTool (Folder, UniqueObject):
if not acquired:
return
old_sm = getSecurityManager()
try:
old_sm = getSecurityManager()
try:
# get owner of portal_catalog, so normally we should be able to
# have the permission to invoke all activities
user = self.portal_catalog.getWrappedOwner()
newSecurityManager(self.REQUEST, user)
currentNode = self.getCurrentNode()
self.registerNode(currentNode)
processing_node_list = self.getNodeList(role=ROLE_PROCESSING)
# only distribute when we are the distributingNode or if it's empty
if (self.getDistributingNode() == currentNode):
self.distribute(len(processing_node_list))
# SkinsTool uses a REQUEST cache to store skin objects, as
# with TimerService we have the same REQUEST over multiple
# portals, we clear this cache to make sure the cache doesn't
# contains skins from another portal.
stool = getToolByName(self, 'portal_skins', None)
if stool is not None:
stool.changeSkin(None)
# call tic for the current processing_node
# the processing_node numbers are the indices of the elements in the node tuple +1
# because processing_node starts form 1
if currentNode in processing_node_list:
self.tic(processing_node_list.index(currentNode)+1)
except:
# Catch ALL exception to avoid killing timerserver.
LOG('ActivityTool', ERROR, 'process_timer received an exception', error=sys.exc_info())
try:
# get owner of portal_catalog, so normally we should be able to
# have the permission to invoke all activities
user = self.portal_catalog.getWrappedOwner()
newSecurityManager(self.REQUEST, user)
currentNode = self.getCurrentNode()
self.registerNode(currentNode)
processing_node_list = self.getNodeList(role=ROLE_PROCESSING)
# only distribute when we are the distributingNode or if it's empty
if (self.getDistributingNode() == currentNode):
self.distribute(len(processing_node_list))
# SkinsTool uses a REQUEST cache to store skin objects, as
# with TimerService we have the same REQUEST over multiple
# portals, we clear this cache to make sure the cache doesn't
# contains skins from another portal.
stool = getToolByName(self, 'portal_skins', None)
if stool is not None:
stool.changeSkin(None)
# call tic for the current processing_node
# the processing_node numbers are the indices of the elements in the node tuple +1
# because processing_node starts form 1
if currentNode in processing_node_list:
self.tic(processing_node_list.index(currentNode)+1)
except:
# Catch ALL exception to avoid killing timerserver.
LOG('ActivityTool', ERROR, 'process_timer received an exception', error=sys.exc_info())
finally:
setSecurityManager(old_sm)
finally:
timerservice_lock.release()
setSecurityManager(old_sm)
security.declarePublic('distribute')
def distribute(self, node_count=1):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment