Projet

Général

Profil

Bug #29320

503 de temps à autres ...

Ajouté par Thomas Noël il y a plus de 5 ans. Mis à jour il y a environ 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
21 décembre 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Dans le journal de passerelle, de temps en temps, sur n'importe quel site et n'importe quelle URL...

Depuis Django 1.11 peut-être ?

C'est sans doute plutôt un truc de hobo, mais j'arrive pas à comprendre.

déc. 21 17:58:52 passerelle uwsgi[693211]: Traceback (most recent call last):
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 154, in __call__
déc. 21 17:58:52 passerelle uwsgi[693211]:     set_script_prefix(get_script_name(environ))
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 188, in get_script_name
déc. 21 17:58:52 passerelle uwsgi[693211]:     if settings.FORCE_SCRIPT_NAME is not None:
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/apps.py", line 134, in <lambda>
déc. 21 17:58:52 passerelle uwsgi[693211]:     conf.LazySettings.__getattr__ = lambda self, name: getattr(self._wrapped, name)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/conf/__init__.py", line 172, in __getattr__
déc. 21 17:58:52 passerelle uwsgi[693211]:     return getattr(self.default_settings, name)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 76, in __getattr__
déc. 21 17:58:52 passerelle uwsgi[693211]:     return getattr(self.get_wrapped(), name)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 71, in get_wrapped
déc. 21 17:58:52 passerelle uwsgi[693211]:     return self.get_tenant_settings(self.default_settings, tenant)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 59, in get_tenant_settings
déc. 21 17:58:52 passerelle uwsgi[693211]:     wrapped, tenant, tenant_settings, last_time)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 44, in load_tenant_settings
déc. 21 17:58:52 passerelle uwsgi[693211]:     loader_instance.update_settings(tenant_settings, tenant)
déc. 21 17:58:52 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings_loaders.py", line 212, in update_settings
déc. 21 17:58:52 passerelle uwsgi[693211]:     module_name = settings.SETTINGS_MODULE.split('.')[0]
déc. 21 17:58:52 passerelle uwsgi[693211]: AttributeError: 'NoneType' object has no attribute 'split'
déc. 21 17:58:52 passerelle uwsgi[693211]: {address space usage: 1444126720 bytes/1377MB} {rss usage: 133840896 bytes/127MB} [pid: 693217|app: 0|req: 946/5516] 0.0.0.0 () {42 vars in 674 bytes} [Fri Dec 21 17:58:52 2018] GET /__metrics__/ => generated 0 bytes in 17 msecs (HTTP/1.0 500) 0 headers in 0 bytes (0 switches on core 0)

Ca viendrait de :

class ThemeSettings(SettingsDictUpdateMixin):
    def get_new_time(self, tenant):
        return 0

    def update_settings(self, tenant_settings, tenant):
        if not hasattr(tenant_settings, 'TEMPLATE_VARS'):
            return
        theme_id = tenant_settings.TEMPLATE_VARS.get('theme')
        if not theme_id:
            return
        theme = get_theme(theme_id)
        if not theme:
            return
        module_name = settings.SETTINGS_MODULE.split('.')[0]                <------------ ici
        module_settings = theme.get('settings', {}).get(module_name)
        if not module_settings:
            return
        self.handle_settings(tenant_settings, module_settings)

Et donc c'est lié à l'affaire de passser des settings via le thème, ça marcherait pas (plus ?)


Fichiers

Révisions associées

Révision 5bee389a (diff)
Ajouté par Benjamin Dauvergne il y a plus de 5 ans

atos-genesys: do not use threads (#29320)

As threads were hiding errors from asynchronous requests, we now still
hide errors when cache is full, but log them.

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Effectivement dans Django on a :


class UserSettingsHolder:
    """Holder for user configured settings.""" 
    # SETTINGS_MODULE doesn't make much sense in the manually configured
    # (standalone) case.
    SETTINGS_MODULE = None

    def __init__(self, default_settings):

et comme les settings des tenants c'est des UserSettingsHolder ça peut pas marcher (et pourtant ça a marché il me semble, et ce code n'a pas bougé entre Django 1.8 et Django 2.x).

#2

Mis à jour par Thomas Noël il y a plus de 5 ans

discussion sur jabber: aller chercher le nom de l'appli via os.envirron('DJANGO_SETTINGS_MODULE').split('.')[0] ou settings.PROJECT_NAME (et faire en sorte que "authentic*" devienne "authentic")

#3

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Assigné à mis à Frédéric Péters
#4

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Projet changé de Passerelle à Hobo
#5

Mis à jour par Frédéric Péters il y a plus de 5 ans

#7

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

J'ai redémarré passerelle après avoir ajouté un assert False dans django.conf.Settings.configure() j'attends que ça pète, le souci vient du fait que django.config.settings._wrapped se retrouve à contenir un object UserSettingsHolder mais je n'arrive pas à trouver d'où il vient, le seul code qui fasse ça c'est cette fonction django.conf.Settings.configure(), mais un grep dans /usr/lib/python2.7 ne me révèle aucun appelant à part dans les tests de kombu. Je remarque que le problème à commencer à 17:10 et dans la suite ça vient toujours du même pid, 693211.

Et.... il suffit que tu m'interpelles pour que je comprenne, ça vient certainement de ce code :

passerelle/base/models.py:from django.test import override_settings
passerelle/base/models.py:        with override_settings(ADMINS=admins):

combiné avec le module AtosGenesys qui utilise des thread (override_settings et les settings de base en général ne gèrent pas les thread) et ça explique la première requête qui démarre le problème:
Dec 21 17:10:11 passerelle uwsgi[693211]: Traceback (most recent call last):
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 154, in __call__
Dec 21 17:10:11 passerelle uwsgi[693211]:     set_script_prefix(get_script_name(environ))
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 188, in get_script_name
Dec 21 17:10:11 passerelle uwsgi[693211]:     if settings.FORCE_SCRIPT_NAME is not None:
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/apps.py", line 134, in <lambda>
Dec 21 17:10:11 passerelle uwsgi[693211]:     conf.LazySettings.__getattr__ = lambda self, name: getattr(self._wrapped, name)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/django/conf/__init__.py", line 172, in __getattr__
Dec 21 17:10:11 passerelle uwsgi[693211]:     return getattr(self.default_settings, name)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 76, in __getattr__
Dec 21 17:10:11 passerelle uwsgi[693211]:     return getattr(self.get_wrapped(), name)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 71, in get_wrapped
Dec 21 17:10:11 passerelle uwsgi[693211]:     return self.get_tenant_settings(self.default_settings, tenant)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 59, in get_tenant_settings
Dec 21 17:10:11 passerelle uwsgi[693211]:     wrapped, tenant, tenant_settings, last_time)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings.py", line 44, in load_tenant_settings
Dec 21 17:10:11 passerelle uwsgi[693211]:     loader_instance.update_settings(tenant_settings, tenant)
Dec 21 17:10:11 passerelle uwsgi[693211]:   File "/usr/lib/python2.7/dist-packages/hobo/multitenant/settings_loaders.py", line 212, in update_settings
Dec 21 17:10:11 passerelle uwsgi[693211]:     module_name = settings.SETTINGS_MODULE.split('.')[0]
Dec 21 17:10:11 passerelle uwsgi[693211]: AttributeError: 'NoneType' object has no attribute 'split'
Dec 21 17:10:11 passerelle uwsgi[693211]: {address space usage: 1444126720 bytes/1377MB} {rss usage: 133840896 bytes/127MB} [pid: 693217|app: 0|req: 884/5244] 0.0.0.0 () {40 vars in 1115 bytes} [Fri Dec 21 17:10:11 2018] GET /atos-genesys/genesys-preprod/dossiers?orig=departement06.test.entrouvert.org&NameID=562eaec5c2914f52a2d592673e22c4c6&link_id=69&algo=sha256&timestamp=2018-12-21T16%3A10%3A11Z&nonce=1d77ad4316cac175c323a13e31ffe622L&signature=CNar5TZiIFvQsmO2cm/7fH7w0ZqopUQa1Q/YuMjkDbA%3D => generated 0 bytes in 11 msecs (HTTP/1.0 500) 0 headers in 0 bytes (0 switches on core 0)

Donc on a une requête qui arrive, pendant ce temps le thread de genesys fait des mises à jour du cache, qui font des appels HTTL via BaseResource.request et bim ça log une erreur, et bim ça fait override_settings() en plein milieu du traitement de la requête et ThemeSettings se retrouve avec un UserSettingsHolder sous les pieds et ça plante, une fois le override_settings() terminé tout est défait et ça remarche, d'où l'intermittence.

Je n'ai pas d'idée de fix pour l'instant, mais au moins on sait d'où ça vient.

#8

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Je vais juste virer ces histoires de threads dans atos-genesys.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Projet changé de Hobo à Passerelle
  • Assigné à changé de Frédéric Péters à Benjamin Dauvergne
#11

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Mais accéder à SETTINGS_MODULE reste une mauvaise idée vu que ça ne marche pas toujours (ça pourra péter dans des tests qui utiliseront override_settings()).

#12

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Tracker changé de Support à Bug
  • Statut changé de En cours à Solution validée

Ok et j'ai créé #29323 pour reprendre mon patch côté hobo, et #29322 pour ne plus faire de override_settings dans passerelle (mais je n'y offre pas de patch).

#13

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)

Je pousse parce qu'on voudra ça en production et donc avoir un peu de temps sur la recette, en y espérant des gens pour tester, ça va aider.

commit 5bee389a6398d7565d9590237775cfd5baaf17b6
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Sat Dec 22 01:04:59 2018 +0100

    atos-genesys: do not use threads (#29320)

    As threads were hiding errors from asynchronous requests, we now still
    hide errors when cache is full, but log them.
#14

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#15

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Statut changé de Solution déployée à Fermé

Formats disponibles : Atom PDF