Blame pagure/lib/tasks_utils.py

Pierre-Yves Chibon 1aac43
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
"""
Pierre-Yves Chibon 1aac43
 (c) 2018 - Copyright Red Hat Inc
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
 Authors:
Pierre-Yves Chibon 1aac43
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
"""
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 67d1cc
from __future__ import unicode_literals, absolute_import
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
import gc
Pierre-Yves Chibon 1aac43
from functools import wraps
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon cf98be
import pagure.lib.model_base
Pierre-Yves Chibon 1aac43
from pagure.config import config as pagure_config
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
def pagure_task(function):
Pierre-Yves Chibon 1aac43
    """ Simple decorator that is responsible for:
Pierre-Yves Chibon 1aac43
    * Adjusting the status of the task when it starts
Pierre-Yves Chibon 1aac43
    * Creating and cleaning up a SQLAlchemy session
Pierre-Yves Chibon 1aac43
    """
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
    @wraps(function)
Pierre-Yves Chibon 1aac43
    def decorated_function(self, *args, **kwargs):
Pierre-Yves Chibon 1aac43
        """ Decorated function, actually does the work. """
Pierre-Yves Chibon 1aac43
        if self is not None:
Pierre-Yves Chibon 1aac43
            try:
Pierre-Yves Chibon 1aac43
                self.update_state(state="RUNNING")
Pierre-Yves Chibon 1aac43
            except TypeError:
Pierre-Yves Chibon 1aac43
                pass
Pierre-Yves Chibon 8e9b7f
        session = pagure.lib.model_base.create_session(pagure_config["DB_URL"])
Pierre-Yves Chibon 1aac43
        try:
Pierre-Yves Chibon 1aac43
            return function(self, session, *args, **kwargs)
Pierre-Yves Chibon 1aac43
        except:  # noqa: E722
Pierre-Yves Chibon 1aac43
            # if the task has raised for any reason, we need to rollback the
Pierre-Yves Chibon 1aac43
            # session first to not leave open uncomitted transaction hanging
Pierre-Yves Chibon 1aac43
            session.rollback()
Pierre-Yves Chibon 1aac43
            raise
Pierre-Yves Chibon 1aac43
        finally:
Pierre-Yves Chibon 1aac43
            session.remove()
Pierre-Yves Chibon 1aac43
            gc_clean()
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
    return decorated_function
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
Pierre-Yves Chibon 1aac43
def gc_clean():
Pierre-Yves Chibon 1aac43
    """ Force a run of the garbage collector. """
Pierre-Yves Chibon 1aac43
    # https://pagure.io/pagure/issue/2302
Pierre-Yves Chibon 1aac43
    gc.collect()