Projet

Général

Profil

Anomalie #7073

creoled : si on interroge le client au moment d'un reload => variable inexistante

Ajouté par Emmanuel GARETTE il y a environ 10 ans. Mis à jour il y a environ 10 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Catégorie:
-
Début:
27/01/2014
Echéance:
07/02/2014
% réalisé:

100%

Temps passé:
Distribution:
EOLE 2.4

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

Lié à creole - Anomalie #7293: Le rechargement dynamique des fichiers extras ne fonctionne pas Fermé 03/02/2014 21/02/2014
Lié à creole - Evolution #7427: L'echec de la sauvegarde de la configuration Creole n'est pas géré Fermé 04/04/2014

Révisions associées

Révision c4676160 (diff)
Ajouté par Daniel Dehennin il y a environ 10 ans

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

Révision 858c7f1c (diff)
Ajouté par Ghislain Loaec il y a environ 10 ans

server.py: Ne supprime pas l'ancienne config en cas de problème de rechargement d'un nouvelle - Ref: #7073

Révision ea11be7e (diff)
Ajouté par Ghislain Loaec il y a environ 10 ans

server.py: Garde la reférence à l'ancienne config sans la supprimer - Ref: #7073

Révision 62908ab7 (diff)
Ajouté par Ghislain Loaec il y a environ 10 ans

Reload config on extra config add/edit/remove - Fixes: #7293
Reload values only if modif occurs in *.eol files - Ref: #7073

Révision 40ac9c8f (diff)
Ajouté par Ghislain Loaec il y a environ 10 ans

Handle concurrent config reload with thread lock - Ref: #7073

Révision ac918783 (diff)
Ajouté par Ghislain Loaec il y a environ 10 ans

Import json inutile
Précautions à l'ouverture du config.eol, gestion d'écriture/lecture concurrente - Fixes: #7073

Révision 9b5deb44 (diff)
Ajouté par Joël Cuissinat il y a environ 10 ans

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 :

  1. Détection d’une modification dans un répertoire surveillé (source:creole/server.py?rev=ad3caac#L450)
  2. Ne prendre en compte que les dictionnaires ou le fichier config.eol (source:creole/server.py?rev=ad3caac#L121)
  3. Lancer le rechargement de la configuration (source:creole/server.py?rev=ad3caac#L127)
  4. 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

#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

#13 Mis à jour par Joël Cuissinat il y a environ 10 ans

  • Statut changé de Résolu à Fermé
Pas de plantage constaté avec :
  • console n°1 :
    root@horus:~# while [ 0 ]; do CreoleSet nom_machine toto; done
    

    * console n°2 (en parallèle) :
    root@horus:~# reconfigure 
     [ ... ]
        Reconfiguration OK
    

Formats disponibles : Atom PDF