Anomalie #7073
creoled : si on interroge le client au moment d'un reload => variable inexistante
Description
Si on interroge creoled lors du reload, le serveur répond que la variable n'existe pas alors qu'elle existe mais les dictionnaires sont en court de chargement.
Il faudrait une temporisation, et que le serveur ne répond que lorsque le dictionnaire est vraiment chargé.
Pour reproduire, enregistrer un dictionnaire et faire la templatisation d'un template.
Exemple :
# CreoleCat -t 50-nat_rules root - Erreur: Utilisation d'une variable non existante dans le template de /usr/share/eole/bastion/data/50-nat_rules : u'container_ip_web' # CreoleCat -t 50-nat_rules # CreoleCat -t 50-nat_rules #CreoleCat -t 50-nat_rules
Si un agent ou autre fait un appel au client lors d'un reload, cela peut provoquer des dysfonctionnements.
Demandes liées
Révisions associées
Creoled recharge des dicos vides
L’utilisation d’un éditeur de texte comme vi sur un fichier de dico fait
recharger « creoled » sur des fichiers vides.
- creole/server.py (_inotify_filter): Prend en argument un événement
inotify complet.
Les fichiers non accessibles et les fichiers créés à vide ne doivent
pas être pris en compte.
(CreoleInotifyHandler.process_default): Passage de l’événement inotify
complet au prédicat de filtre.
Ref: #7073 @45m
server.py: Ne supprime pas l'ancienne config en cas de problème de rechargement d'un nouvelle - Ref: #7073
server.py: Garde la reférence à l'ancienne config sans la supprimer - Ref: #7073
Handle concurrent config reload with thread lock - Ref: #7073
Import json inutile
Précautions à l'ouverture du config.eol, gestion d'écriture/lecture concurrente - Fixes: #7073
Correction de la sauvegarde en cas de fichier absent
Fixes #7073 @30m
Historique
#1 Mis à jour par Emmanuel GARETTE il y a environ 10 ans
Autre erreur observée :
creoled - 'NoneType' object has no attribute 'cfgimpl_get_meta' Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/creole/server.py", line 229, in get withvalue=withvalue)) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 441, in make_dict self._make_sub_dict(opt, path, pathsvalues, _currpath, flatten) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 452, in _make_sub_dict path.split('.')) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 441, in make_dict self._make_sub_dict(opt, path, pathsvalues, _currpath, flatten) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 457, in _make_sub_dict value = self._getattr(opt._name) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 251, in _getattr force_permissive=force_permissive) File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 165, in getitem force_properties, validate_properties) File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 234, in _getitem if config_error is None and self._is_default_owner(path) and \ File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 322, in _is_default_owner return self._getowner(path) == owners.default File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 288, in _getowner meta = self.context().cfgimpl_get_meta() AttributeError: 'NoneType' object has no attribute 'cfgimpl_get_meta'
#2 Mis à jour par Daniel Dehennin il y a environ 10 ans
Le processus de reload est basé sur inotify
:
- Détection d’une modification dans un répertoire surveillé (source:creole/server.py?rev=ad3caac#L450)
- Ne prendre en compte que les dictionnaires ou le fichier
config.eol
(source:creole/server.py?rev=ad3caac#L121) - Lancer le rechargement de la configuration (source:creole/server.py?rev=ad3caac#L127)
- Chargement de la nouvelle config par
creole_loader
(source:creole/server.py?rev=ad3caac#L148)
Si l’opération d’assignation est atomique, l’appel à creole_loader
construit un nouvel object complet et ensuite la configuration du serveur est remplacée.
Les requêtes doivent donc utiliser l’ancienne configuration jusqu’à ce que self.config
soit remplacé.
Je pense que le loup ce cache à cet endroit là, je ne sais pas si python à un mécanisme de verrou sur les attributs d’un objet.
#3 Mis à jour par Daniel Dehennin il y a environ 10 ans
Je propose de filtrer la création de fichier avec une taille 0 pour éviter des soucis aux personnes qui font des vim
directement sur les dicos ;-)
Par contre, un MODIFY
qui vide un fichier sera pris en compte, tout comme la copie d’un fichier vide.
#4 Mis à jour par Joël Cuissinat il y a environ 10 ans
- Version cible changé de Eole 2.4-RC1 à Eole 2.4-RC2
#5 Mis à jour par Emmanuel GARETTE il y a environ 10 ans
L'erreur : "AttributeError: 'NoneType' object has no attribute 'cfgimpl_get_meta'" est bien un problème lié à creoled.
Elle arrive quand l'objet "self.config" est remplacer au milieu du make_dict sur une sous-config.
Le context étant supprimé, self.context() retourne None.
Il ne faut donc pas remplacer la config en plein milieu d'une requête.
Pour reproduire c'est simple :
from creole.loader import creole_loader a=creole_loader() b=a.creole b [...] del(a) b Traceback ....
Ce qui est logique.
Il faut donc conserver une référence à l'ancienne config lorsqu'on fait des actions sur une sous-config.
#6 Mis à jour par Emmanuel GARETTE il y a environ 10 ans
Pour reproduire (mais pas à tous les coups) :
Démarrer creoled en mode debut et dans une autre console :
CreoleSet nom_machine toto &
err=0;while [ $err = 0 ]; do CreoleGet .creole || err=1; done
Si ca tombe au mauvais moment on a :
[...] creoled - File with null size: /etc/eole/config.eol creoled - Filtered inotify event for /etc/eole/config.eol creoled - Reload due to IN_MODIFY on /etc/eole/config.eol 127.0.0.1 - - [31/Jan/2014:12:10:08] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:08] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:08] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:09] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:09] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:09] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:10] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:10] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:11] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:11] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole?variable=container_ip_fichier HTTP/1.1" 200 38 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole?variable=container_path_proxy HTTP/1.1" 200 29 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole?variable=container_path_mail HTTP/1.1" 200 29 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole?variable=container_ip_proxy HTTP/1.1" 200 38 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:12] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:13] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:13] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:13] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:13] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:14] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:14] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:14] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:14] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:15] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:15] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:15] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:15] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:15] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:16] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:16] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:16] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:16] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:16] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:17] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:17] "GET /get/creole HTTP/1.1" 200 15189 "" "restkit/3.3.2" 127.0.0.1 - - [31/Jan/2014:12:10:17] "GET /reload_config HTTP/1.1" 200 31 "" "restkit/3.3.2" creoled - 'NoneType' object has no attribute 'cfgimpl_get_meta' Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/creole/server.py", line 234, in get withvalue=withvalue)) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 441, in make_dict self._make_sub_dict(opt, path, pathsvalues, _currpath, flatten) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 452, in _make_sub_dict path.split('.')) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 441, in make_dict self._make_sub_dict(opt, path, pathsvalues, _currpath, flatten) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 457, in _make_sub_dict value = self._getattr(opt._name) File "/usr/lib/python2.7/dist-packages/tiramisu/config.py", line 251, in _getattr force_permissive=force_permissive) File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 165, in getitem force_properties, validate_properties) File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 234, in _getitem if config_error is None and self._is_default_owner(path) and \ File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 322, in _is_default_owner return self._getowner(path) == owners.default File "/usr/lib/python2.7/dist-packages/tiramisu/value.py", line 288, in _getowner meta = self.context().cfgimpl_get_meta() AttributeError: 'NoneType' object has no attribute 'cfgimpl_get_meta'
#7 Mis à jour par Emmanuel GARETTE il y a environ 10 ans
J'ai des gros problèmes de stabilité lorsque je fais une boucle sur CreoleSet :
while [ 0 ]; do CreoleSet nom_machine toto; done
Exemple d'erreurs :
creoled - Reload due to IN_MODIFY on /etc/eole/config.eol Traceback (most recent call last): Segmentation fault
2014-02-03 17:08:49,271: creoled - Unable to load creole configuration: Erreur lors du parsing du fichier /usr/share/eole/creole/dicos/20_esu.xml : invalid event name 'invalid event name '/usr/share/eole/creole/dicos/20_fichier.xml'' 2014-02-03 17:08:49,272: creoled - Unable to load creole configuration: Erreur lors du parsing du fichier /usr/share/eole/creole/dicos/20_fichier.xml : invalid event name '/usr/share/eole/creole/dicos/20_fichier.xml
2014-02-03 16:59:49,062: creoled - Reload due to IN_MODIFY on /etc/eole/config.eol 2014-02-03 16:59:49,064: creoled - Unable to load creole configuration: Erreur lors du parsing du fichier /usr/share/eole/creole/dicos/00_common.xml : maximum recursion depth exceeded while getting the repr of a tuple
#8 Mis à jour par Ghislain Loaec il y a environ 10 ans
- Echéance mis à 07/02/2014
- Début mis à 27/01/2014
- % réalisé changé de 0 à 80
Problème d'écriture/lecture concurente des fichiers config.eol. Besoin d'implémenter un système de file lock :
Le fichier est lu en cours d'écriture.
Erreur obtenue avec 4 CreoleSet concurrents :
fichier de configuration invalide 2.2 ou 2.3: /etc/eole/config.eol : File contains no section headers. file: /etc/eole/config.eol, line: 1 '{"libelle_etab": {"owner": "gen_config", "val": "Test Etab"}, "system_mail_to": {"owner": "gen_config", "val": "admin@eolebase"}, "eth0_method": {"owner": "gen_config", "val": "dhcp"}, "exim_relay_smtp": {"owner": "gen_config", "val": "127.0.0.1"}, "netmask_ssh_eth0": {"owner": "gen_config", "val": ["0.0.0.0"]}, "ip_admin_eth0": {"owner": "gen_config", "val": ["0.0.0.0"]}, "numero_etab": {"owner": "creoleset", "val": "000-UAI"}, "nom_machine": {"owner": "creoleset", "val": "tutu"}, "netmask_admin_eth0": {"owner": "gen_config", "val": ["0.0.0.0"]}, "domaine_messagerie_etab": {"owner": "gen_config", "val": "monetab.ac-aca.fr"}, "nom_academie": {"owner": "gen_config", "val": "ac-dijon"}, "ip_ssh_eth0": {"owner": "gen_config", "val": ["0.0.0.0"]}, "ovs_sw_name": {"owner": "gen_config", "val": "vswitch"}, "adresse_ip_dns": {"owner": "gen_config", "val": ["192.168.232.2"]}}' Erreur de propriété : La variable obligatoire 'libelle_etab' de la famille 'General' n'est pas renseignée ! La variable obligatoire 'nom_academie' de la famille 'General' n'est pas renseignée ! La variable obligatoire 'adresse_ip_eth0' de la famille 'Interface_0' n'est pas renseignée ! La variable obligatoire 'ip_ssh_eth0' de la famille 'Interface_0' n'est pas renseignée ! La variable obligatoire 'netmask_ssh_eth0' de la famille 'Interface_0' n'est pas renseignée ! La variable obligatoire 'ip_admin_eth0' de la famille 'Interface_0' n'est pas renseignée ! La variable obligatoire 'netmask_admin_eth0' de la famille 'Interface_0' n'est pas renseignée ! La variable obligatoire 'exim_relay_smtp' de la famille 'Messagerie' n'est pas renseignée ! La variable obligatoire 'domaine_messagerie_etab' de la famille 'Messagerie' n'est pas renseignée !
#9 Mis à jour par Ghislain Loaec il y a environ 10 ans
- Statut changé de Nouveau à Résolu
- % réalisé changé de 80 à 100
Appliqué par commit ac91878370e38b34d20bcdcca23d89557e94daee.
#10 Mis à jour par Daniel Dehennin il y a environ 10 ans
- Assigné à mis à Ghislain Loaec
#11 Mis à jour par Joël Cuissinat il y a environ 10 ans
- Statut changé de Résolu à À valider
- % réalisé changé de 100 à 80
Si il le fichier /etc/eole/config.eol n'existe pas la sauvegarde échoue (et en plus sans erreur apparente #7427) !
#12 Mis à jour par Joël Cuissinat il y a environ 10 ans
- Statut changé de À valider à Résolu
- % réalisé changé de 80 à 100
Appliqué par commit 9b5deb44231f318d5a16f7458783d0863db5b483.
#13 Mis à jour par Joël Cuissinat il y a environ 10 ans
- Statut changé de Résolu à Fermé
- console n°1 :
root@horus:~# while [ 0 ]; do CreoleSet nom_machine toto; done
* console n°2 (en parallèle) : root@horus:~# reconfigure [ ... ] Reconfiguration OK