Bizarre ActiveRecord-Probleme - wie das Generieren ungültiger SQL

9

Vor kurzem haben wir eine neue Version unserer App bereitgestellt, und seitdem haben wir einige wirklich seltsame Probleme mit ActiveRecord gesehen. Zum Beispiel, hier ist ein Schnipsel einer Abfrage, die es hunderte Male pro Tag normalerweise richtig erzeugt:

%Vor%

Das ist kein Tippfehler, t1_r26 fehlt dort, obwohl es einen Platz gibt, wo es sein sollte. Aber nur dieses eine Mal. Das ist auch kein handgeschriebenes SQL, das ist ActiveRecord, das die Abfrage schreibt und über alle Platzhaltervariablen entscheidet. Es hat in ähnlicher Weise andere Abfragen verpfuscht, die Dinge leer lassen, die nicht leer sein sollten (sollte nicht einmal möglich sein), aber nur einmal von Zeit zu Zeit. Die meiste Zeit ist es in Ordnung.

Wir sehen auch viele Fälle, in denen es sich über Dinge wie table_alias oder Reflektion beschwert, die eine undefinierte Variable oder Methode für false sind: FalseClass. Das ist richtig ... aber die Sache, die eine FalseClass ist, sollte ein ActiveRecord-Modell sein. Wir haben keine Ahnung, wie das passiert oder wie wir möglicherweise einen Fehler in unserem Rails-Code geschrieben haben, der das meiste davon tun würde (besonders die ungültige Abfrage oben).

Wir befinden uns auf Rails 4.1.16 (wir haben von 4.1.8 aktualisiert, als dies begann) mit Ruby 2.2.0 in Passenger 5.0.26 (geht weiter zu 5.0.30). Diese Fehler sind extrem sporadisch und keiner von ihnen ergibt einen Sinn. Aus Tausenden von Anfragen pro Tag resultiert nur eine kleine Handvoll von ihnen (weniger als 10 auf 5 Servern) in einem dieser seltsamen Fehler, und wir können sie nicht absichtlich reproduzieren.

Mein gesamtes Team ist ratlos. Wir haben Stunden damit verbracht, über Codeänderungen nachzudenken und können nichts sehen, was dazu führen könnte. Wir wissen nicht einmal, was wir möglicherweise geschrieben haben könnten, was dazu führen würde, dass ActiveRecord manchmal eine schlechte Abfrage in einer Weise schreibt, die wir nicht beeinflussen können. Wir haben keine Ahnung, wie wir mit der Fehlersuche beginnen können. Hat jemand da draußen einen Hinweis, der uns in eine nützliche Richtung weisen könnte?

Update: Hier ist eine neue, die es heute Morgen warf. Beachten Sie, dass LibraryItem eines unserer recht einfachen ActiveRecord-Modelle ist:

%Vor%

Ich ... habe keine Ahnung.

    
bkocik 13.09.2016, 00:19
quelle

1 Antwort

0

Um die Schleife für diejenigen zu schließen, die versuchten zu helfen und für jeden, der darin stolperte: Wir haben es geheilt, indem wir die MRT verbessert haben. Wir waren etwa ein Jahr auf Version 2.2.0 unterwegs, weshalb wir es nicht sofort ahnten und auch, weil dies mit einer bestimmten Bereitstellung begann. Ich bekam einen Tipp, als wir ein paar Fehler über die Unfähigkeit sahen, Speicher zu reservieren, und als die MRI in einem Hagel von Granatsplittern auf einem Server explodierte (womit ich meine, dass sie segregierten) und Passagier mit sich nahm.

Von da an begann ich mich mit MRT-Changelogs zu befassen und bemerkte eine Tonne von Speicher- und GC-bezogenen Bugfixes zwischen 2.2.0 und 2.2.5. Letzte Nacht haben wir ein Upgrade auf 2.2.5 mit einem Deployment durchgeführt und (Daumen drücken) haben wir noch kein einziges dieser seltsamen Probleme gesehen. (Früher sahen wir 12-20 pro Tag oder mehr, abhängig vom Verkehr).

Also, warum ist es nach einer Bereitstellung für uns passiert? Ich weiß es nicht genau, aber ich achte darauf: Ich denke, dass die Größe in Bytes unserer Anwendung im Speicher schließlich eine kritische Masse erreichte, bei der es einen oder mehrere der MRI-Fehler auszulösen begann, die zwischen 2,2 fixiert waren. 0 und 2.2.5. Am besten kann ich mir vorstellen.

Ein großes Dankeschön an alle, die eingesprungen sind, um zu helfen!

    
bkocik 24.10.2016, 21:31
quelle