[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH v2 15/24] servmgr: Workaround für zyklische Abhängigkeiten



On Sun, Dec 13, 2015 at 01:11:00AM +0100, Max Reitz wrote:
> ! Es kann passieren, dass Service A auf B wartet, der auf C wartet. Dann
>   melden sich diese beide beim servmgr, der dann für B darauf warten
>   soll, dass B gestartet ist,

Ich glaube, du meinst "dass C gestartet ist"

> und für A, dass B fertig ist. Da týndur
>   leider keine Popupthreads für IPC benutzt, existiert aber nur ein
>   wartender Thread. Wenn A später als B angefragt hat, wird also A ewig
>   auf B warten, da B nie weiterlaufen kann, auch wenn C fertig ist.

Das entscheidende Problem ist, dass rpc_needserv() nicht asynchron
programmiert ist, sondern eine Busywait-Schleife aufruft. Dafür muss
dann natürlich die innere Schleife zuerst fertigwerden bevor die äußere
wieder zum Zug kommt. Die innere Schleife ist diejenige des späteren
Aufrufs, die Commitmessage hat das also meines Erachtens falschrum.

>   Ein einfacher Workaround ist es, zu einem Zeitpunkt immer nur einem
>   anfragenden Service/Prozess das Privileg zu gestatten, den servmgr
>   selbst zu benutzen, um zu warten. Alle anderen bekommen ein EAGAIN,
>   wenn der Zielservice noch nicht angemeldet ist, und müssen das Warten
>   selber übernehmen (hier als wiederholte Anfragen bei servmgr
>   implementiert).
> 
> Signed-off-by: Max Reitz <max@xxxxxxxxxx>

Der Fix ist kaputt weil Busywait, aber das ist die Implementierung von
servmgr eh auch schon und von daher ist funktionierend kaputt vielleicht
vorzuziehen und der Patch so gesehen in Ordnung.

Der richtige Fix wäre es, den servmgr-RPC-Handler asynchron zu machen.

Kevin