Tabellenname-Fehler in ActiveRecord

8

Sporadisch erhalten wir PG::UndefinedTable Fehler bei der Verwendung von ActiveRecord. Der Name der Assoziationstabelle ist etwas wie beschädigt und ich sehe es oft Cancelled wird an das Ende des Tabellennamens angehängt.

Beispiel:

%Vor%

Im obigen Beispiel habe ich den Tabellennamen mit foo und bar verschleiert.

Wir sehen diesen Fehler, wenn das Schienenprojekt in Puma ausgeführt wird. Warteschlange Arbeiter scheint in Ordnung zu sein.

Die Tabellen in der Fehlermeldung entsprechen nicht realen Tabellen oder Modellen. Es sieht wie der Fall von Speicherbeschädigung aus. Hat jemand solche Probleme gesehen? Wenn ja, wie hast du es geschafft?

puma.rb

%Vor%

datenbank.yml

%Vor%     
Harish Shetty 15.02.2018, 21:24
quelle

2 Antworten

1

Es sieht so aus, als ob ernten_Frequenz das Problem sein könnte. Ich habe ein paar Behauptungen gefunden, dass sie einen Threading Bug haben könnten. Ich würde versuchen, diese Option zu entfernen oder auf Null zu setzen und zu sehen, ob das funktioniert. Die einzige andere Sache, an die ich denken kann, ist, wenn Sie Thread.new manuell aufrufen und aktiven Datensatz darin verwenden. Hier sind die wenigen Ansprüche gegen das Ernten:

Ссылка

Ссылка

Suche nach "Fürchte den Schnitter" hier: Ссылка

    
Cody Gustafson 23.02.2018 01:53
quelle
1

Ich wage hier eine Vermutung, basierend auf diesem möglicherweise damit verbundenen Fehler ...

Aber Sie könnten entweder:

  1. ruft fork in Ihrer Anwendung auf; ODER
  2. Aufruf von ActiveRecord-Routinen (mithilfe von Datenbankaufrufen), bevor der Server (PUMA) seine Worker-Prozesse (während der App-Initialisierung) verzweigt.

Beides führt zu einer Unterbrechung der ActiveRecord-Synchronisation und dazu, dass mehrere Prozesse den Datenbankverbindungspool freigeben, ohne dessen Verwendung zu synchronisieren (was zu Interlaced- und beschädigten Datenbankbefehlen führt).

Wenn Sie fork verwenden, müssen Sie alle ActiveRecord-Datenbankverbindungen schließen und den Verbindungspool neu initialisieren (es gibt einen Funktionsaufruf, der das tut, aber ich erinnere mich nicht an meinen Kopf, vielleicht ActiveRecord.disconnect! oder ActiveRecord.connection_pool.disconnect! ).

Andernfalls müssen Sie vor dem Ausführen von Puma (entweder während des Initialisierungsprozesses oder unter Verwendung von Pumas after_fork ) alle ActiveRecord-Datenbankverbindungen schließen und den Verbindungspool neu initialisieren.

    
Myst 01.03.2018 13:59
quelle