On 16.03.2015 22:25, Didier Kryn wrote:
I had not caught the point that you wanted it a general purpose
tool - sorry.
It's a lengthy and complex discussion, not very difficult to miss
something, so no trouble. Please ask, when there are questions.
The netlink reader is a long lived daemon. It shall not exit, and
handle failures internally where possible, but if it fails, pure
restarting without intervening other action to control / correct the
failure reason, doesn't look as a good choice. So it needs any higher
instance to handle this, normally init or a different system
supervisor program (e.g. inittab respawn action).
OK, then this higher instance cannot be an ordinary supervisor,
because it must watch two intimely related processes and re-spawn both
if one of them dies. Hence, it is yet another application. This is why I
thought fifosvd was a good candidate to do that. Also because it already
contains some supervision logic to manage the operation handler.
Supervision is a system depended function, which differs on the
philosophy the init process is working and handles such things. So
before we are talking about which supervision, we need to tell, which
type of supervision you are using, that is mainly which init system you use.
So, if fifosvd is a general usable tool, it must come with a
companion general usable tool, let's call it fifosvdsvd, designed to
monitor pairs of pipe-connected daemons.
A pipe is an unidirectional thing. Writing a program, sitting at the
read end of a pipe, to watch the other side is logical mixing of
functions, but ...
Where as the device operation handler (including conf parser) is
started on demand, when incoming events require this. The job of the
fifosvd is this on demand pipe handling, including failure management.
2) fifosvd would never close any end of the pipe because it could
need them to re-spawn any of the other processes. Like this, no need for
a named pipe as long as fifosvd lives.
Dit you look at my pseudo code? It does *not* use a named pipe (fifo)
for netlink operation, but a normal private pipe (so pipesvd may fit
better it's purpose). Where as hotplug helper mechanism won't work
this way, and require a named pipe (different setup, by just doing
slight different startup).
Yes, but it cannot work if the two long-lived daemons are
supervised by an ordinary supervisor. Because one end of the pipe is
lost if one of the processes die, and this kind of supervisor will
restart only the one which died.
... you are wrong. When the netlink process dies, the write end of the
pipe is automatically closed by the kernel. This let at first the
handler process detect, end-of-file when waiting for more messages, so
that process exits. fifosvd then checks the pipes and gets an error,
telling the pipe has shutdown on the write end, so fifosvd does the
expected thing, it exits too.
Even if that exit may be delayed somewhat, it does not matter, when the
higher instance respawns the hotplug system due to the netlink exit. The
new pipe will be established in parallel, while the old pipe (including
processes) vanish after some small amount of time.
That is your supervision chain is slight different:
- netlink is supervised by the higher instance, but itself watches for
failures on the pipe (in case the read end dies unexpectedly)
- the supervision of the pipe read side is a bit complexer, as we use an
on demand handler process, so we have two different cases: a handler
process is currently active or not:
- when no handler process is active, fifosvd detects a pipe failure of
the write end immediately and just exit. So there is no need of
supervision, only some resources have to be freed
- when there is an active handler process, this process is supervised by
fifosvd, but itself checks for eof on the pipe, and exit. Meanwhile
waits fifosvd for the exit of the handler process and checks the exit
status (if successfull or any failure). Nevertheless which way fifosvd
takes, at the end it detects, the write end of the pipe has gone and
takes his hat.
so supervision chain is:
init -> netlink -> fifosvd -> handler
At some point you considered that the operation handler might be
either long-lived or dieing on timeout. I suggest that the supervision
logic is identical in the two cases.
That was an alternative in the discussion, to show how I got to my
solution and picked up a solution Laurent mentioned. So the
alternatives, show the steps of improving my approach has gone.
I highly prefer this last one (netlink reader the Unix way). It is the
version with the most flexibility, and even addresses the wish, to use a
private pipe and not a named pipe for netlink operation, without adding
extra overhead for that possibility.
Indeed are the alternatives very similar, do the same principal
operation, but move around some code a bit, for different purposes, to
see which impact each alternative may have. They do not implement any
new thing, and it is not intended to implement them in parallel. The
alternatives in this message were all for same usage: hotplug handlig
with netlink reader.
--
Harald
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox