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 .