Bei meinem aktuell in Arbeit befindlichen Plugin kam mir soeben mit Schrecken die Befürchtung, dass ich in eine Race-Condition Falle laufen könnte.
Das Problem:
Das funktioniert auch ganz prächtig. Nun ist mir aber jäh bewusst geworden, dass der wiregated ja einen Lauscher-thread fährt, also nebenläufig agiert. Das heißt denn ja wohl, dass das Plugin zwei mal (fast) gleichzeitig laufen kann, wenn denn zwei geeignete Telegramme hintereinader im eiblisten_thread aufschlagen.
Die Konsequenz kann dann wohl sein, dass Folgendes passiert:
Ist das so? Den Begriff "semaphore" habe ich im wiregated nicht gefunden (kann man ja auch nicht unbedingt erwarten). Da wird mehrfach $plugindb->sync() aufgerufen, aber ich habe die Mechanik noch nicht ganz durchschaut.
- Gibts da ein Mittel, 'best practices' oder dergleichen?
- Oder hab ich im wiregated vielleicht was übersehen?
Vielleicht kann makki dazu was sagen. Nein, ich verlange für die Plugins keine thread-safety, war m.W. ja nie vorgesehen. Aber vielleicht gibts ja eine Lösung - oder ich liege sowieso vollkommen falsch, das wäre am Schönsten ;-)
Das Problem:
- Ich bediene mit dem Plugin ein gutes Dutzend RTR.
- Der Status eines jeden RTR wird plgun-intern in einem hash namens %Conf zwischen-gespeichert, der am Ende in plugin_info landet
- CODE: $plugin_info{$plugname.'_conf'} = freeze(\%Conf);
- Bei jedem Aufruf des Plugins wird eben dieser Hash wieder aus plugin_info zurückgelesen:
- CODE: %Conf=%{thaw($plugin_info{$plugname.'_conf'})};
- und am Ende dann wieder mit freeze in _conf zurückgeschrieben, usw.
Das funktioniert auch ganz prächtig. Nun ist mir aber jäh bewusst geworden, dass der wiregated ja einen Lauscher-thread fährt, also nebenläufig agiert. Das heißt denn ja wohl, dass das Plugin zwei mal (fast) gleichzeitig laufen kann, wenn denn zwei geeignete Telegramme hintereinader im eiblisten_thread aufschlagen.
Die Konsequenz kann dann wohl sein, dass Folgendes passiert:
- Telegramm eins kommt an, geht ans Plugin, Instanz 1.
- Instanz 1 entpackt _conf in den eigenen Hash.
- Telegramm zwei kommt an, geht ans Plugin, Instanz 2
- Instanz 2 entpackt _conf ebenfalls in seinen eignen Hash.
- Instanz 1 ist fertig, schreibt seinen aktualiserten Hash wieder in _conf.
- Instanz 2 ist kurz danach fertig, und schreibt seinerseits seinen aktualisierten Hash in _conf.
- Damit sind die Änderungen von Instanz 1 verloren.
Ist das so? Den Begriff "semaphore" habe ich im wiregated nicht gefunden (kann man ja auch nicht unbedingt erwarten). Da wird mehrfach $plugindb->sync() aufgerufen, aber ich habe die Mechanik noch nicht ganz durchschaut.
- Gibts da ein Mittel, 'best practices' oder dergleichen?
- Oder hab ich im wiregated vielleicht was übersehen?
Vielleicht kann makki dazu was sagen. Nein, ich verlange für die Plugins keine thread-safety, war m.W. ja nie vorgesehen. Aber vielleicht gibts ja eine Lösung - oder ich liege sowieso vollkommen falsch, das wäre am Schönsten ;-)
Kommentar