Möglicher Deadlock beim Anlegen/Löschen von dynamischen Objekten
Bei der Korrektur von Fehler #29 (closed) ist leider ein Quasi-Deadlock entstanden, der in bestimmten seltenen Situationen zu Blockierungen führen kann.
Nach einem Auftrag zum Anlegen eines dynamischen Objekts verschickt die Konfiguration insgesamt 3 Antworten.
- Die normale Rückmeldung, dass der Befehl empfangen und verarbeitet wurde (positive Quittung wenn der Benutzer ausreichend Rechte hatte, das Objekt anzulegen)
- Die Meldung, dass ein neues dynamisches Objekt angelegt wurde (
DynamicObjectType.DynamicObjectCreatedListener
) - Die Meldung, dass die Elementmenge des Typs ein neues Element erhält (
MutableCollectionChangeListener
)
Nach dem Versenden des Auftrags wartet die DAF seit der Korrektur von #29 (closed) auf alle 3 Antworten, um sicherzustellen, dass das Objekt überall erfolgreich angekommen ist.
Der Deadlock entsteht, wenn der DynamicObjectType.DynamicObjectCreatedListener
als Reaktion auf eine Benachrichtigung ein neues dynamisches Objekt anlegt und gleichzeitig der MutableCollectionChangeListener
als Reaktion auf eine Benachrichtigung ebenfalls ein neues dynamisches Objekt anlegt. Beide Threads warten nun darauf, dass der jeweils andere Thread die Erzeugung des eigenen dynamischen Objekts meldet. Da beide Threads ja aber warten, erfolgt diese Meldung nicht.
Das Problem ist in KExDaV aufgefallen, da hier bei ungünstiger Parametrierung sowohl Mengenänderungen als auch das Anlegen von dynamischen Objekten zum Anlegen von weiteren dynamischen Objekten führt. Andere Applikationen sind vermutlich nicht betroffen.
Hinweis: Das selbe gilt genauso für das Löschen von dynamischen Objekten, auch hier gibt es 3 Benachrichtigungen.
Es handelt sich um keinen echten Deadlock, da die Blockierung automatisch nach 10 Minuten ohne weitere Probleme aufgelöst wird (Timeout), aber dieser übermäßig große Timeout kann natürlich zu störenden Blockierungen führen.