def run(self): self._prepare() self._logger.info('Running task {}.. (delay: {})'.format(self._task.id, self._executionDelay)) try: for i, retry in enumerate(transaction.attempts(self._config.task_max_tries)): with retry: self._logger.info('Task attempt #{}'.format(i)) if i > 0: self._prepare_retry() try: self._process_task() break except ConflictError: transaction.abort() except ClientDisconnected: self._logger.warning("Retrying for the {}th time in {} secs..".format(i + 1, seconds)) transaction.abort() time.sleep(i * 10) except TaskDelayed, e: self._logger.info("{} delayed by {} seconds".format(self._task, e.delaySeconds)) self._delayed = True self._executionDelay = 0 time.sleep(e.delaySeconds) flush_after_commit_queue(True) GenericMailer.flushQueue(True)
def _invokeMethodRetryBefore(self): # clear/init fossil cache fossilize.clearCache() # clear after-commit queue flush_after_commit_queue(False) # delete all queued emails GenericMailer.flushQueue(False) DBMgr.getInstance().sync()
def _invokeMethodSuccess(self): rh = ContextManager.get('currentRH') flush_after_commit_queue(True) # run after-commit functions GenericMailer.flushQueue(True) # send emails if rh._redisPipeline: try: rh._redisPipeline.execute() except RedisError: Logger.get('redis').exception('Could not execute pipeline')
def _process_retry_setup(self): # clear the fossile cache at the start of each request fossilize.clearCache() # clear after-commit queue flush_after_commit_queue(False) # delete all queued emails GenericMailer.flushQueue(False) # clear the existing redis pipeline if self._redisPipeline: self._redisPipeline.reset()
def __call__(self, aw): """Perform the actual exporting""" if self.HTTP_POST != (request.method == 'POST'): raise HTTPAPIError( 'This action requires %s' % ('POST' if self.HTTP_POST else 'GET'), 405) if not self.GUEST_ALLOWED and not aw.getUser(): raise HTTPAPIError('Guest access to this resource is forbidden.', 403) method_name = self._getMethodName() func = getattr(self, method_name, None) extra_func = getattr(self, method_name + '_extra', None) if not func: raise NotImplementedError(method_name) if not self.COMMIT: is_response, resultList, complete, extra = self._perform( aw, func, extra_func) else: dbi = DBMgr.getInstance() try: for i, retry in enumerate(transaction.attempts(10)): with retry: if i > 0: dbi.abort() flush_after_commit_queue(False) GenericMailer.flushQueue(False) dbi.sync() try: is_response, resultList, complete, extra = self._perform( aw, func, extra_func) transaction.commit() flush_after_commit_queue(True) GenericMailer.flushQueue(True) break except ConflictError: transaction.abort() except ClientDisconnected: transaction.abort() time.sleep(i * 5) else: raise HTTPAPIError( 'An unresolvable database conflict has occured', 500) except Exception: transaction.abort() raise if is_response: return resultList return resultList, extra, complete, self.SERIALIZER_TYPE_MAP
def _process_success(self): Logger.get('requestHandler').info('Request {} successful'.format(request)) # request is succesfull, now, doing tasks that must be done only once try: flush_after_commit_queue(True) GenericMailer.flushQueue(True) # send emails self._deleteTempFiles() except: Logger.get('mail').exception('Mail sending operation failed') # execute redis pipeline if we have one if self._redisPipeline: try: self._redisPipeline.execute() except RedisError: Logger.get('redis').exception('Could not execute pipeline')
def _process_success(self): Logger.get('requestHandler').info('Request successful') # request is succesfull, now, doing tasks that must be done only once try: flush_after_commit_queue(True) GenericMailer.flushQueue(True) # send emails self._deleteTempFiles() except: Logger.get('mail').exception('Mail sending operation failed') # execute redis pipeline if we have one if self._redisPipeline: try: self._redisPipeline.execute() except RedisError: Logger.get('redis').exception('Could not execute pipeline')
def __call__(self, aw): """Perform the actual exporting""" if self.HTTP_POST != (request.method == 'POST'): raise HTTPAPIError('This action requires %s' % ('POST' if self.HTTP_POST else 'GET'), 405) if not self.GUEST_ALLOWED and not aw.getUser(): raise HTTPAPIError('Guest access to this resource is forbidden.', 403) method_name = self._getMethodName() func = getattr(self, method_name, None) extra_func = getattr(self, method_name + '_extra', None) if not func: raise NotImplementedError(method_name) if not self.COMMIT: is_response, resultList, complete, extra = self._perform(aw, func, extra_func) else: dbi = DBMgr.getInstance() try: for i, retry in enumerate(transaction.attempts(10)): with retry: if i > 0: dbi.abort() flush_after_commit_queue(False) GenericMailer.flushQueue(False) dbi.sync() try: is_response, resultList, complete, extra = self._perform(aw, func, extra_func) transaction.commit() flush_after_commit_queue(True) GenericMailer.flushQueue(True) break except ConflictError: transaction.abort() except ClientDisconnected: transaction.abort() time.sleep(i * 5) else: raise HTTPAPIError('An unresolvable database conflict has occured', 500) except Exception: transaction.abort() raise if is_response: return resultList return resultList, extra, complete, self.SERIALIZER_TYPE_MAP
def _prepare_retry(self): self._dbi.abort() self._dbi.sync() flush_after_commit_queue(False) GenericMailer.flushQueue(False) self._task.plugLogger(self._logger)