Project

General

Profile

Anomalie #7073

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

Added by Emmanuel GARETTE over 10 years ago. Updated over 10 years ago.

Status:
Fermé
Priority:
Haut
Assigned To:
Category:
-
Start date:
01/27/2014
Due date:
02/07/2014
% Done:

100%

Spent time:
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.


Related issues

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

Associated revisions

Revision c4676160 (diff)
Added by Daniel Dehennin over 10 years ago

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

Revision 858c7f1c (diff)
Added by Ghislain Loaec over 10 years ago

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

Revision ea11be7e (diff)
Added by Ghislain Loaec over 10 years ago

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

Revision 62908ab7 (diff)
Added by Ghislain Loaec over 10 years ago

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

Revision 40ac9c8f (diff)
Added by Ghislain Loaec over 10 years ago

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

Revision ac918783 (diff)
Added by Ghislain Loaec over 10 years ago

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

Revision 9b5deb44 (diff)
Added by Joël Cuissinat over 10 years ago

Correction de la sauvegarde en cas de fichier absent

Fixes #7073 @30m

History

#1 Updated by Emmanuel GARETTE over 10 years ago

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 Updated by Daniel Dehennin over 10 years ago

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 Updated by Daniel Dehennin over 10 years ago

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 Updated by Joël Cuissinat over 10 years ago

  • Target version changed from Eole 2.4-RC1 to Eole 2.4-RC2

#5 Updated by Emmanuel GARETTE over 10 years ago

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 Updated by Emmanuel GARETTE over 10 years ago

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 Updated by Emmanuel GARETTE over 10 years ago

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 Updated by Ghislain Loaec over 10 years ago

  • Due date set to 02/07/2014
  • Start date set to 01/27/2014
  • % Done changed from 0 to 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 Updated by Ghislain Loaec over 10 years ago

  • Status changed from Nouveau to Résolu
  • % Done changed from 80 to 100

#10 Updated by Daniel Dehennin over 10 years ago

  • Assigned To set to Ghislain Loaec

#11 Updated by Joël Cuissinat over 10 years ago

  • Status changed from Résolu to À valider
  • % Done changed from 100 to 80

Si il le fichier /etc/eole/config.eol n'existe pas la sauvegarde échoue (et en plus sans erreur apparente #7427) !

#12 Updated by Joël Cuissinat over 10 years ago

  • Status changed from À valider to Résolu
  • % Done changed from 80 to 100

#13 Updated by Joël Cuissinat over 10 years ago

  • Status changed from Résolu to 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
    

Also available in: Atom PDF