fromrhodecode.lib.pidlockimportDaemonLock,LockHeldfromvcs.utils.lazyimportLazyPropertyfromdecoratorimportdecoratorimportloggingimportosimportsysimporttracebackfromhashlibimportmd5importsocketlog=logging.getLogger(__name__)classResultWrapper(object):def__init__(self,task):self.task=task@LazyPropertydefresult(self):returnself.taskdefrun_task(task,*args,**kwargs):try:t=task.delay(*args,**kwargs)log.info('running task %s',t.task_id)returntexceptsocket.error,e:ife.errno==111:log.debug('Unable to connect to celeryd. Sync execution')else:log.error(traceback.format_exc())exceptKeyError,e:log.debug('Unable to connect to celeryd. Sync execution')exceptException,e:log.error(traceback.format_exc())returnResultWrapper(task(*args,**kwargs))deflocked_task(func):def__wrapper(func,*fargs,**fkwargs):params=list(fargs)params.extend(['%s-%s'%arforarinfkwargs.items()])lockkey='task_%s'% \
md5(str(func.__name__)+'-'+ \
'-'.join(map(str,params))).hexdigest()log.info('running task with lockkey %s',lockkey)try:l=DaemonLock(lockkey)ret=func(*fargs,**fkwargs)l.release()returnretexceptLockHeld:log.info('LockHeld')return'Task with key %s already running'%lockkeyreturndecorator(__wrapper,func)