Bug #29320
503 de temps à autres ...
0%
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
Historique
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).
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")
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Fichier 0001-multitenant-use-environment-to-get-application-name-.patch 0001-multitenant-use-environment-to-get-application-name-.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
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×tamp=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.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
Je vais juste virer ces histoires de threads dans atos-genesys.
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
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
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()).
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
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.
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
Mis à jour par Benjamin Dauvergne il y a environ 5 ans
- Statut changé de Solution déployée à Fermé
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.