Bei der Verwendung von Discourse in einer Multi-Thread-Ruby-Implementierung und einem Server (TruffleRuby/Puma) werden Fehler durch die unsichere Hash-Verwendung bei Flag-Einstellungen verursacht und dieses Lazy-Initialization-Muster muss eine doppelte Zuweisung vermeiden:
Löst ein einfacher Aufruf von PostActionType.flag_settings in einem Initializer das Problem? (z. B. einfach hier einfügen: discourse/config/initializers/000-mini_sql.rb at 3e0cb8ea47ea27cb3b564ac10656884739e4d78c · discourse/discourse · GitHub vorübergehend)
Ich schätze, wir könnten diesen Block auch synchronisieren. Gibt es noch andere gravierende Probleme, die Truffle aufwirft?
Ja, das sollte funktionieren.
Gibt es einen Grund, dies verzögert zu initialisieren?
Die eifrige Initialisierung würde Synchronisierungsprobleme vermeiden und wäre etwas schneller zugänglich sowie einfacher.
Ehrlich gesagt bin ich mir nicht sicher, ob diese Lazy-Initialisierung hier überhaupt Sinn macht, wir haben einen Hook für Plugins, um die gesamte Flaggenmenge zu ersetzen, aber das würde vor dem Initialisierer ausgelöst werden.
@roman, gibt es Bedenken bezüglich einer Eager-Initialisierung hier? Ich schätze, die triviale Lösung ist:
class << self
def flag_settings
...
end
end
flag_settings
Ich denke, der Hauptgrund dafür ist, dass Ruby kein sauberes Muster für Klasseninitialisierer liefert, was Entwickler dazu drängt, eigene zu erfinden/Lazy zu verwenden.
Es könnte auch so gemacht werden, was insbesondere vermeiden würde, die ivar zweimal zu lesen und deutlicher machen würde, dass sie eager-initialisiert ist (die Logik könnte zur Organisation natürlich auch in einer initial_flag_settings-Hilfsmethode stehen):
class << self
attr_reader :flag_settings
end
@flag_settings = FlagSettings.new
@flag_settings.add(
3,
:off_topic,
notify_type: true,
auto_action_type: true,
)
# ...
Ja, ich denke, die Eager-Initialisierung wäre hier sicher. Sie sollte auch nicht mit der Plugin-API in Konflikt geraten, die selten verwendet wird.
Hier ist ein PR:
Dieses Thema wurde nach 4 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.