Restarting siblings vs. restarting nieces

Christian Helmuth christian.helmuth at genode-labs.com
Fri Jan 27 13:22:43 CET 2023


Hello Sid,

On Wed, Jan 25, 2023 at 16:23:34 CET, Sid Hussmann wrote:
> └── init
>    ├── fs
>    │   ├── init
>    │   │   └── rump
>    │   ├── fs_mgr
>    │   └── report_rom
>    ├── fs_client1
>    └── fs_client2
> ```
> Now to my observation:
> 
> When I restart `fs` by incrementing its version attribute in the deploy
> file, `fs`, `fs_client1`, and `fs_client2` all get restarted. That is
> what I would expect.
> 
> However, the behavior is different when I instrument the `fs_mgr` to
> restart `rump`. Most of the time, both `fs_client1` and `fs_client2`
> don't seem to notice.
> 
> Is this behavior by design? Is `init` designed to behave differently
> regarding client/server dependency when siblings get restarted vs. when
> a niece is restarted?

The observed behavior is as intended. "init" is ruled by its
configuration only. So, if a version update of a component's start
node or the change of a routing policy directs a restart, it happens.
On the other hand, "init" is not ruled by its children, in fact it
doesn't even care about grand-children restarting like in your
example. This design adheres to the principle of least
surprise/astonishment and supports the expectation of a
developer/integrator that init children are dominated by the given
configuration only and do never magically disappear or do other funny
stuff.

> Is there a way to instrument `fs_mgr` to write an `init` config, so that
> `fs_client1` and `fs_client2` get restarted?

The explanation above reflects the strictness of "init" as a tool, but
does not mean your system design cannot utilize it for your desired
purpose. Let us just rephrase

  instrument `fs_mgr` to write an `init` config

in your sentence above to

  implement fs_mgr to report a state

In this light, your domain logic (implemented in a component beside
"init") is then in the position to incorporate the fs_mgr report in
its decision to change the init configuration and restart fs_client1/2
appropriately. Beyond dispute, this component is quite powerful and
also affected by information originating in descendants of the
controlled "init". But, your design requires a component in charge for
this purpose and Genode enables you to implement it with minimal
complexity by just monitoring some ROMs and reporting an updated
init/deploy config. In a way, Sculpt manager is such a component too
but implements what we desired Sculpt to work like.

> Granted, I observed this in a more complex scenario. I once had the
> following errors when restarting `rump` on `arm_v8a/base-hw`:
> 
> ```
> Kernel: init -> init -> fs_client1 -> ep: cannot send to unknown recipient
> ...
> Kernel: Cpu 0 error: re-entered lock. Kernel exception?!
> ```
> 
> Would it make sense for me to create a simplified scenario of it to dig
> into this behavior further?

I'd like to ask you to repeat your tests with our current master
branch as we addressed some issues in base-hw that could be related to
this.

Best regards
-- 
Christian Helmuth
Genode Labs

https://www.genode-labs.com/ · https://genode.org/
https://twitter.com/GenodeLabs · https://genodians.org/

Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth



More information about the users mailing list