Merlijn,

You are correct, the order of handlers is undetermined, so it is entirely
possible for the execution order to be: handler1, handler2, handler3,
handler2.

The predicates, including the @when_changed test, will be checked again
after each round of dispatch, so handler2 should definitely be called again
after handler3.  If you're not careful, this can lead to inefficiencies in
your charm, which has been discussed previously here, and on issues on the
charms.reactive repo (
https://github.com/juju-solutions/charms.reactive/issues).  Stuart Bishop,
in particular, has raised several very good concerns about ensuring
intelligent handling of expensive operations such as apt-get calls or
service restarts, when dealing with constructs such as these.

While checking the code to verify my answers here, I realized that the
logic for managing re-invocation of state handlers (so that, e.g.,
@when('A') doesn't just keep matching and executing over and over in a
given hook invocation, while still allowing it to run again if the A state
changes) will override non-state predicates such as @when_file_changed.
That means that if you combine @when and @when_file_changed, handler2 might
*not* get reinvoked the second time (at least not until the next hook).  I
opened https://github.com/juju-solutions/charms.reactive/issues/49 to track
this.

There are also a couple of other open issues regarding @when_file_changed
that you should be aware of:
https://github.com/juju-solutions/charms.reactive/issues/25
https://github.com/juju-solutions/charms.reactive/issues/44

I'm still not sure what the right solution for these issues is, so input on
those is welcome.

On Thu, Jan 28, 2016 at 9:55 AM, Merlijn Sebrechts <
merlijn.sebrec...@gmail.com> wrote:

> Hi Cory
>
>
> I have a question about the reactive handlers. How exactly do
> when_file_changed handlers get dispatched? Consider the following:
>
>
> @when('init')
> def handler1():
>     change_file('file1')
>     set_state('A')
>
> @when_changed('file1')
> def handler2():
>     restart_service()
>
> @when('A')
> def handler3():
>     change_file('file1')
>
>
> The order in which handlers are dispatched is random afaik, so there is
> the possibility that handler2 is executed before handler3. This would mean
> file1 is changed again after executing handler2. Will handler2 be executed
> again?
>
>
>
> Kind regards
> Merlijn Sebrechts
>
>
>
>
-- 
Juju mailing list
Juju@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/juju

Reply via email to