cli: register event handler first, then do lookup
authorAlexandru Ardelean <aardelean@riverbed.com>
Thu, 5 May 2016 11:03:30 +0000 (14:03 +0300)
committerFelix Fietkau <nbd@nbd.name>
Wed, 12 Oct 2016 18:00:35 +0000 (20:00 +0200)
We seem to be getting timeout for ubus wait_for calls
every now and then.

And it's not reliably reproducible.
Looking at the code the only thing that would look like
a potetntial reason, is that between the ubus_lookup() and
ubus_register_event_handler() calls, there's a very narrow
window where the event would get sent out and we would not
get it, thus having to timeout.

It doesn't look like registering the event handler first
is a big problem for the whole wait_check_object() logic.

Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
cli.c

diff --git a/cli.c b/cli.c
index c5cbfc3bfaa0c84e74eafed64a34c7b9e2cbb3de..080f953179a9ebf208ac7d6d5892abb43d1dee6a 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -293,17 +293,20 @@ static int ubus_cli_wait_for(struct ubus_context *ctx, int argc, char **argv)
        uloop_init();
        ubus_add_uloop(ctx);
 
-       ret = ubus_lookup(ctx, NULL, wait_list_cb, &data);
+       ret = ubus_register_event_handler(ctx, &data.ev, "ubus.object.add");
        if (ret)
                return ret;
 
        if (!data.n_pending)
                return ret;
 
-       ret = ubus_register_event_handler(ctx, &data.ev, "ubus.object.add");
+       ret = ubus_lookup(ctx, NULL, wait_list_cb, &data);
        if (ret)
                return ret;
 
+       if (!data.n_pending)
+               return ret;
+
        uloop_timeout_set(&data.timeout, timeout * 1000);
        uloop_run();
        uloop_done();