Salut a tous,

Apres 2 semaines au bord du suicide a buter sur une segfault, je m'en viens
quemander du partage d'experience parmi vous.

Background:

Nouvelle boite pour moi. Le mois dernier a ete consacrer a migrer notre
appli de:

- rails 3.2.19 vers rails 4.2 (en passant par rails 4.0 et 4.1 au milieu
pour rendre le process plus souple)
- ruby 2.0.0 vers ruby 2.2.1 (en passant par 2.1.5 au milieu)

Y'a 3 ans de dev dessus, beaucoup de legacy, et la suite sera de refactorer
tout ca, splitter l'appli en 4 tiers etc..

Toute la migration s'est plutot bien deroulee, jusqu'a ce qu'on deploie en
prod et que l'on voie apparaitre des exception sans aucun sens, disant que
notre data contenait des false et des nil a des endroits completement
illogiques (et qui disparaissaient immediatement quand on faisait on
rollback de l'app). Et une derniere qui disait carrement qu'une string
contenait un nullbyte.

En meme temps, on a constate sur newrelic que les instance unicorn
redemarraient en boucle comme des malades, mais sans que la consommation de
memoire ne bouge. La frequence etant trop elevee pour conclure a un leak,
ou alors tellement massif qu'on n'aurait pas pu l'eviter en developement.

Apres 1 semaine a ne pas comprendre ces exceptions, a constater le
caractere tres aleatoire de leurs apparitions, j'ai fait le postulat que
c'etait des segfault. Il m'a fallu 2 jours de plus pour les faire
apparaitre.

Evidemment le probleme est impossible a reproduire en environnement de
developement. Meme en demarrant l'appli avec les parametres de production
en local (ce qui est tres complique de plus a cause des CDN, des serveurs
de cache etc..).
Nous n'avons toujours pas non plus reussi a le reproduire en console, donc
nous avons un protocole assez nul pour reproduire l'erreur (spammer le
serveur sur une action precise).

Nous avons tout de meme trouve un fix qui nous permet de ne plus avoir le
probleme, mais ca ne resoud pas l'erreur qui est en dessous et qu'on
n'arrive pas a identifier.

Le probleme:

J'ai d'un cote, un modele (Page) qui a une propriete "content". Il s'agit
d'un JSON serialize, qui est plutot massif 90% du temps (legacy code).

Au milieu un controller, qui fait trop de travail
Enfin, plusieurs vues parce qu'on utilise gon + jbuilder et un bon vieux
template haml (legacy, ya un plan pour switcher en SPA avec Rails::API en
backend)

Regulierement (environ 5% du temps), je me mange une segfault quand
j'essaie d'acceder a la propriete "content" de mon objet Page. La variable
ne contient plus rien, car elle a ete garbage collected, bien qu'etant
toujours referencee pourtant.
Le caractere aleatoire etant quand est ce que GC a ete trigger. Il y a
plusieurs "mauvais endroits" ou il peut etre trigger et cela resulte en des
exceptions differentes (parce qu'on n'accede pas au meme clefs du hash,
mais le principe reste le meme).

Le fix temporaire a ete de desactiver GC pour cette action (et 5 autres
dans le meme controller qui ont un comportement similaire mais qui n'ont
jamais fail, par precaution), au moyen de before_action et after_action
(pas de OobGc donc).
Ca nous permet de faire tourner l'appli en prod mais le code "defectueux"
le reste. Nous cherchons donc a comprendre et resoudre ce probleme une
bonne fois pour toutes, mais nous n'avons absolument aucune idee de ce qui
peut pousser GC a nous virer nos objets.

Le probleme est present en ruby 2.1.5 et en ruby 2.2.0 (et 2.2.1)

J'avais deja experimente un probleme similaire d'objets GCed alors qu'ils
n'auraient pas du (ruby 2.2.0+ only):

define_method :"#{attr}=" do ... end dans un module pour AR acts_as like.
Quand je sauvais l'objet, AR#save activait le GC et tous mes writers
disparaissaient de la table des methodes de ma classe (donc
obj.respond_to?(:attr=) renvoyait false) et je me mangeais des
NoMethodError. Le fix a ete de virer le : au debut de la string pour en
faire une string qui sera transformee en symbol immortel par la suite.

Avez vous deja vu ce genre de choses? Je n'ai trouve personne qui pleurait
sur google que GC degageait des objets absolument "vivants", alors que j'ai
experimente le probleme 2x en 2 semaines.
Si vous avez deja vu ca, y'a-t-il une raison evidente que je loupe, et/ou
un fix solide?
Je suis aussi preneur de tout conseil qui pourrait m'aider a trouver
l'origine de l'erreur.

Merci d'avance :)

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Reply via email to