[systemd-devel] dbus-1/kdbus - question about 'queued owners'

Daniel Mack daniel at zonque.org
Mon Apr 13 04:46:26 PDT 2015


Hi Lukasz,

[+dbus ML]

On 04/10/2015 04:20 PM, Lukasz Skalski wrote:
> Currently I'm working on some testsuite (let's call it dbus1-spec-test)
> for dbus-1 specification. My idea is to test dbus-1 specification
> coverage on systems with dbus-daemon and on systems without dbus-daemon
> (but with latest systemd, bus-proxyd and kdbus) which will allow us (and
> all userspace apps) to smoothly switch to kdbus. First results of tests
> are really good:

Nice, thanks a lot for doing this!

> My testsuite have found only one inconsistency between dbus-1 and
> kdbus-enabled system. Problematic testcase (this one tests rather some
> dbus-daemon/bus-proxyd behaviors than specification) is as follow:
> 
> test_request_name_6 (void)
> {
>   GDBusConnection *connection_a;
>   GDBusConnection *connection_b;
> 
>   BusRequestNameFlagsReply request_reply;
>   BusReleaseNameFlagsReply release_reply;
> 
>   /* connect and set up two D-Bus client connections */
>   connection_a = connect_to_bus();
>   connection_b = connect_to_bus();
> 
>   /* 'connection_a' - synchronously acquire name on the bus */
>   request_reply = request_name (connection_a, "org.my.busname",
>                                 DBUS_NAME_FLAG_REPLACE_EXISTING |
>                                 DBUS_NAME_FLAG_DO_NOT_QUEUE);
> 
>   /* 'connection_a' should be primary owner */
>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
> 
>   /* 'connection_b' tries to own the same well-known name */
>   request_reply = request_name (connection_b, "org.my.busname",
>                                 DBUS_NAME_FLAG_REPLACE_EXISTING);
> 
>   /* 'connection_b' should be appended to the queue */
>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);
> 
>   /* once again 'connection_b' tries to own the same name */
>   request_reply = request_name (connection_b, "org.my.busname",
>                                 DBUS_NAME_FLAG_REPLACE_EXISTING);
> 
>   /* and once again we should get the same return code */
>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);

The D-Bus spec isn't totally clear about the return code here, but it is
about what should happen:

"If replacement is not possible, *and the method caller is currently not
in the queue*, the method caller is appended to the queue."

dbus-daemon seems to return IN_QUEUE to inform the caller that the name
is in the queue, no matter if the call it replies to was responsible for
creating the queue entry or if that was already the case.

>   /* 'connection_a' releases name */
>   release_reply = release_name (connection_a, "org.my.busname");
>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_RELEASED);
> 
>   /* 'connection_b' (now primary owner) also release name
>   release_reply = release_name (connection_b, "org.my.busname");
>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_RELEASED);
> 
>   /* 'connection_b' tries to release once again the same name */
>   release_reply = release_name (connection_b, "org.my.busname");
> 
>   /* This assert is source of failure - what we should get
>      here: REPLY_RELEASED or NON_EXISTENT ? */
>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_NON_EXISTENT);

As per the spec, the same connection can only be queued up once for a
given well-known name, so the correct error code should be NON_EXISTENT.

> Which solution, kdbus or dbus-daemon, do it correctly?

kdbus is wrong here IMO. The kernel patch you sent me offlist looks
resonable. Care to rebase and post it to LKML?


Thanks,
Daniel



More information about the dbus mailing list