← Back to team overview

kassie team mailing list archive

Re: Problème, entre hotboot et enregistrement

 

Salut à tous,

Bon, pas d'idées brillantes pour l'instant, ni de moi ni de vous apparemment. J'ai mis un petit patch en place et je vous incite à tester à fond l'hotboot pour essayer de reproduire ce fichu bug. Une fois qu'on aura réussi à le reproduire de façon certaine, on pourra déjà avancer. Mais ce semble être un bug flottant, d'autant plus irritant.

Mon patch est simple et il ne doit pas avoir beaucoup d'utilité : quand on récupère un objet BaseObj, la méthode __setstate__ est appelée (ça c'est pickle qui le fait). Je récupère la classe de l'objet et j'appelle le constructeur en lui passant self. L'objet est reconstruit. Ensuite, je met à jour ses attributs.

L'avantage non négligeable c'est qu'on se balade plus avecv des dictionnaires d'attribut. On a des constructeurs tout ce qu'il y a de plus normaux avec une liste d'attributs, l'héritage est bien mieux supporté... bref que du mieux. Mais on ne sait pas ce qu'il advient de de satané bug.

Pour résoudre efficacement le problème, l'idéal serai de disposer d'un traçage des objets créés. Ce qui serai bien c'est de pouvoir savoir où ont été défini tous les objets BaseObj. Je ne sais pas si c'est faisable comme ça, je n'ai pas encore trouvé à vrai dire, même si le module 'gc' a l'air de proposer quelque chose d'intéressant. Ca simplifirai beaucoup la gestion des références multiples notamment : quand on récupère un objet, on peut dire "hop hop hop, il a été détruit" et mettre tous les attributs contenant la référence à None. Pour l'instant, je n'ai pas trouvé comment faire ça (un objet ne sait pas où il a été défini).

Si vous avez des idées brillantes, n'hésitez plus. Je serai probablement sur l'IRC une grande partie de la semaine prochaine, l'avantage des vacances.

D'ailleurs, un joyeux Noël à tous ;) .

Kredh

Le 19/12/2010 18:10, Kredh a écrit :
Salut à tous,

Le hotboot, redémarrage à chaud des modules, a été mis en place depuis quelques jours et stabilisé (en gros) depuis hier. C'est assez pratique, je dois dire, ça fait joli dans le paysage et tout.

Mais ce pose un problème assez grave : au moment du hotboot, les anciennes instances des objets à enregistrer sont pour la plupart rechargées. On se retrouve avec des instances toutes neuves, en conformité avec les classes que l'on vient de recharger. Cependant, les anciennes instances ne sont, hélas, pas détruites.

Voilà le cas classique : on recharge tous les modules, dont le module connex qui gère les comptes. Les instances des comptes sont récupérés dans des fichiers. Chaque compte contient un dictionnaire de ses joueurs. Et ces instances de joueurs sont les anciennes, pas les nouvelles. Ca pose problème pour Python et surtout pour pickle. Il a des objets dont il n'arrive pas à retrouver la classe (où plutôt dont la classe n'a pas la même signature qu'auparavant).

J'avais mis en place un système pour que chaque objet soit mis à jour à la récupération. Cependant, cette mise à jour concerne les dictionnaire des attributs. Je crois qu'il est impossible de changer l'identité d'un objet ou son type.

Autrement dit, si on veut mettre un jour les comptes, il faut réinitialiser tous les joueurs contenus dedans.

Et c'est une opération qu'il va être nécessaire de répéter des milliers de fois.

Donc (et dsl pour le message un peu long), si vous avez une idée pour automatiser cette mise à jour, faites-la parvenir. Et si ce n'est pas très clair, postez vos questions, aussi bien.

Kredh

_______________________________________________
Mailing list: https://launchpad.net/~kassie
Post to     : kassie@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~kassie
More help   : https://help.launchpad.net/ListHelp





References