Пример #1
27
    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)
Пример #2
0
    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)
Пример #3
0
 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()
Пример #4
0
 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()
Пример #5
0
    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')
Пример #6
0
 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()
Пример #7
0
 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()
Пример #8
0
    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')
Пример #9
0
    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
Пример #10
0
 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')
Пример #11
0
 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')
Пример #12
0
    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
Пример #13
0
 def _prepare_retry(self):
     self._dbi.abort()
     self._dbi.sync()
     flush_after_commit_queue(False)
     GenericMailer.flushQueue(False)
     self._task.plugLogger(self._logger)
Пример #14
0
 def _prepare_retry(self):
     self._dbi.abort()
     self._dbi.sync()
     flush_after_commit_queue(False)
     GenericMailer.flushQueue(False)
     self._task.plugLogger(self._logger)