Thread-unsichere Lazy Initialization in PostActionType

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:

3 „Gefällt mir“

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?

2 „Gefällt mir“

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.

1 „Gefällt mir“

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.

2 „Gefällt mir“

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,
  )
  # ...
2 „Gefällt mir“

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.

3 „Gefällt mir“

Hier ist ein PR:

4 „Gefällt mir“

Dieses Thema wurde nach 4 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.